MACsec 개념부터 설정까지

MACsec에 대해 알아보자

처음 MACsec을 접했을 때, 구글링을 해보았다..

> MACsec(Media access control security)은 L2에 적용하는 암호화 기술로,
> point-to-point 암호화를 제공합니다 어쩌구 저쩌구..

구글링을 해도 위와 같이 어느정도 지식이 있다는 가정하에 쓴 글이 대부분이라, 나같이 초보에게는 한 번에 와닿지가 않았다. 내 신조는 learning by doing이기 때문에,, 뭔가 겪어본(?) 이후에만 추상적인 것이 구체화 되는 것 같다.

그래서 정리해본 MACsec 개념부터 설정까지, 한 큐로 블로깅 해보려고 한다. (틀린 부분 있으면 지적 압도적 감사!)

우선 위 구글링에서 나오는 L2는 OSI 7계층의 밑에서 2번째 layer인 data link layer를 뜻한다. 전선으로 연결하는 L1(Physical layer)이 전기적 신호를 bit단위의 디지털 신호로 변환하고 전달하는 역할이라면, 상위 레이어인 L2에서는 host와 host간 전송될 패킷의 데이터 포맷과 데이터 전송 자체에 목적을 둔다.

따라서 MACsec은 통신하고자 하는 두 peer간 패킷에 대한 암호화 여부, 데이터 무결성, 통신 상대방에 대한 신원을 확인할 authenticity에 대한 여부를 설정하고, 그 설정에 맞는지 책임지는 프로토콜이다.

그래서 MACsec을 왜 써야하는 건지? 다른 옵션들과 비교를 통해 알아보자

MACsec vs TLS

TLS는 Transport layer(L4)~Application(L7)에서 두 peer간 데이터 무결성과 privacy를 지원한다. 굳이 privacy라고 얘기하는 이유는, TLS는 peer끼리의 통신을 확보하기 위해 개별로 셋업이 필요하기 때문이다. 피어가 2개이면 인증서는 1개(server certificate), TLS handshake는 1번 필요하지만, 피어가 3, 4개면 다음과 같이 통신을 확보하기 위한 오버헤드가 MACsec에 비해 확 늘어난다.

MACsec은 certificate도 handshake도 필요없다. 왜 MACsec에서 certificate가 안쓰이냐면, TLS는 통신 개별 세션마다 개별 암호화키를 통해 암호화를 적용되지만(그래서privacy를 보증한다고 함), MACsec은 노드(물리적 디바이스)간 이루어진 한 쌍의 통신에서 하나의 키로 생성하고 싶은 세션별로 필요한 새 키를 유도하여 사용할 수 있기 때문이다.

물론 MACsec과 TLS를 비교하는 것은 서로 다른 OSI 계층에서 맡은 역할이 다른 것을 확인하는 것으로 그쳐야지, 같은 계층에서의 비교가 아니기 때문에 뭐가 더 낫다라고 말 할 순 없다.

MACsec vs IPsec

TLS에서 한 계층 내려가면 IP layer(L3)가 있는데 여기서 적용하는 암호화 기법이 IPsec이다. IPsec은 TLS의 단점인 다수 연결에 대한 오버헤드(인증서, TLS handshake)가 줄었지만 Macsec에 비교하면, 여전히 복잡도가 높고 패킷에 붙는 오버헤더도 문제다. 또 IPsec은 서로 다른 네트워크 영역, 즉 A subnet과 B subnet간의 통신을 라우터/스위치를 이용해 연결할 때 적용하는 암호화 기법으로 MACsec과는 사용처가 다름을 인식해야한다. IPsec의 활용처를 SW적으로 풀어 설명하면, IPsec은 IP address를 통해 접근하는 통신에 적용되는 암호화 기법이다. (참고: 같은 subnet 안에서는 MAC address를 통해 통신한다)

자동차에서 IPsec을 사용하는 경우는 CANoe 혹은 사용자 PC를 통해 exposed domain에 해당하는 ECU로 접근할 때가 될 것 같다. (본 적은 없음.., 보통 SSH로 ECU에 접속하는거 같은데)

MACsec

TLS의 문제점(통신 객체가 늘어날 수록 리소스가 기하급수적으로 증가), IPSec의 구조(IP address를 이용하는 통신에서 사용)를 살펴보았으니 이제 MACsec을 설명할 수 있을 것 같다. MACsec의 활용처는 같은 subnet, 즉 LAN(Local Area Network)에서 MAC 주소 기반 통신을 하는 곳에 사용된다. 즉 무선 통신에서 쓰이진 않고 유선 통신에서만 쓰인다고 볼 수 있다. (이러니 자동차 회사들이 관심을 가질 수 밖에)

도식화하면 Host1이라는 ECU A와 Host2라는 ECU B가 switch를 통해 연결되어 있는데 이 연결된 부분을 암호화 하는 기법이 바로 MACsec이다. 좀 더 와닿게 말하면, ECU A가 갖고 있는 NIC(network interface card)에 SW적으로 부여한 특정 vlan과 ECU B의 특정 vlan간 구축된 통신 채널에 대한 모든 통신 패킷이 하나의 MACsec key를 통해 암호화 된다고 이해할 수 있다.

MACsec 설정해보기

극적인 효과를 위해 한 공유기에 서로 다른 2대의 PC가 연결된 상태가 준비되어 있다면, 실제 사례와 유사하기에 최상이지만, 없으면 1개의 PC에서 alice와 bob을 역할을 각각 수행해도 된다. 아래 커맨드는 linux OS에서 수행하였다.

  1. 사용가능한 network interface를 확인 한다. Alice와 Bab 둘 (both)에서,
    Both: nmcli
    

    여러 개 뜰텐데 connected to PCI ethernet이라고 되어 있는 녀석 이름을 잘 기억하자. 내 경우 eno가 이 경우에 해당했다. MACaddr도 출력되니 잘 메모해 놓자

  2. MACsec INTERFACE를 생성한다. 처음에는 encrypt off로 해보고 나중에 on으로 바꿔서 진행해보면 이전과는 다르게 payload가 암호화 된 것을 볼 수 있다.
    Both: sudo ip link add link eno macsec0 type macsec encrypt off
    
  3. 생성한 interface에 Rx(receiving channel), Tx(transmitting channel)을 생성해준다. Rx와 Tx로 이루어진 한 쌍에 대해서는 SA, SecureAssociation이라고 한다. MACaddr를 웹 상에 공개하고 싶진 않기 때문에, 본 문에서는 가상으로 Bab의 MACaddr는 BB:BB:BB:BB:BB:BB 라고 하고, Alice의 MACaddr는 AA:AA:AA:AA:AA:AA 라고 하자. (실제 사용할 때는 1에서 확인한 MACaddr를 사용하면 된다)
    Alice: sudo ip macsec add macsec0 rx port 1 address BB:BB:BB:BB:BB:BB sa 0 pn 1 on key 01 00112233445566778899aabbccddeeff
    Bab:   sudo ip macsec add macsec0 rx port 1 address AA:AA:AA:AA:AA:AA sa 0 pn 1 on key 01 00112233445566778899aabbccddeeff
    Both:  ip macsec show #Check the current status
    ----------------------------------------------
    Alice: sudo ip macsec add macsec0 tx sa 0 pn 1 on key 01 00112233445566778899aabbccddeeff
    Bab:   sudo ip macsec add macsec0 tx sa 0 pn 1 on key 01 00112233445566778899aabbccddeeff
    Both: ip macsec show #Check the current status
    
  4. MACsec interface 활성화
    Both: sudo ip link set macsec0 up
    
  5. 테스트를 위한 ip address 할당, 아래는 가상의 테스트 ip임으로 같게 하거나 다른 ip로 설정해도 무관
    Alice: sudo ip addr add 192.168.42.1/24 dev macsec0
    Bab:   sudo ip addr add 192.168.42.2/24 dev macsec0
    
  6. 설정한 MACsec interface에서 패킷을 잡기 위해 새로운 터미널 창을 만들고 아래 커맨드 입력
    sudo tcpdump -i any ether proto 0x88E5 -w any_88E5_capture_alice.pcap  #0x88E5는 MACsec을 위한 EtherType
    sudo tcpdump -i any ether proto 0x88E5 -w any_88E5_capture_bab.pcap
    
  7. Alice쪽에서 bab에게 2개의 ping 패킷을 보낸다.
    Alice: ping -I macsec0 192.168.42.2 -c 2
    
  8. wireshark를 이용해 결과 확인, 2에서 encrypt off로 한 경우 PING 메시지라고 wireshark에서 디코딩 되지만, on인 경우 암호화된 값으로 출력되어 디코딩 되지 않는 것을 볼 수 있다.