
IoT 장치를 위한 제로 구성, OTP 기반 방화벽을 구현하는 리눅스 커널 모듈입니다. 사전 공유 키를 사용하여 네트워크 트래픽을 투명하게 인증하고, 프로토콜 수준에서 승인되지 않은 패킷을 차단합니다.
제로 구성 (IoT) 방화벽.
SYNwall은 (현재로서는) 리눅스 커널 모듈로 구축된 프로젝트로, 투명하고 설정/유지보수가 필요 없는 방화벽을 구현합니다.
사용 예시를 보려면 를 참조하세요.
일반적으로 IoT 기기는 중앙 통제를 벗어나 있으며, 저사양 하드웨어, 열악한 환경 조건...그리고 보안 유지에 시간을 할애할 여유가 없습니다.
따라서 IoT 인프라에 패치를 적용하지 못할 수도 있으며, '방화벽 같은' 접근 제어를 유지하는 것이 매우 어려울 것입니다.
아이디어는 분산형 단방향 일회용 비밀번호(OTP) 코드를 생성하여 기기에 대한 네트워크 액세스를 허용하는 것입니다. OTP를 포함하지 않은 모든 트래픽은 폐기됩니다.
누가 액세스해야 하는지에 대한 사전 지식이 필요하지 않으며, 배포를 위해 사전 공유 키(PSK)만 있으면 됩니다. 보호는 네트워크 프로토콜 수준(TCP 및 UDP)에서 구현되므로 애플리케이션 수준에서 완전히 투명합니다.
이 저장소는 리눅스 커널 모듈을 포함하고 있습니다. X86_64, ARM, MIPS 및 AARCH64 아키텍처에서 3.x, 4.x 및 5.x 버전으로 테스트되었습니다.
컴파일을 위해 현재 커널 헤더가 필요하며, 일반적으로 적절한 패키지 관리자로 설치할 수 있습니다. 예를 들어 Debian 계열 배포판에서는:
sudo apt-get install linux-headers-$(uname -r)
그런 다음 컴파일을 실행하면 됩니다:
make
모듈은 일반적인 방법으로 insmod 또는 modprobe를 사용하여 로드할 수 있습니다.
동작을 사용자 정의할 수 있는 여러 매개변수가 있습니다:
일회용 비밀번호에 사용되는 사전 공유 키
psk:
PSK는 32~1024바이트의 시퀀스여야 합니다. OTP의 일부가 되므로 길이는 패킷에 주입되는 OTP의 크기에 영향을 미칩니다. 이 매개변수가 없으면 모듈이 로드되지 않습니다.
UDP 활성화
enable_udp: 0
UDP 프로토콜에 대한 OTP를 활성화/비활성화합니다. 기본값은 비활성화입니다. 1로 설정하면 활성화됩니다. UDP OTP는 패킷이 애플리케이션 수준으로 전달되기 전에 OTP를 제거(모듈에 의해)해야 하므로 통신하는 두 기기 모두에서 모듈이 활성화되어 있어야 합니다. 그렇지 않으면 이상한 동작이 발생할 수 있습니다. UDP 연결 추적은 conntrack 모듈에 의존하므로 이 기능을 사용하려면 해당 모듈을 삽입해야 할 수 있습니다(설치에 따라 다름). 그렇지 않은 경우 커널 로그에 오류가 표시됩니다.
참고: 기본적으로 포트 53(DNS) 및 123(NTP)은 아웃바운드 연결에 대해 블랙리스트에 등록되어 OTP가 추가되지 않습니다. 이를 변경해야 하는 경우 udp_blacklist[] 배열을 찾으십시오. 향후 이에 대한 매개변수를 추가할 예정입니다.
시간 정밀도 매개변수
precision: 10
OTP는 현재 장치 시간으로도 계산됩니다. 참여 장치 간에 시간이 다를 수 있으므로 특정 값으로 시간을 '반올림'하여 시간 차이를 허용할 수 있습니다. 기본값은 10입니다.
정밀도는 2의 거듭제곱으로 표현됩니다(왜 그런지 의문일 수 있지만...성능을 높이고 저사양 장치에 미치는 영향을 낮추기 위한 결정이었습니다):
...
9 -> 1초
10 -> 8초
...
8 미만의 정밀도는 아마 작동하지 않을 것입니다.
정밀도 값을 11 이상으로 높이는 경우 SYNgate_netfilter.c의 MAX_TRASH 값도 함께 높이는 것을 고려하십시오.
아웃바운드 패킷에 대한 OTP 비활성화
disable_out: 0
이 값을 1로 설정하여 아웃바운드 패킷에서 OTP를 비활성화할 수 있습니다. 이 경우 모듈은 OTP가 없는 패킷을 그냥 드롭하지만, 다른 SYNwall 장치와의 통신 메시에는 참여하지 않습니다. 업링크 장치에서 아웃바운드 패킷에 문제가 있는 경우 유용할 수 있습니다.
DoS 보호 활성화
enable_antidos: 0
이 옵션은 1로 설정하여 활성화할 수 있습니다. 설정된 경우 장치에서 OTP 계산을 지정된 횟수(allow_otp_ms 변수, 기본값 1000)로 제한합니다. 이 경우 초당 한 번의 OTP 계산만 허용되어 DoS 공격 시 장치의 CPU 시간을 보존합니다.
IP 스푸핑 보호 활성화
enable_antispoof: 0
기본적으로 IP는 OTP의 일부가 아닙니다. 이로 인해 일부 재전송 공격이 발생할 수 있습니다. 완전히 안전하게 하려면 안티스푸핑 보호를 활성화할 수 있습니다. 장치 간에 NAT가 있는 경우 통신이 중단될 수 있습니다.
경고: 이 작업은 장치에 대한 모든 트래픽을 차단하므로 다른 SYNwall 장치를 사용하거나 원격으로 비활성화(포트 노킹)하는 방법을 알고 있는지 확인하십시오.
sudo insmod SYNwall.ko psk=123456789012345678901234567890123 precision=10 portk=12,13,14,15,16 load_delay=5000 enable_udp=1
SYNwall 저장소:
SYNwall_distrib 저장소:
SYNwall_ATAES132 저장소:
SYNwall_docs 저장소:
모든 것은 매우 낮은 리소스를 가진 저사양 장치에서 사용할 수 있도록 구현되었습니다. 암호 해시로 Quark 해싱을 선택한 이유가 바로 이것입니다. OTP 계산에 의해 추가되는 오버헤드는 일반적인 사용에서 거의 눈에 띄지 않습니다:

반면 많은 트래픽이 장치로 전송될 때 일관된 CPU 절약을 볼 수 있습니다:

보조 도구로, 저장소에는 SYNgate 모듈도 있습니다. SYNgate는 기본 모듈인 SYNwall과 동일한 로직으로 구축되었지만 여러 네트워크와 PSK에 대해 작동합니다. 여러 네트워크 집합(관련 PSK 및 기타 옵션 포함)을 정의할 수 있습니다. 아이디어는 SOCKS 서버에 설치하여 다양한 프로토콜과 목적지에 사용할 수 있도록 하는 것입니다. SYNwall_VM 저장소에는 SOCKS 서버와 모듈이 사전 설치된 시스템을 구축하는 스크립트가 포함되어 있습니다.
SYNgate는 아웃바운드 트래픽에만 작동합니다.
SYNgate 모듈을 컴파일하려면 다음을 사용하십시오:
make SYNGATE=1
모듈은 일반적인 방법으로 insmod 또는 modprobe를 사용하여 로드할 수 있습니다.
동작을 사용자 정의할 수 있는 여러 매개변수가 있습니다. SYNwall 설정과 매우 유사하지만 로직이 다릅니다: 매개변수는 (쉼표로 구분된) 값 목록이며 모두 지정해야 합니다. 목록의 첫 번째 값은 다른 목록의 첫 번째 값에 해당합니다. 모든 매개변수를 사용할 수 있는 것은 아니며, 의미 있는 것들만 사용 가능합니다(SYNgate는 들어오는 트래픽에 영향을 미치지 않음을 기억하십시오):
SYNwall 설정과 다른 매개변수는 dstnet_list 하나뿐입니다.
대상 네트워크
dstnet_list: ip1/mask1[,ip2/mask2]...
IP/마스크 형식의 네트워크 목록. 예: 192.168.1.0/24. IP가 주어진 경우(네트워크 주소 대신) 네트워크가 계산됩니다. 이 네트워크에 속한 모든 IP는 동일한 배열 인덱스에 있는 다른 목록에 지정된 연결 매개변수(PSK, 정밀도 등)를 갖게 됩니다.
일회용 비밀번호에 사용되는 사전 공유 키
psk_list: psk1[,psk2]...
PSK는 32~1024바이트의 시퀀스여야 합니다. OTP의 일부가 되므로 길이는 패킷에 주입되는 OTP의 크기에 영향을 미칩니다. 이 매개변수가 없으면 모듈이 로드되지 않습니다.
UDP 활성화
enable_udp_list: {0|1}[,{0|1}]...
UDP 프로토콜에 대한 OTP를 활성화/비활성화합니다. 0으로 설정하면 비활성화, 1로 설정하면 활성화됩니다. UDP OTP는 패킷이 애플리케이션 수준으로 전달되기 전에 OTP를 제거(모듈에 의해)해야 하므로 통신하는 두 기기 모두에서 모듈이 활성화되어 있어야 합니다. 그렇지 않으면 이상한 동작이 발생할 수 있습니다. UDP 연결 추적은 conntrack 모듈에 의존하므로 이 기능을 사용하려면 해당 모듈을 삽입해야 할 수 있습니다(설치에 따라 다름). 그렇지 않은 경우 커널 로그에 오류가 표시됩니다.
참고: 기본적으로 포트 53(DNS) 및 123(NTP)은 아웃바운드 연결에 대해 블랙리스트에 등록되어 OTP가 추가되지 않습니다. 이를 변경해야 하는 경우 udp_blacklist[] 배열을 찾으십시오. 향후 이에 대한 매개변수를 추가할 예정입니다.
시간 정밀도 매개변수
precision_list: {9|10|...}[,{9|10|...}]...
OTP는 현재 장치 시간으로도 계산됩니다. 참여 장치 간에 시간이 다를 수 있으므로 특정 값으로 시간을 '반올림'하여 시간 차이를 허용할 수 있습니다.
정밀도는 2의 거듭제곱으로 표현됩니다(왜 그런지 의문일 수 있지만...성능을 높이고 저사양 장치에 미치는 영향을 낮추기 위한 결정이었습니다):
...
9 -> 1초
10 -> 8초
...
IP 스푸핑 보호 활성화
enable_antispoof_list: {0|1}[,{0|1}]...
안티스푸핑 보호를 활성화/비활성화합니다. 0으로 설정하면 비활성화, 1로 설정하면 활성화됩니다. 기본적으로 SYNwall에서 IP는 OTP의 일부가 아닙니다. 이로 인해 일부 재전송 공격이 발생할 수 있습니다. 완전히 안전하게 하려면 안티스푸핑 보호를 활성화할 수 있습니다. 장치 간에 NAT가 있는 경우 통신이 중단될 수 있습니다.
다음 변수를 make 실행 전에 설정하여 쉽게 크로스 컴파일할 수 있습니다:
ARCH (target architecture)
CROSS_COMPILE (toolchain path)
KERNEL (Kernel source path)
CLI에서 직접 두 네트워크를 사용한 예:
sudo insmod SYNgate.ko dstnet_list=10.1.1.0/24,198.168.10.0/24 psk_list=d41d8cd98f00b204e9800998ecf8427e,efebceec0de382839cd38bffcdc6bf0c enable_udp_list=0,0 precision_list=10,9 enable_antispoof_list=0,1
또는 설정 파일 사용:
sudo cat /etc/modprobe.d/SYNgate.conf
# SYNgate config file
# Keep it safe!!
options SYNgate dstnet_list=10.1.1.0/24,198.168.10.0/24
options SYNgate psk_list=d41d8cd98f00b204e9800998ecf8427e,efebceec0de382839cd38bffcdc6bf0c
options SYNgate enable_udp_list=0,0
options SYNgate precision_list=10,9
options SYNgate enable_antispoof_list=0,1
GPL-2.0
Sorint.Lab
모듈 기능 시작 지연 (ms)
load_delay: 10000
모듈 로드 후 보호를 활성화하기 전에 잠시 기다리도록 결정할 수 있습니다. 이는 문제가 발생하거나 재부팅 후 장치에 액세스해야 하는 경우 유용할 수 있습니다. 기본값은 10초입니다.
포트 노킹 페일세이프를 위한 포트 목록
portk: 0,0,0,0,0
장치 시계가 이상해지면 액세스하기 어려울 수 있습니다. 한 가지 방법은 앞서 논의한 '지연'일 수 있지만, 모듈을 일시적으로 비활성화할 수 있는 '포트 노킹' 시퀀스를 설정할 수도 있습니다. 목록이 정의된 경우 5개의 TCP 포트여야 합니다. 모듈이 1초 내에 이러한 포트에서 SYN 패킷을 식별하면 'load_delay'에 설정된 것과 동일한 시간 동안 자체적으로 비활성화됩니다. 참고: 이 시퀀스를 적극적으로 사용하는 경우 쉽게 스니핑될 수 있으므로 변경하는 것을 잊지 마십시오!