network security 요구조건
- confidentiality 기밀성 : sender와 receiver 외에는 message를 몰라야 한다. 암호화
- authentication : 내가 대화하는 대상이 내가 생각하는 대상이 맞는지 확신이 있어야 한다.
- messag integrity : 중간에 메세지 변형이 없이 전송되어야 한다.
- access and availability : 서비스 제공자는 24시간 사용자들에게 서비스를 제공할 수 있어야 한다. 서비스를 못하게 하는 디도스같은 공격으로부터 안전해야 한다.
이러한 중요한 보안 요구조건들이 인터넷 계층구조에 전혀 들어있지 않다.
Alice와 Bob의 대화를 Trudy가 공격하는 상황을 생각하자.
wireshark 같은 애플리케이션을 사용하면 ip pkt의 헤더, tcp pkt의 헤더, plain text 형태의 application data까지 다 볼수 있다. (https를 사용하면 application data는 hypertext로 암호화되어 보이지 않는다) 즉 src, dst 등에 접근할 수 있다. (tor 같은 툴로 숨길 수 있지만 속도가 느려진다)
국가에서 불허한 접근에 대해 fbi warning이 뜨는 원리를 생각해보자
- 해외 사이트에 접근할 때 해외로 나가는 gateway에서 금지 목록으로 향하는 요청이라면 차단하고 fbi warning 페이지를 반환한다. 하지만 tcp connection을 gateway router랑 맺은게 아닌데 어떻게 warning 페이지를 보내는 것일까?
- proxy서버를 통해 우회할 수 있다. 해외의 어떤 proxy 서버로 요청을 보내고 proxy에서 금지된 페이지로 요청하게 한다.
- 북한, 중국같은 국가에서는 proxy도 금지 목록에 포함시켜 우회도 막고 있다.
원리는 아래와 같다
- gateway router는 tcp 연결을 위한 sin과 sin ack까지는 통과시킨다. 따라서 tcp connection이 맺어진다.
- reqeust 중 blacklist에 해당하는 dest로의 request를 drop하고 response를 직접 만든다. 이 때 src를 blacklist의 ip로 한다. data에 fbi waring page를 담아 보낸다.
- blacklist와의 tcp connection은 timeout에 의해 끊긴다.
- router가 firewall 역할을 한다.
language cryptography
- trudy가 중간에서 message를 봐도 알아채지 못하게 바꿔서 보내야 한다. 이것을 암호화(encryption)이라 하며 key가 필요하다.
- alice가 암호화하면 ciphertext가 된다. Ka(m)
- bob이 복호화하면 다시 plaintext가 된다. Kb(Ka(m)) = m
암호화, 복호화에는 2가지 방법이 있다.
1. Symmetric Key Cryptography
- alice와 bob의 key가 Ks로 동일하다.
- alice와 bob이 Ks를 공유해야 한다. (만나거나, 다른 방법 필요) 이것이 현실적으로 힘들다.
2. Public Key Cryptography
- 모든 사람이 각자 2개의 key를 갖고 있는다.
Kb+ : Bob의 public key, Kb- : Bob의 private key
- alice는 bob을 만나지 않아도 Kb+를 알 수 있다. Kb+로 암호화해서 보내면 그것은 Kb-를 갖고 있는 bob만 풀 수 있다.
- 사전에 alice와 bob이 만날 필요가 없다.
이 방식의 또 다른 특징은 어떤 key를 먼저 적용하던지 간에 결과가 같다는 것이다.
public key 방식은 symmetric key 방식에 비해 overload가 매우 크다. 따라서 public key 방식으로 symmetric key를 공유하고 이후에는 symmetric key를 사용하는 방식을 많이 채택한다.
Authentication
alice가 얘기하는 대상이 bob이 맞는지? trudy가 그대로 재사용할 수 있는 것은 인증에 사용할 수 없다.
- bob이 random number를 보낸다
- alice가 Ka-로 암호화해서 보낸다
- bob이 alice의 public key로 복호화해서 random number가 나오는지 확인한다.
Message Integrity
메세지가 중간에 변형되지 않았는가? 보낸 사람이 작성한 그대로인가.
- bob이 보내고 싶은 메세지를 Kb-로 암호화한다. 이것을 sign 또는 digital signature라 표현한다.
- alice가 Kb+로 복호화했을 때 m이 나오는지 확인한다. m이 나온다면 m이 중간에 변형되지 않았다는 것이다.
- 이 때, 메세지 전체를 암호화하면 overload가 크므로 hash 값을 암호화한다.
- H(m)을 message digest라 한다.
인증서
- public key 방식이 성공하려면 Kb+가 bob의 public key가 맞아야 한다.
- 내가 받아온 key가 trudy의 Kt+라면 내가 암호화 한 메세지를 trudy가 Kt-로 복호화 할 수 있을 것이다.
- 인증서에는 인증 기관과 bob의 public key가 적혀져 있다. 인증서는 인증 기관의 private key로 암호화되어 있다. 인증기간의 public key로 복호화한다.
- 그렇다면 인증기관의 public key는 어떻게 믿을까? 인증서는 믿어야 한다. 쩔수없다.. 보통 브라우저에 hard coded되어 들어가 있다.
SSL
- http는 tcp가 제공하는 기능에 의존한다. tcp는 보안 기능을 제공하지 않는다.
- 이에 대한 임시방편이 SSL이다. SSL은 application layer의 library다. SSL 인터페이스를 통해 메세지를 내려보내면 암호화해서 tcp로 내려간다.
- 실제 layer는 아니지만 layer같아서 이름을 secure socket layer라고 지었다. 요즘은 TLS (transport layer security)라는 이름을 사용한다.
- 왼쪽이 HTTP, SSL을 사용하는 오른쪽이 HTTPS다.
- SSL은 TCP 기반이다. TCP sin, ack 이후의 과정이다.
- 서버는 클라이언트에게 public key 인증서를 준다.
- 인증서에는 서버의 public key가 있다. 이것을 인증기관의 public key로 복호화한다.
- 클라이언트는 서버의 public key를 알게 된다. 따라서 서버와 클라이언트간의 비밀 키를 만들어서 구글의 공개 키로 암호화해서 서버에게 보낸다.
- 이렇게 공유한 비밀 키로 symmetric key 방식을 사용해 소통한다.
이 비밀 key로 모든 소통을 하는 것이 아니라, 비밀 key를 통해 4가지 key를 만든다. 4개의 key가 각각 용도가 있다.
- client->server data를 암호화하는 용도
- client->server로 가는 mac을 만들기 위한 용도(integrity를 체크하기 위함)
- server->client data를 암호화하는 용도
- server->client mac를 생성하는 용도
key 4개를 사용하는 이유는 유출 시 피해를 최소화하기 위함이다.
key를 통해 application message가 들어오면 이런 형태로 만들어 준다.
MAC
- mac은 message authentication code로 서버-클라이언트 간의 비밀 key와 data를 hash function에 넣어서 얻은 값이다.
- H(key|data) = mac
- key를 넣은 이유는 data만 넣으면 data와 hash function 모두 공개되어 있기 때문에 누구나 mac을 만들 수 있게 된다.
- attacker가 data를 건드리더라도 data에 맞는 mac을 만들 수 없어 (key가 없으므로) 들키게 된다.
- 전체적인 구조는 이렇다! SSL RECORD의 DATA와 MAC이 암호화된 구조이다.
- attacker는 key가 없어 data를 읽을 수 없고, 수정할 수도 없다. mac을 만들 수 없기 때문이다.
공격자의 장난을 방지하자
- 공격자는 연속된 SSL RECORD의 순서를 바꾸는 장난을 칠 수 있다.
- 따라서 MAC에는 ssl record의 seq#도 넣어야 한다. 즉 H(key|data|seq#) = mac이 된다.
- 공격자는 메세지가 다 전송된 것처럼 tcp fin을 꾸며 보낼 수 있다
- 따라서 MAC에는 type 정보(끝인지) 도 넣어야 한다. 즉 H(key|data|seq#|type) =mac이 된다. type=1이 와야 마지막으로 간주한다. 그 전에 tcp fin이 온것은 공격으로 간주한다.
실제 SSL은 encrpytion algorithm에 대한 협상 정도가 추가된다.
mac 용 key로 mac을 만들고, data와 mac을 묶어서 data용 key로 한번에 authentication 한다.
복호화할때는 data용 key로 복호화하고 mac용 key로 복호화한다.
firewall
- 하나의 nw의 gateway에서 외부로 나가는 pkt과 들어오는 pkt을 감시하며 통과 여부를 결정한다.
- 대부분의 gateway router에는 firewall이 설치되어 있다.
- 어떤 pkt을 통과시킬지 정책은 nw 운영자가 결정한다.
- firewall은 tcp header까지 관여한다.(port#) 따라서 layer violation에 해당한다. router에서는 ip까지만 봐야 하기 때문이다.
- firewall의 access control list는 이런 식이다. 맨 위부터 우선순위를 갖고, 조건에 해당되면 action을 수행한다.
- 1,2행은 HTTP request response, 3,4행은 DNS다. 나머지는 막았다(5행)
- 실제로는 모든 tcp connection을 tracking하고 tcp connection이 있는 pkt에 대해서만 허용한다. tcp connection 없이 공격자가 pkt을 만들어서 보낼 수 있기 때문이다.