Search

'embedded 보안'에 해당되는 글 3건

  1. 2017.06.19 SSL/TLS embedded for IoT #7
  2. 2017.06.17 SSL/TLS embedded for IoT #6
  3. 2016.12.27 SSL/TLS for embedded IoT #1

SSL/TLS embedded for IoT #7

Embedded SSL 2017.06.19 17:00 Posted by Dwarp

SSL/TLS embedded for IoT


이 글은 embedded IoT device의 보안에 관한 글입니다.


embedded SSL/TLS 일곱번째입니다.



다시 달려 보겠습니다.(뭐 물론 저 혼자만의 느낌이지만.. ㅠㅠ)


저번시간에 만들어야할 함수 목록들이 있었습니다. 7개 정도? 있었지요? 한 번 만들어 봅시다. 물론 mbedTLS configuration 등 신경써야 할 부분이 많습니다. 하지만 장담하건데 시작하시기도 전에 지치실 수 있습니다. 그러니 아무 생각 말고 걱정 말고 따라 오셔요 ㅎㅎ.


아래가 만들어야 할 함수 목록 이라고 말씀드렸습니다. 사실 안만드셔도 됩니다. 하지만 사용하시려면 결국 만드실 겁니다. 


wiz_mbedtls_ssl_init();

wiz_mbedtls_ssl_deinit();

wiz_mbedtls_ssl_handshake();

wiz_mbedtls_ssl_random();

wiz_mbedtls_ssl_send();

wiz_mbedtls_ssl_recv();

wiz_mbedtls_ssl_recvtimeout();


자 그럼 뭐부터 할까요? 전 언제나 가장 쉬운 것부터 합니다. 가장 기본적인 send와 recv 함수부터 만들어 보도록 하겠습니다. 이 함수는 매우 간단합니다. recv와 send를 할 수 있는 network interface를 정의하는 부분이어서 mbedTLS 형식에 맞게 ioLibrary를 포팅하면 됩니다. 코드를 먼저 보시는게 편할 것 같습니다. 아래가 해당 코드입니다. 기존의 ioLibrary에서 제공한 send함수와 recv 함수를 이용해 mbedTLS가 사용하는 형식이 맞추어 한번 싸준 것 뿐입니다.

int wiz_mbedtls_ssl_send(void *ctx, const unsigned char *buf, unsigned int len )
{
	while(getSn_TX_FSR(*((int *)ctx)) < len && len < getSn_TxMAX(*((int *)ctx))){};
	return send(*((int *)ctx),(uint8_t*)buf,len);
}

int wiz_mbedtls_ssl_recv(void *ctx, unsigned char *buf, unsigned int len )
{
      return (recv(*((int *)ctx),buf,len));
}

여기서 ctx는 read,write callback이 공유하는 parameter(context)라고 설명되어 있는데 그냥 socket 번호라고 생각하시면 됩니다. 자 벌써 2개 끝났습니다. 그럼 recvtimeout도 해볼까요? 뭐 어렵겠어요? recv와 똑같지만 timeout이 발생하면 error를 return하면 됩니다. 아래는 코드입니다.

int WIZnetRecvTimeOut(void *ctx, unsigned char *buf, unsigned int len, unsigned int timeout)
{
	uint32_t startTick = HAL_GetTick();
	unsigned int ret;
	do
	{
		if(getSn_RX_RSR(*((int *)ctx))){
			return recv(*((int *)ctx),buf,len);
		}
	}while((HAL_GetTick() - startTick) <= timeout);
	return MBEDTLS_ERR_SSL_TIMEOUT;
}

어때요? recv와 기본적으로 동일하지만 timeout 값을 인자로 하나 더 받아 HAL_GetTick()에 의해 timeout이 발생하면 MBEDTLS_ERR_SSL_TIMEOUT 이라는 에러를 반환합니다. 엄청 간단하죠? 이 역시 mbedTLS가 요구하는 형식입니다.


여기까지는 크게 어려움이 없는 것 같습니다. 그러면 그 다음으로 간단한 random()을 보겠습니다. 요기서부터는 약간 생각해 볼만한 여지가 있습니다. mbedTLS의 callback으로 등록해야 하는 함수의 원형을 보면 다음과 같습니다.


void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );

여기에서 f_rng에 함수포인터로 등록을 시켜줘야 하는데 해당 함수를 또 찾아가면 p_rng를 f_rng의 첫번째 인자로 사용합니다. mbedTLS의 예제를 보면 더욱 혼란스러워집니다. ㅎㅎㅎ drbg라는 context를 넣는데 해당 변수는 AES 기반의 random을 만들어내는 context로 보이거든요. 그래서 다시 오기를 부려 찾아봤습니다. 그럼 f_rng가 등록이 안되어 있으면 p_rng를 사용할까요? 그건 또 아니었습니다. f_rng를 등록하지 않으면 에러는 아니지만 MBEDTLS_ERR_SSL_NO_RNG 이라는 error를 리턴합니다. 그리고 p_rng는 random의 seed도 아닙니다. 그냥 변수의 포인터이므로 seed로 사용하시면 안됩니다.!!!!

어쨌든 결론은 f_rng를 반드시 등록해야만 한다! 입니다. p_rng의 용도는 아직 저도 더 연구가 필요한 것 같습니다. 아무튼 용로를 잘 모르겠으니 무시하고 rand 함수를 감싸도록 하겠습니다.

int wiz_mbedtls_ssl_random( void *p_rng, unsigned char *output, size_t output_len )
{
    int i;

	if(output_len <= 0)
	{
         return (1);
	}
    for(i = 0;i < output_len;i++)
    {
       *output++ = rand() % 0xff;
	}
    srand(rand());
	return (0);
}


그냥 간단하게 코딩했습니다. 하지만 이렇게 하면 안된다는 걸 여러분들은 알고 있지요~~~?????네 그렇습니다. 원칙적으로는 true random을 넣어야 하는데 그렇지 않으면 random의 페턴이 확인 가능합니다. 그러면 보안성이 떨이지겠죠? 그래서 MCU Pin 하나를 open시킨 상태로 Analog input으로 설정한 후 rand() 함수의 seed로 활용하는 분들도 계십니다. Pin을 open시킨 상태로 Analog 값을 측정하면 값이 계속 흔들리거든요.(사실 이 방법이 random에 완벽한 대응이 되는지는 저도 잘 모르겠습니다. 이론적으로 더 확실한 방법을 찾으면 별도로 포스팅하겠습니다.)


휴~ 그림 한장없이 진행하려니까 힘드네요.


<우워워워워워어 한가인!!!! 사랑해요 한가인! ㅠㅠ 유부녀 히잉>


한가인 사진을 보내 설레여서 더 이상 못 쓰겠습니다.


그리고 사실 초기화와 핸드쉐이크 부분은 조금 까다롭기 때문에 다음 시간에 이어서 하겠습니다. 오늘은 여기까지만 하시구요. 여러분들은 보는데 10분이지만 저는 작성하는데 반나절씩 걸립니다. ㅠㅠ 히잉


암튼 다음 강의도 너무 많이 기다리시지 않게 되도록 빨리 올리도록 하겠습니다.


월요일이네요 한주 화이팅 하세요.

저작자 표시
신고

'Embedded SSL' 카테고리의 다른 글

SSL/TLS embedded for IoT #8  (0) 2017.06.27
SSL/TLS embedded for IoT #7  (0) 2017.06.19
SSL/TLS embedded for IoT #6  (0) 2017.06.17
SSL/TLS embedded for IoT #5  (0) 2017.06.16
SSL/TLS embedded for IoT #4  (0) 2017.06.15
SSL/TLS embedded for IoT #3  (6) 2016.12.28

SSL/TLS embedded for IoT #6

Embedded SSL 2017.06.17 17:19 Posted by Dwarp

SSL/TLS embedded for IoT


이 글은 embedded IoT device의 보안에 관한 글입니다.


embedded SSL/TLS 여섯번째입니다.



너무 몰아붙이나요? ㅎㅎ 아니겠죠 ㅎㅎ 저만 ㅠㅠ 여러분들은 시간날 때 보면 되니까 ㅠㅠ 암튼 전 주말이지만 기다리시는 분들이 계셔서 계속 진행합니다. 오늘은 W5500 iolibrary와 mbedTLS를 이어 붙이는 시간이 될 거에요. 하지만 그 전에 SSL/TLS라는 게 서버든 클라이언트든 있어야 하잖아요?


또 그러기 위해서는 뭔가... 그 뭐냐... 그그그그그.... Application!이 있어야 하겠죠? 제가 건망증이 좀 있습니다. 양해 좀 ㅎㅎ


우리가 지금 IoT 하고 있잖아요? 그래서 네트워크 어플리케이션으로 MQTT를 정하겠습니다. MQTT는 뭐냐고요? 그건 뭐..... IoT에 특화된 네트워크 프로토콜입니다. 찾아보시면 금방 자료 나와요. 전 라즈베리파이에 MQTT 서버를 SSL 모드로 열어놨습니다. 특별한 문제가 없으면 오픈해 놓으려고 하니 테스트 해보셔요. 아래는 제가 open 해놓은 MQTT Broker(서버) 주소 입니다.


<라즈베리 파이>


IP: 222.98.173.239

Port 일반 TCP: 1883

Port 보안 TCP: 1884

Port 일반 websocket: 8883

Port 보안 websocket: 8884


** 경고!!!!!!!! 아시겠지만 테스트 용도로만 사용하시고 상업적인 용도로 사용하지 마세요. 제가 손해봐서 그러는게 아닙니다. 여러분들이 고생합니다. ㅠㅠ 사전 경고 없이 서버가 꺼지거나 할 수 있는데 정작 저는 모를 수 있어요.



<제 책상의 라즈베리파이 MQTT 서버 - 언제나 꺼질 지 모르는 완벽한 불안정 속에 위치해 있다.>


** 리눅스에 MQTT 서버 설치/Open SSL 인증서 만드는 법 등 요청하시면 따로 포스팅 하겠습니다.


자 그럼 다시 코드로 넘어가겠습니다. mbedTLS와 관련하여 만들어야 할 함수가 존재하겠죠? 근데 뭐가 필요하죠? mbedTLS 코드를 다운로드 받으면 여러 예제가 있긴 하지만 보고 있으면 괴롭기만 할 뿐입니다. 괴로운건 ㅠㅠ 제가 이미 봤으니까 여러분들은 핵심만 가져가세요. (왜 남 좋은 일 하냐구요? 뭐 고마운신 분들은 댓글 주세요. 계좌번호 드릴테니까 돈 좀 주세요. 아니면 연봉 1억쯤 주시고 데려가서 노예로 쓰시면 됩니다.)


자! 쓸데없는 소리 그만하고 만들어야 할 함수를 설명하겠습니다.


wiz_mbedtls_ssl_init();

먼저 SSL이라고 피해갈 수 없겠죠? 초기화를 해야만 합니다. 각종 메모리 할당, callback 등록 등의 과정이 들어 있을 겁니다.


wiz_mbedtls_ssl_deinit();

뭐 이건 초기화의 반대네요. mbedtls가 malloc/free를 쓰는 이상 리소스 관리를 하지 않을 수가 없겠죠? init가 malloc을 했다면 deinit은 free를 주로 하겠네요.


wiz_mbedtls_ssl_handshake();

handshake를 처음에 설명드렸는지 안했는지 기억이 안납니다. ㅎ 암튼 SSL은 암호화된 통신을 하기 전에 서버와 클라이언트 사이의 암호화 방법을 결정하고 인증서를 교환하는 등의 과정을 거칩니다. 이 과정을 handshake라고 부르는데요 이 과정도 약간 프로그래밍을 해줘야 합니다. 대놓고 mbedtls_ssl_handshake()라는 함수를 사용해도 되지만 전 일단 감싸주려고 합니다. 처리해야 할 것도 약간 있구요.


wiz_mbedtls_ssl_random();

거의 모든 보안 알고리즘들은 난수를 필요로 합니다. 완벽한 난수일 수록 좋지요. 어쨌든 mbedTLS도 random 함수를 callback으로 묶어줘야 합니다. 없으면 기본적으로 내장된 rand()함수를 사용하게 프로그래밍 되어 있겠지만 음.. analog 입력을 받아(open 상태로) 그거라도 SEED를 줘서 rand()를 돌리는 게 훨씬 좋을 것 같습니다.


wiz_mbedtls_ssl_send();

기본적인 send()라고 보시면 됩니다. 일반적인 socket프로그램을 사용하면 mbedtls option질로 안 만들어도 되는 함수가 되겠지만 iolibrary는 일반적인 socket 프로그래밍 방식과는 약간 차이가 있기 때문에 iolibrary의 send를 한 번 감싸준 함수입니다.


wiz_mbedtls_ssl_recv();

wiz_mbed_ssl_send() 함수와 같은 역할입니다. 기본적인 recv함수 입니다.


wiz_mbedtls_ssl_recvtimeout();

동작은 wiz_mbedtls_ssl_recv와 같지만 time out 값을 지정해 시간내 응답이 없으면 TIME_OUT ERROR를 발생시키기 위한 목적입니다. wiz_mbedtls_ssl_recv와 wiz_mbedtls_ssl_recvtimeout 둘 중 하나만 콜벡으로 등록하면 된다고 기억하고 있지만 어쨌든 둘 다 만들어 봅시다.


아~~ 오늘은 토요일이라서 하기 싫다~~~ 그냥 소주나 한잔 먹고 싶다~


그래서 오늘은 이만 여기까지 쓰겠습니다. ㅎㅎ 다음 시간에는 함수 구현해 봅시다~~


안녕~

저작자 표시
신고

'Embedded SSL' 카테고리의 다른 글

SSL/TLS embedded for IoT #8  (0) 2017.06.27
SSL/TLS embedded for IoT #7  (0) 2017.06.19
SSL/TLS embedded for IoT #6  (0) 2017.06.17
SSL/TLS embedded for IoT #5  (0) 2017.06.16
SSL/TLS embedded for IoT #4  (0) 2017.06.15
SSL/TLS embedded for IoT #3  (6) 2016.12.28

SSL/TLS for embedded IoT #1

Embedded SSL 2016.12.27 14:57 Posted by Dwarp

SSL/TLS embedded for IoT


이 글은 embedded IoT device의 보안에 관한 글입니다.


SSL/TLS는 근래에 광범위하게 사용되는 암호화 방식입니다. 여기서 주저리 주저리 설명하는 것보다 제가 SSL 공부할 때 유용하게 방문했던 사이트 주소를 가르쳐 드릴게요.


https://wiki.kldp.org/HOWTO/html/SSL-Certificates-HOWTO/x70.html


어디서 사용되냐구요? 보통은 웹브라우저에서 많이 사용됩니다. 일반적으로 SSL이 적용된 사이트는 "http://"가 아닌 "https://"를 사용합니다. 그리고 SSL이 인증된 사이트는 크롬에서는 주소창 맨 앞에 녹색 자물쇠 모양이 표시되고 익스플로러에서는 주소 끝에 자물쇠 모양이 표시됩니다.


크롬 브라우저


익스플로러 브라우저


이렇게 표시된 사이트는 여러분들이 자료를 입력하고 전송해도 암호화되어 있어 볼 수가 없죠.

(보안이 적용되지 않은 사이트는 굳이 해킹을 하지 않더라도 외부에서도 쉽게 볼 수 있습니다. ^^)


암튼 요세 IoT 붐이 슬슬 불고 있는데 여기에도 보안이 중요하겠죠? IoT 기기 해킹 사례가 늘고 있으니까요.


IoT에 적용할만한 보안은 사실 SSL뿐이 없습니다. 왜냐하면 거의 모든 서버가 SSL 보안을 필요로 하니까요. AWS에도 Asure에도 Google cloud에도 SSL은 "필수"입니다. 그러면 어떻게 IoT Device에 SSL을 적용할 수 있을까요?


간단합니다. SSL은 그냥 프로그램이니까요 프로그램을 올리면 됩니다. 말이 쉽지 embedded에서 보안을 적용하는 것이 그다지 쉬운 작업은 아닙니다. 그래서 여러분들이 헤메지 않도록 차근차근 기술적으로 접근하려고 합니다.


너무 길게 글을 쓰면 지루하니까 쪼개서 여러 개의 글로 순서대로 올리도록 하겠습니다.


다음에는 이런 서론 말고 embedded ssl 용 소스 다운로드 부터 찬찬히 업로드하도록 하겠습니다.


그럼 이만..


저작자 표시
신고

'Embedded SSL' 카테고리의 다른 글

SSL/TLS embedded for IoT #6  (0) 2017.06.17
SSL/TLS embedded for IoT #5  (0) 2017.06.16
SSL/TLS embedded for IoT #4  (0) 2017.06.15
SSL/TLS embedded for IoT #3  (6) 2016.12.28
SSL/TLS embedded for IoT #2  (0) 2016.12.27
SSL/TLS for embedded IoT #1  (0) 2016.12.27