3. 설정 (B) - 설정파일 생성

 

     (1) 서버 측 설정파일 (.conf) 만들기

1
# nano /etc/openvpn/server.conf 
cs

          위 명령을 실행하여 빈 파일 server.conf 파일을 편집합니다.

          아래 텍스트를 전체 선택하여 복사 후 위 server.conf 파일에 붙여넣기 한 후 파일을 저장하고 나옵니다.

1
#################################################
#                                               #
#     My Server OpenVPN Server Configuration    #
#                                               #
#################################################
 
port 1194
local 192.168.0.2
proto udp
dev tun
 
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
 
server 10.8.0.0 255.255.255.0
 
ifconfig-pool-persist ipp.txt
 
push "route 10.8.0.1 255.255.255.255"                # Add route to Client routing table for the OpenVPN Server
push "route 10.8.0.0 255.255.255.0"                  # Add route to Client routing table for the OpenVPN Subnet
 
push "route 192.168.0.2 255.255.255.0"               # local subnet
 
push "dhcp-option DNS 8.8.8.8"                       # Set primary domain name server address to th Google DNS
push "dhcp-option DNS 8.8.4.4"                       # Set primary domain name server address to th Google DNS
 
push "redirect-gateway def1"                         # Override the Client default gateway by using 0.0.0.0/1 and
           # 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of
           # overriding but not wiping out the original default gateway.
 
 
client-to-client
 
keepalive 10 120
 
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher AES-128-CBC
comp-lzo
 
user nobody
group nogroup
 
persist-key
persist-tun
 
status /var/log/openvpn-status.log 20
log /var/log/openvpn.log
 
verb 3
 
crl-verify crl.pem 
cs

         보안 강화를 위해 아래와 같이 server.conf 파일의 권한을 변경해 줍니다.

1
# chmod 640 /etc/openvpn/server.conf 
cs

 

     (2) 서버 측 인터넷 데이터 포워딩 설정

         서버 측인 Raspbian (혹은 Armbian) 운영체제는 기본적으로 설정된 네트워크 간에 데이터 포워딩을 허용하지 않습니다.  server.conf 파일에 의해서 새롭게 구성되는 10.8.0.0/4 네트워크가 인터넷 통신을 하기 위해서는 이 설정을 변경하여 가능하도록 해 줍니다.

1
# nano /etc/sysctl.conf 
cs

         파일 내용이 꽤 긴데, 아래로 쭉 내리시면 중간 쯤에 “Uncomment the next line to enable packet forwarding for IPv4.” 라는 문구가 보이실 겁니다. 그 바로 아랫 줄의 # 표시를 제거하여 설정이 enable 되도록 변경해 주고 저장 후 nano에서 나옵니다. (아래 그림을 참조하시기 바랍니다. 중간 쯤에 제가 하이라이트 해 놓은 부분입니다.)

 /etc/sysctl.conf 파일/etc/sysctl.conf 파일을 nano 에디터로 열고 중간 정도 까지 스크롤 다운 한 화면입니다.

 

          이제 라즈베리파이 시스템에 우리가 설정을 변경하였다는 것을 알려 주기 위해 다음 명령을 입력합니다.

1
# sysctl -p 
cs

          위 명령을 통해 라즈베리파이 시스템은 재부팅 없이도 (at runtime) sysctl.conf 파일의 최신 변경사항을 반영할 것입니다.

          이제 리눅스 방화벽 차원의 인터넷 데이터의 포트포워딩을 설정해 주어야 합니다. 이 과정은 아래의 간단한 쉘스크립트를 통하여 가능합니다. 아래의 명령으로 새로운 빈 스크립트 파일을 엽니다.

1
# nano /etc/firewall-openvpn-rules.sh  
cs

          새로 열린 파일에 아래의 내용 전체를 복사하여 붙여 넣고 저장하면서 나옵니다.

1
#!/bin/sh
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.0.2 
cs

          보안상 중요한 파일이며 실행권한이 필요하므로 아래와 같이 입력해 줍니다.

1
# chmod 700 /etc/firewall-openvpn-rules.sh 
cs

          위에서 만들어준 OpenVPN을 위한 방화벽 예외 사항이 부팅 시(혹은 이더넷이 켜질 때)에 자동으로 실행될 수 있도록 아래와 같이 해 줍니다. 

1
# nano /etc/network/interfaces 
cs

          이 파일이 열리면 내용 중에서 "iface eth0 inet dhcp"라고 나오는 부분을 찾습니다. 우리가 이전에 이 파일을 열어서 고정IP로 변경하는 설정을 해 주지 않았다면 위의 내용이 보일 겁니다. 이 줄의 맨 끝에서 Enter키를 눌러 주어 한 줄을 추가한 다음 Tab키를 두 번 누르고 그 자리에 아래 내용을 복사하여 붙여 넣기를 해 주고 저장하며 종료합니다.

1
pre-up /etc/firewall-openvpn-rules.sh 
cs

          자 이제 서버 측에서 설정하고 구성하여야 할 것들은 거의 끝났습니다. 서버 측에서 남은 것은 이제 실제로 운용해 보면서 나오는 이슈들을 해결하기 위해 설정을 튜닝하는 것뿐입니다. 서버를 이제 재부팅합시다.

1
# shutdown -r now 
cs

 

     (3) 클라이언트 측 설정파일 (.ovpn) 만들기

          ssh를 통해 서버에 원격접속해 있었다면 1분 정도 여유있게 기지개를 좀 펴고 스트레칭 좀 하면서 파이가 재부팅할 시간을 준 뒤 재접속합니다. 그리고 루트 환경으로 진입한 후 우리가 작업하던 easy_rsa 폴더로 다시 가 봅시다.

1
2
$ sudo -s
# cd /etc/openvpn/easy-rsa/
cs

          클라이언트 측에는 사실 여러 가지 파일을 많이 가지고 있어야 합니다. 설정파일인 .ovpn (혹은 .conf) 파일, CA 파일, 키 파일, 클라이언트 인증서 등등... 이 파일들을 윈도우, 리눅스, 맥 클라이언트 들같은 데스크탑/랩탑에 복사하고 관리하는 것이야 뭐 큰 문제 없다고 할 수도 있지만, 요즘과 같은 모바일 세상에서 안드로이드나 iOS 클라이언트까지 저 잡다한 파일들을 죄다 옮겨서 유지 관리하기 보다는 좀 더 간편한 파일관리를 원하게 됩니다.

          그래서 Eric Jodoin 이라는 분이 배시 쉘 스크립트를 개발해서, 우리가 지난 1부에서 클라이언트를 위해 만들었던 잡다한 파일들을 설정파일 하나에 모두 집어 넣어, 설정파일 하나만 클라이언트 디바이스에 넣고 OpenVPN을 돌리면 서버에 문제 없이 접속되도록 해 놓으셨습니다. 설정파일을 비롯해 네다섯 개의 파일을 클라이언트에 넣으려고 scp 명령을 여러번 써 가며 고생했는데 신세계를 열어 주셨네요. 어떤 분인지 잘 모르지만 감사의 말씀을 전합니다.

          아무튼 이 스크립트를 쓰기 위해서 우리는 클라이언트 설정파일의 기본적인 내용을 담고 있고 CA, 인증서, ta.key 등의 내용이 합쳐질 기본 템플릿 파일 노릇을 할 txt 파일 하나를 만들어 놔야 합니다. 지금까지와 마찬가지로 복붙신공으로 순식간에 만들어 보겠습니다.

1
# nano /etc/openvpn/easy-rsa/keys/Default_Client_Template.txt 
cs

          역시 마찬가지로 새로 열린 파일에 아래의 내용 전체를 복사하여 붙여 넣습니다.

1
client
dev tun
proto udp
remote my_network.iptime.org 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1
cipher AES-128-CBC
comp-lzo
verb 3
mute 20 
cs

          자, 우리는 지난 제1부의 처음 도입부에서 네트워크 시스템의 환경부분을 언급하며, DDNS가 설정되어 있고 그 이름이 my_network.iptime.org 인 것으로 가정한다고 했습니다. 기업의 경우에는 외부 고정IP를 보유하고 계신 곳도 많으니, 만약 고정IP를 사용하신다면 그 고정IP를 my_network.iptime.org 자리에 입력하시면 됩니다. KT, SKB, LG U+ 등 통신회사가 제공하는 서비스가 유동IP 서비스라면 반드시 DDNS 서비스를 등록하시고 URL을 부여 받으신 뒤 그 주소를 my_network.iptime.org 자리에 입력하셔야 제대로 동작합니다. 이 글의 주제에서 벗어난 이슈이기 때문에 자세한 언급은 생략하지만, DDNS 서비스는 무료 제공이 대세입니다. 우리의 파이가 클라이언트 역할을 할 수도 있으며, ipTIME 공유기의 경우 공유기 차원에서 등록하고 유지 관리 및 클라이언트 역할을 할 수 있어 편리한 점이 있습니다. 

          Control+X 키를 누른 후 저장하겠냐는 물음에 Y하고 파일을 빠져 나옵니다.

          이제, 언급해 드린 배시 쉘 스크립트 파일을 만들 차례입니다.

1
# nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh 
cs

          새로 열린 파일에 아래의 내용 전체를 복사하여 붙여 넣고 저장하면서 나옵니다.

1
#!/bin/bash
# Default Variable Declarations
DEFAULT="Default_Client_Template.txt"
FILEEXT=".ovpn"
CRT=".crt"
KEY=".key"
CA="ca.crt"
TA="ta.key"
#Ask for a Client name
echo "Please enter an existing Client Name:"
read NAME

#1st Verify that client’s Public Key Exists
if [ ! -f $NAME$CRT ]; then
 echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT"
 exit
fi
echo "Client’s cert found: $NAME$CR"

#Then, verify that there is a private key for that client
if [ ! -f $NAME$KEY ]; then
 echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY"
 exit
fi
echo "Client’s Private Key found: $NAME$KEY"
#Confirm the CA public key exists
if [ ! -f $CA ]; then
 echo "[ERROR]: CA Public Key not found: $CA"
 exit
fi
echo "CA public Key found: $CA"
#Confirm the tls-auth ta key file exists
if [ ! -f $TA ]; then
 echo "[ERROR]: tls-auth Key not found: $TA"
 exit
fi
echo "tls-auth Private Key found: $TA"
#Ready to make a new .opvn file - Start by populating with the default file
cat $DEFAULT > $NAME$FILEEXT
#Now, append the CA Public Cert
echo "<ca>" >> $NAME$FILEEXT
cat $CA >> $NAME$FILEEXT
echo "</ca>" >> $NAME$FILEEXT
#Next append the client Public Cert
echo "<cert>" >> $NAME$FILEEXT
cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $NAME$FILEEXT
echo "</cert>" >> $NAME$FILEEXT
#Then, append the client Private Key
echo "<key>" >> $NAME$FILEEXT
cat $NAME$KEY >> $NAME$FILEEXT
echo "</key>" >> $NAME$FILEEXT
#Finally, append the TA Private Key
echo "<tls-auth>" >> $NAME$FILEEXT
cat $TA >> $NAME$FILEEXT
echo "</tls-auth>" >> $NAME$FILEEXT
chmod 600 $NAME$FILEEXT
echo "Done! $NAME$FILEEXT Successfully Created."
#Script written by Eric Jodoin 
cs

 

           이제 키 파일들이 위치한 디렉토리에서 작업하기 위해 폴더를 변경합니다.

1
# cd /etc/openvpn/easy-rsa/keys/ 
cs

          아울러 이 파일은 실행을 전제로 하는 쉘 스크립트이므로 실행권한을 주도록 변경합니다.

1
# chmod 700 ./MakeOVPN.sh 
cs

          자, 이제 드디어 쉘 스트립트를 실행해 봅시다.

1
# ./MakeOVPN.sh 
cs

          이 스크립트가 실행 되면서, 클라이언트의 이름을 입력하라고 합니다. 우리는 지난 제1부에서 Client1이라는 이름의 클라이언트를 생성해 준 바 있습니다. 이걸 넣어 보죠.

1
Done! Client1.ovpn Successfully Created. 
cs

          우리가 클라이언트의 이름을 오타없이 잘 입력했다면 위와 같은 메세지를 남기며 스크립트가 종료됩니다. 만약 다른 클라이언트를 더 만들었다면, 위의 스크립트를 반복 실행하면서 다른 클라이언트들의 .ovpn파일들을 모두 만들어 줍니다.

 

     (4) 클라이언트 측 소프트웨어 설치 및 구성

          우리는 지금까지 서버 측에서 모든 작업을 해 왔습니다. 이제 클라이언트 소프트웨어를 설치하고, 서버에서 만들어 놓은 .ovpn 파일을 클라이언트에 옮겨 놓고 실행하는 것이 남았네요. 클라이언트는 정말 다양한 환경에서 구동되기 때문에 이 글에서 모두 설명할 수는 없을 것 같습니다. 다만, 윈도우, 리눅스, 안드로이드, iOS 등 대부분의 운영체제에 OpenVPN 소프트웨어가 설치되고 클라이언트로 동작할 수 있는데 반해, MacOS에는 서드파티 소프트웨어만 존재하는 것으로 알고 있습니다. 그 중 쓸만한 것 하나가 Tunnelblick이라는 건데, 우리가 만들어 준 .ovpn 파일도 잘 인식하고 작동합니다.

          서버에 만들어 놓은 클라이언트용 .ovpn 설정 파일을 옮기는 과정도 파이에 랜만 물려 놓고 ssh로 원격접속해 쓰시는 분들은 참 난감하실 수 있습니다. 리눅스에 익숙하신 분들이야 scp로 파일을 순식간에 받으시겠지만 윈도우 쓰시는 분들은 Winscp를 설치하여 파일을 받으셔야 합니다. 파이에 sftp나 ftp 서버를 설치하고 윈도우 등에서 filezilla 등의 ftp/sftp 클라이언트로 .ovpn 파일을 받아오는 방법도 있습니다. 만만치 않은 작업들입니다만, 이글의 작성 목적을 벗어나므로 더 이상의 언급은 생략합니다.

          여기서는 우리나라 PC환경의 대부분을 차지하는 윈도우 클라이언트 설치 및 설정 과정만을 살펴 보겠습니다.

          우선 OpenVPN의 공식사이트 커뮤니티 다운로드 페이지에서 CPU와 윈도우즈 아키텍처에 맞는 32bit x86용 혹은 64bit x86_64용 윈도우즈 인스톨러 파일을 다운로드 받습니다. 특별한 커스터마이징 없이 설치과정을 마치면 "C:\Program Files\OpenVPN"폴더에 프로그램이 설치되고 바탕화면에 바로가기 아이콘이 생성됩니다. 이 설치 폴더 하위 폴더에 "config"라는 폴더도 설치되는데 이 곳에 우리가 서버에서 만들어 준 .ovpn 파일을 넣어 줍니다.

          이제 우리 Windows 클라이언트에서 수동으로 OpenVPN 서버에 접속하기 위해 바탕화면의 OpenVPN GUI 아이콘을 클릭합니다. OpenVPN GUI가 실행되면 시스템 트레이에 자물쇠가 있는 회색 모니터 모양의 트레이 아이콘이 나타납니다. 이 트레이 아이콘에 대고 오른쪽 클릭을 하면 아래 그림과 같은 메뉴가 나오게 되는데 여기서 "Connect"에 대고 클릭을 해 주게 되면 새로운 텍스트 창이 하나 열리면서 우리가 "config"폴더에 넣어 준 .ovpn 설정의 내용에 따라 서버에 접속을 시도하게 됩니다. 

OpenVPN GUI 실행 모습윈도우즈 용 OpenVPN GUI가 실행되어 시스템 트레이에 관련 아이콘이 나타나고 이를 오른쪽 클릭했을 때의 화면입니다.

          이때 접속에 성공하면 접속 프로세스를 보여주는 창이 자동으로 닫히면서 시스템 트레이 아이콘의 모니터 색이 회색에서 연두색으로 바뀌게 되고, 실패하면 접속 진행 창에 에러메세지를 보여 주게 됩니다.

          윈도우용 OpenVPN 프로그램은 GUI 수동접속 지원과 함께 윈도우즈 서비스에도 등록되어 부팅시 자동실행 시키거나 런타임으로 재시작할 수 있도록 되어 있습니다. 다만, 처음 설치하면 이 기능의 기본값은 수동시작으로 되어 있으므로 서버로 실행하거나 클라이언트를 부팅시부터 자동으로 시작하고 싶다면 이를 자동시작으로 바꾸어 줄 필요가 있습니다.

          윈도우즈 바탕화면 왼쪽 하단의 윈도우즈 로고를 오른쪽 클릭하면 나오는 제어판을 실행해 줍니다. 제어판-시스템 및 보안-관리도구에 있는 "서비스"를 클릭하여 실행해 줍니다. ABC 순으로 나오는 각종 서비스들을 주욱 스크롤 다운하면 "OpenVPN Service"라는 서비스 항목이 보이는데 이를 더블클릭합니다. 일반 탭의 중간 쯤 보면 "시작 유형"이 "수동"으로 되어 있을 것입니다. 이것을 아래 그림과 같이 "자동"으로 바꾸어 주고 적용을 누르고 "확인"을 눌러 빠져나옵니다.

윈도우즈 용 OpenVPN Service 속성 화면OpenVPN Service 항목을 더블클릭하면 나오는 속성 화면입니다. 이 화면에서 바로 서비스를 시작, 중지, 일시중지, 계속을 할 수 있으며 부팅 시의 시작유형을 변경할 수도 있습니다.

          이제 재부팅 해 주면 자동으로 OpenVPN 서비스가 시작됩니다.

 

이상으로 Raspberry Pi를 OpenVPN 서버로 만들기 제2부를 마칩니다. 마지막 제3부에서는 VPN이 제대로 운영되기 위한 공유기 설정과 문제해결 (Trouble Shooting and Workaround)에 대해 언급하고 연재를 마치겠습니다.

Posted by truerain
l

1. 환경

 

     (1) 실행 하드웨어 및 운영체제

         - Raspberry Pi 2 (운영체제 : Raspbian Wheezy/Jessie) 또는,

           호환 확인된 유사 보드 : Orange Pi PC (운영체제 : Armbian Jessie)

         ※ 물론 ARM 계열 보드들 뿐만아니라 Debian의 Wheezy 혹은 Jessie 배포판을 사용하는 일반적인 PC환경에서도 동작할 것입니다.

 

     (2) 네트워크 – 공유기 (ipTIME) 내부 사설 네트워크

         - 공유기 게이트웨이 : 192.168.0.1

         - OpenVPN이 설치될 라즈베리파이 (혹은 오랜지 파이) 보드 :  

                                     192.168.0.2 (공유기 설정에서 사설IP 예약 할당)

           - 공인 고정 IP 혹은 DDNS (이 글에서는 my_network.iptime.org로

           DDNS 설정이 되어 있는 상황을 가정합니다.)

 

2. OpenVPN 설치

 

     (1) 데비안 Wheezy 버젼인 경우 

          easy-rsa가 openvpn 패키지에 포함되어 있으므로 별도로 설치할 필요가 없습니다.

1
$ sudo apt install openvpn
cs

 

 

     (2) 데비안 Jessie 버젼 이후의 경우 

          easy-rsa가 별도 패키지로 분리되었기때문에 함께 설치가 필요합니다.

1
$ sudo apt install openvpn easy-rsa    
cs

 

 

3. 설정 (A) : easy-rsa 관련파일 생성

 

     (1) root프롬프트 전환

          권한문제 등을 원활히 해결하기 위하여 아래와 같이 root 프롬프트 환경으로 진입합니다.

1
$ sudo –s    
cs

 

     (2) TLS기반 인증을 위한 easy-rsa 스크립트 폴더 복사

         - Wheezy의 경우

1
# cp –r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa   
cs

 

         - Jessie의 경우

1
# cp –r /usr/share/easy-rsa /etc/openvpn/easy-rsa   
cs

 

     (3) vars 파일 변수 설정 편집

1
2
# cd /etc/openvpn/easy-rsa
# nano ./vars
cs

          vars파일이 열리면 ‘EASY_RSA’라는 변수를 찾아 =표시 뒤의 값이 아래와 같이 되도록 바꾸어 줍니다.

1
export EASY_RSA=”/etc/openvpn/easy-rsa”
cs

 

(이때 줄 맨 앞에 #표시가 붙지 않아야 합니다. 설정파일 특정 행의 선두에 #이 붙어있다는 것은 그 행 전체가 주석이라는 의미입니다.)

vars파일의 EASY_RSA 변수 부분.vars파일의 EASY_RSA 변수 부분을 찾아 그 값을 변경해 준 이후의 모습입니다.

          계속해서 아래 내용이 나오는 부분을 찾습니다.

1
export KEY_COUNTRY="US"
cs

          위 변수 선언이 나오는 곳을 찾아 =부호 뒤 따옴표 안의 US를 서버가 위치한 곳의 국가코드로 바꾸어 줍니다. (반드시 2자리 국가코드 형태로 입력합니다. 우리나라는 KR이겠지요.)

          그 아래로 KEY_PROVINCE  변수는 =부호 뒤 따옴표 안의 CA를 서버가 위치한 특별/광역시/도 영어 이름으로 바꾸어 줍니다. 마찬가지 방법으로 도시도 바꾸어 주고, KEY_ORG는 영어 회사명 혹은 누구네 집 (~’s home)정도를 입력해 줍니다. KEY_EMAIL은 굳이 기재할 필요는 없는데 스크립트가 공란을 허용하지 않으므로, . 만 입력하고 넘어갑니다. KEY_OU는 부서명을 영어로 입력하거나 .를 입력하여 넘어갑니다. 아래 그림은 서울시 용산구에 위치한 용산(주) 영업부라는 가상 조직의 예를 var파일의 해당 변수에 입력한 예시 화면입니다.

vars파일 예시입니다.이 그림은 서울시 용산구에 위치한 용산(주) 영업부라는 가상 조직의 예를 var파일의 해당 변수에 입력한 예시 화면입니다.

          위 KEY_COUNTRY부터 KEY_OU까지는 아래에서 언급할 키 생성 스크립트들에서 사용자에게 물어보는 값들입니다. 이때 [ ]안에 우리가 var파일에 입력한 국가코드, 시도 이름, 도시 이름 등이 기본값으로 제시되며 그냥 엔터만 누르고 지나가면 기본값이 입력되고, 변경하고자 한다면 변경될 값을 입력한 후 엔터를 입력하면 변경된 값이 적용되는 방식입니다. 

          자, 이제 Control + X 키를 누른 뒤 nano 에디터가 저장할 지를 물으면 Y 키를 눌러 저장하고 나옵니다.

 

     (4) CA (Certificate Authority) 구축

1
2
3
# source ./vars
# ./clean-all
# ./build-ca
cs

          위 bash 명령어에서 첫 줄은 vars 파일에서 선언해 준 변수들을 읽어들여 참조하라는 의미이며, 두번째 줄은 서브디렉토리 keys/가 생성되어 있다면 해당 폴더의 내용을 전부 지우는 명령입니다. 따라서 처음 key들을 생성할 때 이외에는 실수로 이 명령어를 입력하지 않도록 주의하여야 하며, 반대로 모든 key작업을 처음부터 다시 시작하여야 할 필요가 있을 때, 유용하게 이 명령을 사용함으로써 초기화된 깨끗한 환경에서 새로 CA와 키들을 생성할 수 있습니다. 세번째 줄의 명령어는 CA (Certificate Authority)를 생성하라는 의미입니다.

          CA 생성을 시작하면, EASY_RSA 프로그램은 난수를 생성한 뒤, 위에서 우리가 변수로 선언한 국가코드 등을 어떻게 적용할지를 사용자에게 묻는 절차를 진행합니다. vars파일 편집을 잘 해 놓으셨다면 특별히 변경 없이 엔터를 입력하여 넘어가도 무방해 보입니다.

 

     (5) 서버 Certificate 및 KEY 생성

1
# ./build-key-server [서버_이름] 
cs

          이제 위 명령어를 통해 서버 인증서와 키를 생성해 줍니다.

          서버 이름은 해당 부서 혹은 회사 전산실에서 OpenVPN 서버로 사용할 컴퓨터를 네트워크 상에서 구분해서 부르는 영어(와 숫자로 된) 실제 이름을 붙여 기재합니다. 예를 들어, 그냥 Server라는 이름을 붙였을 경우 아래와 같이 입력합니다.

1
# ./build-key-server Server 
cs

          단, 서버 이름은 이 후에 만들 클라이언트들의 이름과 겹치지 않도록 하는 것이 관리 목적상 중요합니다. 아울러 이 명령에 입력하는 [서버_이름]이 서버키를 만드는 과정에서 스크립트가 CN (Common Name) 값을 물어볼 때 [ ]안에 들어가는 기본값이 되는데, 이 기본값을 유지해 주어야 합니다. 이 CN 값은 모든 클라언트와 서버가 각각 고유한 값을 가져야 합니다. (즉, 동일한 값을 입력하면 작동시 오류가 납니다.) 단, 설정파일에서 동일한 값을 갖을 수 있도록 옵션을 설정할 수는 있지만, 역시 관리목적상 바람직하지 않습니다.

          또한가지 중요한 것은, 스크립트가 사용자의 입력값을 요구하면서 아래와 같이 묻습니다.

1
A challenge password?
cs

          이때 어떠한 값도 입력하지 말고 엔터를 입력해야 합니다.

1
Sign the Certificate?
cs

          라는 질문에는 Y를 입력해야 합니다.

1
Sign the Cer1 out of 1 certificate requests certified, commit?
cs

          여기에도 Y를 입력하면 비로소 정상적으로 서버 인증서와 키가 완성됩니다.

 

     (6) Client Certificate 및 Key 생성

          이제 클라이언트용 키를 생성하는 단계입니다. 클라이언트용 키는 일반적으로 VPN에 접속할 VPN사용자 단위로 만들어 줍니다. 그래야 회사의 경우 VPN사용자 퇴사 시 해당 클라이언트 키만 무효화하여 서버와 다른 클라이언트를 유지할 수 있습니다. 따라서 이 경우 해당 VPN사용자의 고유한 값 (e.g. 사원번호)을 [클라이언트_이름]과 CN 값으로 입력하는 것이 현명해 보입니다.

          만약 가정에서 운용하고, 접속하는 VPN사용자는 극히 적고 변동될 가능성이 없는데 동일한 VPN사용자가 PC, MAC,  모바일 기기 등 여러 디바이스로 접속한다면, 접속하는 디바이스의 고유 이름대로 클라이언트 키를 만들어 줄 수도 있을 것입니다. 물론, 이 경우 접속하던 디바이스를 처분할 때, 해당 클라이언트 인증서와 키를 폐기하는 스크립트를 실행해 주어야 하겠지요. 특히 비밀번호 없이 클라이언트를 생성할 경우 폐기 절차는 보안에 절대적으로 필요합니다.

           아래 명령어는 참고만 하십시오.

1

# ./build-key-pass [클라이언트_이름] 

cs

          역시 [클라이언트_이름]으로 입력해 준 값이 CN 기본값이 됩니다.  위 명령은 클라이언트 키를 생성하는 스크립트가 진행될 때 PEM 패스워드를 만들도록 되어 있습니다. 위 방식으로 클라이언트 키를 만들면, VPN사용자는 OpenVPN 서버에 접속할 때마다 PEM 패스워드를 입력하여야 합니다. 또한 위 방식으로 만든 클라이언트가 iOS, 안드로이드 등 모바일기기에서 서버에 접속하고자 한다면, 3des 파일을 한 번 더 만들어 줘야 한다고 합니다. 이 글에서는 위 방식은 다루지 않고 아래와 같이 PEM 패스워드를 입력하지 않고 접속하는 클라이언트 생성방법을 설명합니다.

1
# ./build-key [클라이언트_이름] 
cs

          [클라이언트_이름]은 전술한 바와 같이 적절하고 고유한 클라이언트의 실제 이름으로 치환하여 입력하여야 합니다. 예를 들어, Client1 이라는 이름으로 클라이언트 키를 생성하기 위해 아래와 같이 입력합니다.

1
# ./build-key Client1 
cs

          그러면 스크립트가 난수 생성과정을 진행한 뒤 서버키 생성때와 마찬가지로 사용자의 입력값을 쭉 요구하고 나서 아래와 같이 묻습니다.

1
A challenge password?
cs

          역시 이때 어떠한 값도 입력하지 말고 엔터를 입력해야 합니다.

1
Sign the Certificate?
cs

          라는 질문에는 Y를 입력해야 합니다.

 

     (7) Diffie-Hellman key exchange 생성

1
# ./build-dh 
cs

          우리가 var파일에서 해당 변수에 특별한 변경을 하지 않았다면, 위 명령을 입력했을 때, 스크립트가 2048 비트로 암호화하는 dh2048.pem 파일을 keys 디렉토리 내에 생성합니다. 이 파일의 생성시간이 상대적으로 서버, 클라이언트 난수 생성보다 꽤 길게 느껴질 것입니다. 그래서 데비안 wheezy 때까지만 해도 암호화 수준을 1024 비트 수준으로 하는 것이 var파일의 기본값이었고 권장값이었는데, Jessie로 넘어오면서는 기본값이 2048 비트로 되어 있더군요. 아마 하드웨어의 성능이 비약적으로 향상되면서 1024 비트의 암호해독 속도도 줄었을 것이고, 반대로 2048 비트로 암호화 하는 체감 속도도 과거 보다는 빨라졌기 때문에 생긴 변화일 것이라 생각해 봅니다. (순식간에 완료하겠구나 하고 오해하는 것은 금물입니다. 과거보다 빨라졌을 뿐, 2048비트 암호화 파일 생성시간이 orange pi pc 기준으로 12~13분 가량 이상은 됩니다.) 아무튼 보안 수준이 높아진다는 것은 나쁠 것은 없지요.  

 

     (8) ta.key 파일 생성

1
# openvpn –-genkey –-secret keys/ta.key 
cs

          이제 해커의 DoS (Denial of Service) 공격을 대비하기 위해 서버와 클라이언트가 공유하는 파일인 ta.key 파일을 위와 같은 명령으로 만들어 줍니다.

 

   이상으로 Raspberry Pi를 OpenVPN 서버로 만들기 제1부 내용을 마칩니다. 이어질 2부에서는 서버와 클라이언트 설정파일을 생성하는 과정까지 마치고 3부에서는 실제로 운용해보고 발생하는 문제에 대한 대처 등을 다루어 볼까 합니다.

Posted by truerain
l

   지난 달 28일 법원은, 故 백남기 농민에 대한 부검영장을 발부하면서, 첨부 문서 형태의 '압수수색 형태의 검증과 제한'이라는 글을 통해 부검장소, 참관인 등 중요 절차에 관련하여 유족의 의사를 반영하여 진행하도록 한 바 있습니다. 이 영장은 기존에 알려져 있던 영장의 형식과 내용에서 크게 벗어난 것이어서 논란이 되었습니다. 법원이 1차 영장청구는 기각한 뒤, 2차로 제출된 영장청구를 기각시키지 못하고, '내키지 않는 부검영장을 내어 주면서 탄생한 고육지책의 흔적이다.'라든지, '말도 안되는 부검에 대한 고민과 책임을 유족 측에 떠넘기는 것이다.' 등의 논란이 분분했습니다. 이 영장은 집행기관인 검찰/경찰과 피집행 측인 유족에도 법원의 진의(眞意)와 강제성에 대한 숱한 논란을 야기했지요.

   이런 와중에 검찰은 지속적으로 '영장(집행)의 강제성'을 강조하며, 집행을 강제할 수 없는 영장은 있을 수 없다는 논리를 보여왔습니다. 급기야 어제 (6일) 오후에는 서울지검 관계자가 기자간담회를 열어, '조건부영장이란 없다. 영장을 발부받았으면 집행해야 한다.'는 이야기를 하며, 유족과 합의가 되지 않더라도 유족의사에 반하여 영장을 집행하겠다는 의지를 천명했다고 하는 기사가 나왔습니다.

   검찰이 이야기하는 '영장 집행의 강제성'... 과연 맞는 말일까요?

   위키피디아에서 '영장(令狀)'을 찾아보면 다음과 같이 그 뜻을 설명하고 있습니다.

 

영장(令狀)은 명령을 기록한 종이문서로, 특히 법원 또는 법관이 사람 또는 물건에 대하여 체포, 구금, 수색, 압수 명령 이나 허가를 내용으로 하여 발부하는 문서를 말한다.
대한민국헌법에서 체포·구속·압수 또는 수색을 할 때에는 적법한 절차에 따라 검사의 신청에 의하여 법관이 발부한 영장을 제시하여야 한다.
다만, 현행범인인 경우와 장기 3년 이상의 형에 해당하는 죄를 범하고 도피 또는 증거인멸의 염려가 있을 때에는 사후에 영장을 청구할 수 있다.
영장은 ‘명령서’, ‘통지서’로 한국어 순화어를 쓰도록 권장 됨에 따라 입영영장은 입영통지서로 쓴다.
 ● 수색영장은 수사기관에게 피의자 등을 상대로 형사소송상의 증거물을 수색할 것을 명령하는 법원의 명령장이다.
 ● 체포영장은 혐의자의 체포를 지시하는 검찰이 청구하고, 판사는 이를 검토하여 승인하는 명령장이다.
 ● 구속영장은 피고인이나 또는 피의자를 구인·구금하기 위하여 검사의 청구에 따라 법원이 발부하는 영장이다.
 ● 인신보호영장은 이유없이 구금되었을 때 신청해 구금에서 풀려날 수 있게하는 영장으로, 대한민국에서는 구속적부심사를 쓴다.

 

   부검영장은 故백남기씨의 '사인(死因)을 밝히겠다'는 취지로 수색하겠다는 수색영장의 일환입니다. 앞서 위키피디아도 적시하고 있듯, 수색영장은 사법부가 행정부의 수사기관에게 이렇게 이렇게 수색하라는 명령서(장)입니다. 명령을 하는 쪽이 법원이고, 명령을 받아 집행하는 쪽이 수사기관입니다. 즉, 수사기관 자의(恣意)에 의해서가 아닌, 법원의 권위와 명령을 '수사기관이 받아' 법원의 명령을 집행한다는 것입니다. 이에 따라 영장 집행의 '강제성'이라고 하는 것은, 수사대상에게만 적용하는 것이 아니라, 행정부 수사기관도 '법원의 명령에 따라' 집행하여야 한다는 '강제성'을 의미합니다. 그것을 현재 검찰에서는 '집행의 강제성'만 강조하며 강제집행 운운하고 있는 것이지요. 당연히, 검찰/경찰 등 행정부 수사기관의 자의적(恣意的) 영장집행은 수사기관의 위법 행위를 의미하게 됩니다. 만약, 사법부의 명령을 무시한 자의적(恣意的)인 '강제집행'을 검/경 수사기관이 강행한다면, 이 위법을 누가 벌할 수 있을까요? 입법부가?... 사법부가?... 제4부라고 일컬어 지는 언론에서?... 이도 저도 아니면 저들이 개, 돼지라고 멸시하는 99% 국민들이?... 견제받지 않고 무소불위로 폭주하는 검찰, 경찰, 세무서 등의 행정부 권력기관이 의미하는 바는 뭘까요?

   대한민국은 민주주의를 표방하는 법치국가입니다. 법치국가에서 3권분립의 철저한 준수는 민주주의 실현 정도의 척도가 될 수 있습니다. 행정부의 수사기관은 사법부의 (명)령장없이는 국민을 자의적(恣意的)으로 구속하거나 수색하는 등 기본권을 침해할 수 없습니다. 수사기관이 사법부의 (명)령장을 자의적(恣意的)으로 해석하여 (명)령장에 반(反)한 위법행위를 하는 것도 있을 수 없는 일입니다. 만약 가능하다면, 행정부가 사법부를 무시하고 사법부 위에 있음을 인증하는 바로미터가 될 수 있겠지요. 바로 (그 어느 분이 그렇게 듣기 싫어 하신다는) 헬조선 독재국가를 인증하는 순간이 될 것입니다.

   삼가 故 백남기 농민의 명복을 빕니다.

Posted by truerain
l