OpenWrt 라우터에서 OpenVPN 보안에 대한 생각

OpenWrt 라우터에서 OpenVPN 보안에 대한 생각

OpenWrt 10.03 라우터의 포트 1194에 OpenVPN 서버를 배치했습니다.

echo "nameserver 8.8.8.8" > /etc/resolv.conf; opkg update; opkg install luci-app-openvpn openvpn openssl-util openssh-sftp-server ntpd
vim /etc/ssl/openssl.cnf # modify a few lines
[ CA_default ]
dir             = /etc/openvpn
new_certs_dir   = $dir/certs
certificate = $dir/ca.crt
private_key = $dir/ca.key

touch /etc/openvpn/index.txt; touch /etc/openvpn/serial; echo 01 > /etc/openvpn/serial
openssl req -nodes -new -x509 -keyout /etc/openvpn/ca.key -out /etc/openvpn/ca.crt -days 3650 # give a common name, like: vpnserver
openvpn --genkey --secret /etc/openvpn/ta.key
openssl req -nodes -new -keyout /etc/openvpn/server.key -out /etc/openvpn/server.csr # give a common name, like: vpnserver
mkdir -p /etc/openvpn/certs; mkdir -p /etc/openvpn/private
openssl ca -out /etc/openvpn/server.crt -in /etc/openvpn/server.csr
time openssl dhparam -out /etc/openvpn/dh1024.pem 1024 # it could take 10 minutes!

# generate certs for clients [X = client number]
openssl req -nodes -new -keyout /etc/openvpn/clientX.key -out /etc/openvpn/clientX.csr # give a common name! it will be the user name
openssl ca -out /etc/openvpn/clientX.crt -in /etc/openvpn/clientX.csr
# e.g.: 
openssl req -nodes -new -keyout /etc/openvpn/client1.key -out /etc/openvpn/client1.csr # give a common name! it will be the user name
openssl ca -out /etc/openvpn/client1.crt -in /etc/openvpn/client1.csr

vim /etc/config/openvpn
config 'openvpn' 'openvpn_server'
    option 'enable' '1'
    option 'port' '1194'
    option 'proto' 'udp'
    option 'dev' 'tap'
    option 'ca' '/etc/openvpn/ca.crt'
    option 'cert' '/etc/openvpn/server.crt'
    option 'key' '/etc/openvpn/server.key'
    option 'tls_auth' '/etc/openvpn/ta.key 0' # server: 0
    option 'dh' '/etc/openvpn/dh1024.pem'
    option 'comp_lzo' '1'
    option 'server' '10.20.30.0 255.255.255.0'
    option 'keepalive' '10 120'
    option 'persist_key' '1'
    option 'persist_tun' '1'
    option 'mute' '20'
    option 'verb' '3'
    option 'client_to_client' '1'
    list 'push' 'dhcp-option DNS 10.20.30.1'
/etc/init.d/openvpn enable
/etc/init.d/openvpn start
ifconfig -a | less
ping 10.20.30.1

# here comes the firewall part
vim /etc/config/firewall # modify it
config 'include'
    option 'path' '/etc/firewall.user'

config 'redirect'
    option 'src' 'wan'
    option 'proto' 'udp'
    option 'src_dport' '1194'
    option 'dest_port' '1194'
    option '_name' 'OpenVPN'

vim /etc/firewall.user # modify it
iptables -t nat -A prerouting_rule -i $WAN -p udp --dport 1194 -j ACCEPT
iptables -A input_rule -i $WAN -p udp --dport 1194 -j ACCEPT
iptables -A forwarding_rule -i tap+ -o br-lan -j ACCEPT
iptables -A forwarding_rule -i br-lan -o tap+ -j ACCEPT
iptables -A input_rule -i tap+ -j ACCEPT
iptables -A output_rule -o tap -j ACCEPT

/etc/init.d/firewall restart

# tar the files that goes to the client1
mkdir -p /root/client1
cp /etc/openvpn/ca.crt /root/client1/; cp /etc/openvpn/client1.crt /root/client1/; cp /etc/openvpn/client1.key /root/client1/; cp /etc/openvpn/ta.key /root/client1/
cd /root/; tar -cf client1.tar client1

# configure the client
# extract the client1.tar's content to "~/.cert" on the clients pc
# if you're using e.g.: Fedora/SELinux, then
restorecon -Rv ~/.cert*
# then: 
# ca.crt: the ca certificate
# client1.crt: the users certificate
# client1.key: the users private key
# ta.key: tls authentication [1]

OpenVPN 서버의 보안을 향상시키기 위해 (서버 측에서) 무엇을 할 수 있습니까? 내 생각은 다음과 같습니다.

  1. sed 's/1194/50000/'포트 스캐너가 찾기 어렵게 포트 번호를 더 높은 번호로 설정했습니다 .
  2. iptables? [입력 체인에서] 실제 사용하는 IP 범위만 허용해야 합니까? + 내 노트북의 MAC 주소만 허용
  3. 라우터를 사용하지 않을 때는(예: 자고 있을 때) 그냥 끕니다.

내가 놓친 것이 있나요? 명령을 통해 psOpenVPN이 루트에 의해 실행되는 것을 볼 수 있는데 이는 안전하지 않습니다. 보안을 강화하려면 또 무엇을 해야 합니까?

답변1

OpenVPN은 안전하도록 설계되었습니다. 서명 키가 있는 클라이언트만 허용됩니다. 가장 중요한 것은 개인 키를 안전하게 보관하는 것입니다. 항상 클라이언트에서 암호화하고 서버의 키 파일에 대한 권한을 확인하세요. CA 개인 키가 필요하지 않은 서버에 보관하지 마십시오. 암호화하고 펜 드라이브에 넣어 보호하세요.

포트 스캐너는 모든 포트에서 서버를 찾는 데 아무런 문제가 없지만 이를 사용할 수는 없습니다. 제한된 IP 주소 세트에서만 이를 사용한다는 것을 알고 있다면 iptables를 사용하여 다른 모든 주소를 비활성화하십시오. 그러나 대부분의 사람들은 노트북을 사용하는 등 다양한 위치에서 사용하는 경향이 있습니다. 유효하지 않은 키를 시도하는 IP를 자동으로 차단할 수 있지만 이와 같은 RSA 키에 대한 무차별 대입은 어쨌든 불가능합니다.

키가 안전하다면 가장 큰 위험은 OpenVPN 구현의 버그로 인해 공격에 취약해지는 것입니다. 이런 일이 발생하면 공격자는 OpenVPN 서버 프로세스의 권한으로 임의 코드를 실행할 수 있습니다. 서버를 루트로 실행하지 않으면 이러한 유형의 공격으로 인한 영향을 줄일 수 있습니다. 서버 구성에 다음을 추가하세요.

user nobody
group nobody

귀하의 구성 파일은 내 것과 다른 구문을 사용하는 것 같지만 비슷한 것을 지원해야 합니다. 커널에 grsecurity 패치를 사용해 볼 수 있지만 임베디드 시스템에서 작동하는지 확실하지 않습니다. 실수로 부팅할 수 없게 만들면 정말 안 좋은 일이 될 것입니다. 임의 코드 실행 오류를 악용하기가 더 어려워집니다.

키 크기를 늘릴 수도 있습니다. 1024비트 키는 가까운 시일 내에 크랙하기가 더 쉬워질 수 있습니다(아직 크랙되지 않은 경우). Debian의 OpenSSL을 사용하여 생성하지 않도록 하세요. :)

개인적으로 MAC 주소 필터링은 전혀 쓸모가 없다고 생각합니다. 위조하기 쉽고 작동하는 것을 쉽게 찾을 수 있습니다. WPA2 CCMP와 63바이트 길이의 임의 키를 사용하면 문제가 없습니다. 사람들이 무작위로 케이블을 연결하지 못하게 하십시오.

라우터에 사용 가능한 리소스가 많지 않다는 것을 알고 있지만 로깅을 시도해 볼 수 있습니다. 라우터에 공간이 충분하지 않은 것이 거의 확실하므로 다른 호스트에 로그인하십시오. Syslog-ng는 이 작업을 쉽게 수행할 수 있지만 라우터에 설치하는 것이 얼마나 쉬운지는 모르겠습니다.

관련 정보