PHP 수호신(Suhosin) 설치

from Linux 2009/11/27 02:47
아래 사이트에서 최신의 수호신을 다운로드 합니다.
http://www.hardened-php.net/suhosin/download.html
[root@yongbok ~]# cd /usr/local/src
[root@yongbok ~]# wget http://download.suhosin.org/suhosin-0.9.29.tgz
[root@yongbok ~]# tar xzvf suhosin-0.9.29.tgz
[root@yongbok ~]# cd suhosin-0.9.29
[root@yongbok ~]# /usr/local/php5/bin/phpize
[root@yongbok ~]# ./configure --with-php-config=/usr/local/php5/bin/php-config
[root@yongbok ~]# make && make install
Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/

수호신 모듈을 php.ini 파일에 추가 해줍니다.
[root@yongbok ~]# vi /usr/local/apache2/conf/php.ini
[Suhosin]
extension_dir=/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/
extension=suhosin.so

적용을 위해 아파치를 재시작 해줍니다.
[root@yongbok ~]# /usr/local/apache2/bin/apachectl restart

정상적으로 설치가 되었는지 확인을 합니다.
[root@yongbok ~]# php -v
PHP 5.2.11 (cli) (built: Nov 24 2009 16:53:41)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with eAccelerator v0.9.6-rc1, Copyright (c) 2004-2007 eAccelerator, by eAccelerator
    with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies
    with Suhosin v0.9.29, Copyright (c) 2007, by SektionEins GmbH

phpinfo 를 이용하여 확인
[root@yongbok ~]# echo '<? phpinfo(); ?>' > /usr/local/apache2/htdocs/phpinfo.php
사용자 삽입 이미지
사용자 삽입 이미지

2009/11/27 02:47 2009/11/27 02:47

vsftpd - SSL 적용

from Linux 2009/11/25 20:50
FTP 서버의 데몬인 vsftpd 에 SSL(Secure Socket Layer)을 적용 시키는 방법입니다.
본 글은 소스 설치 기준으로 진행 하였습니다.

vsftpd 가 SSL 을 지원 하는지 확인을 해봅니다.
[root@yongbok ~]# ldd /usr/local/sbin/vsftpd
/usr/local/sbin/vsftpd:
        libpam.so.4 => /usr/lib/libpam.so.4 (0x28093000)
        libutil.so.7 => /lib/libutil.so.7 (0x2809a000)
        libc.so.7 => /lib/libc.so.7 (0x280a8000)

헐.. 이런 지원을 안하는군요.. 그럼 소스 파일을 받아다가 SSL을 지원 하도록 컴파일 해줘야 합니다.

vsftpd 를 아래 주소에서 최신 버전으로 받아옵니다.
ftp://vsftpd.beasts.org/users/cevans/
[root@yongbok ~]# cd /usr/local/src
[root@yongbok ~]# wget ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.2.2.tar.gz
[root@yongbok ~]# tar xzvf  vsftpd-2.2.2.tar.gz

vsftpd 소스 디렉토리에 있는 builddefs.h 헤더 파일의 코드 내용중 SSL 부분앞에 #undef 를 #define 으로 수정합니다.
[root@yongbok ~]# cd vsftpd-2.2.2
[root@yongbok ~]# vi builddefs.h
변경 전
#ifndef VSF_BUILDDEFS_H
#define VSF_BUILDDEFS_H

#undef VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#undef VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */
변경 후
#ifndef VSF_BUILDDEFS_H
#define VSF_BUILDDEFS_H

#undef VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#define VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */

vsftpd를 컴파일을 합니다.
[root@yongbok ~]# cd /usr/local/src/vsftpd-2.2.2
[root@yongbok ~]# make && make install

SSL을 지원하는지 다시 확인 해봅니다.
[root@yongbok ~]# ldd /usr/local/sbin/vsftpd
/usr/local/sbin/vsftpd:
        libpam.so.4 => /usr/lib/libpam.so.4 (0x28095000)
        libutil.so.7 => /lib/libutil.so.7 (0x2809c000)
        libssl.so.5 => /usr/lib/libssl.so.5 (0x280aa000)
        libcrypto.so.5 => /lib/libcrypto.so.5 (0x280eb000)
        libc.so.7 => /lib/libc.so.7 (0x28244000)

이제 인증서를 만들기 위해서 OpenSSL 를 설치 해줘야 합니다.
데이터 압축을 지원하기 위한 zlib 를 설치 해줍니다.

- zlib 설치
[root@yongbok ~]# cd /usr/local/src
[root@yongbok ~]# wget http://www.zlib.net/zlib-1.2.3.tar.gz
[root@yongbok ~]# tar xzvf zlib-1.2.3.tar.gz
[root@yongbok ~]# cd zlib-1.2.3
[root@yongbok ~]# ./configure
[root@yongbok ~]# make && make install

- OpenSSL 설치
OpenSSL 은 아래 사이트에서 빨간색 부분에 LATEST 를 받아줍니다.
http://www.openssl.org/source/
[root@yongbok ~]# cd /usr/local/src
[root@yongbok ~]# wget http://www.openssl.org/source/openssl-0.9.8l.tar.gz
[root@yongbok ~]# tar xzvf openssl-0.9.8l.tar.gz
[root@yongbok ~]# cd openssl-0.9.8l
[root@yongbok ~]# LDFLAGS=-L/usr/local/lib CPPFLAGS=-I/usr/local/include
[root@yongbok ~]# ./config --prefix=/usr/local --openssldir=/usr/local/openssl zlib
[root@yongbok ~]# make && make install

openssl 을 심볼릭 링크를 걸어 줍니다.
[root@yongbok ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

10 년 짜리 사설 인증서를 생성합니다.
[root@yongbok ~]# openssl \
req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem
Generating a 1024 bit RSA private key
................++++++
........................++++++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Gangseo-gu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Yongbok
Organizational Unit Name (eg, section) []:CEO
Common Name (eg, YOUR name) []:yongbok.net
Email Address []:ruo91@yongbok.net

생성된 vsftpd.pem 인증서를 root 만 읽기/쓰기 가능 하도록 권한을 변경 해줍니다.
[root@yongbok ~]# chmod 600 vsftpd.pem
[root@yongbok ~]# ls -l vsftpd.pem
-rw-------  1 root  wheel  2176 11 25 10:44 vsftpd.pem

vsftpd.pem 파일을 적당한 곳에 이동 시킵니다.
[root@yongbok ~]# mv vsftpd.pem /etc

vsftpd.conf 환경 설정 파일에 SSL 을 사용하도록 아래 처럼 추가 해줍니다.
[root@yongbok ~]# vi /etc/vsftpd.conf
listen_port=21
ftp_data_port=20
ssl_enable=YES
rsa_cert_file=/etc/vsftpd.pem
force_local_logins_ssl=YES
force_local_data_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
allow_anon_ssl=NO

이후 vsftpd 를 시작 합니다.
[root@yongbok ~]# /usr/local/sbin/vsftpd &
[root@yongbok ~]# ps -aux | grep vsftpd
ftp    88036  0.0  0.3  4880  2508  ??  I    11:10AM   0:00.02 /usr/local/sbin/vsftpd

FTP 클라이언트인 파일질라를 아래 사이트에서 받은 후 설치하고 아래처럼 셋팅 해줍니다.
(알 FTP 클라이언트는 SFTP 는 지원하는데 FTPS 를 지원 하지 못하기에..)
http://filezilla-project.org/
사용자 삽입 이미지

접속과 동시에 인증서 확인 메세지가 뜨는데 확인 하고 접속하면 됩니다.
사용자 삽입 이미지
2009/11/25 20:50 2009/11/25 20:50

Zend Optimizer v3.3.9 설치

from Linux 2009/11/24 18:43
PHP 성능을 가속 시켜 주는 Zend Optimizer v3.39 버전 설치 방법입니다.
4.2.x, 4.3.x, 5.0.x, 5.1.x, 5.2.x 버전에서만 지원을 하며 5.3.x 이상은 지원하지 않습니다.
http://ftp.yongbok.net/ZendOptimizer/
[root@yongbok ~]# cd /usr/local/src
[root@yongbok ~]# wget http://ftp.yongbok.net/ZendOptimizer/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
[root@yongbok ~]# tar xzvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
[root@yongbok ~]# ls -al ZendOptimizer-3.3.9-linux-glibc23-i386/data/
total 22
drwxr-xr-x  9 root  wheel   512  8 24 20:57 .
drwxr-xr-x  3 root  wheel   512  8 24 20:57 ..
drwxr-xr-x  2 root  wheel   512  8 24 20:57 4_2_0_comp
drwxr-xr-x  2 root  wheel   512  8 24 20:57 4_2_x_comp
drwxr-xr-x  2 root  wheel   512  8 24 20:57 4_3_x_comp
drwxr-xr-x  2 root  wheel   512  8 24 20:57 4_4_x_comp
drwxr-xr-x  2 root  wheel   512  8 24 20:57 5_0_x_comp
drwxr-xr-x  2 root  wheel   512  8 24 20:57 5_1_x_comp
drwxr-xr-x  2 root  wheel   512  8 24 20:57 5_2_x_comp
-rw-r--r--  1 root  wheel  2088  1 29  2004 poweredbyoptimizer.gif

위 처럼 보이는 디렉토리들은 PHP 버전을 나타내며 PHP 버전에 따라 이동합니다.
적당한 곳에 모듈을 이동 시킵니다.
[root@yongbok ~]# cd ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp
[root@yongbok ~]# mv ZendOptimizer.so /usr/local/apache2/modules

php.ini 파일에 아래 내용을 추가 합니다.
[root@yongbok ~]# vi /usr/local/apache2/conf/php.ini
[Zend]
zend_optimizer.version=3.3.9
zend_extension=/usr/local/apache2/modules/ZendOptimizer.so

이후 적용을 위해 아파치를 재시작 합니다.
[root@yongbok ~]# /usr/local/apache2/bin/apachectl restart

정상적으로 적용이 되었는지 확인을 해봅니다.
[root@yongbok ~]# /usr/local/php/bin/php -v
PHP 5.2.13 (cli) (built: May  4 2010 08:52:40)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
    with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
    with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies
    with Suhosin v0.9.31, Copyright (c) 2007-2010, by SektionEins GmbH
2009/11/24 18:43 2009/11/24 18:43
FreeBSD 에서 SSH Brute Force 공격을 대비하여 sshguard 를 이용해 지정된 횟수만큼 접속 시도가 들어오면 방화벽에서 바로 차단하는 방법입니다.

1. IPFW 방화벽 활성화
FreeBSD 에서 많이 쓰이는 방화벽인 ipfw 를 사용할수 있는지 확인을 합니다.
[root@yongbok ~]# ipfw list
ipfw: getsockopt(IP_FW_GET): Protocol not available
위 처럼 프로토콜을 사용할수 없다는 에러문이 나오면 커널에 해당 옵션을 활성화 해주고 컴파일을 통해 ipfw 를 활성화 시켜 줘야 합니다.
options IPFIREWALL                                 # IPFW 필수 옵션
options IPFIREWALL_VERBOSE                 # 로깅 옵션
options IPFIREWALL_VERBOSE_LIMIT=10   # 로그 내용이 많을때 제한 옵션
options IPDIVERT                                    # NAT 을 사용하기 위한 옵션

커널 컴파일을 합니다.
[root@yongbok ~]# cd /usr/src/sys/i386/conf
[root@yongbok ~]# cp GENERIC Yongbok-Kernel
[root@yongbok ~]# ee Yongbok-Kernel
[root@yongbok ~]# cd /usr/src
[root@yongbok ~]# make buildkernel KERNCONF=Yongbok-Kernel
[root@yongbok ~]# make installkernel KERNCONF=Yongbok-Kernel

적용을 위해 재부팅을 해줍니다.
[root@yongbok ~]# reboot

ipfw 방화벽을 활성화 해줍니다.
[root@yongbok ~]# echo 'firewall_enable="YES"' >> /etc/rc.conf
[root@yongbok ~]# echo 'firewall_type="open"' >> /etc/rc.conf

2. sshguard 설치
[root@yongbok ~]# cd /usr/ports/security/sshguard-ipfw && make install clean

/etc/syslog.conf 파일 내용 중 기존에 있는 auth 부분을 주석 처리 하고 아래 내용을 추가 합니다.
(-p 옵션은 차단된 유효 기간을 지정해줍니다. 즉, 지정 된 시간이 넘어가 버리면 자동으로 해제가 되는것이죠.. 기본값은 7분 입니다.)
[root@yongbok ~]# ee /etc/syslog.conf
#auth.info;authpriv.info            /var/log/auth.log
auth.info;authpriv.info                |/usr/local/sbin/sshguard

syslogd 를 재시작 합니다.
[root@yongbok ~]# /etc/rc.d/syslogd restart
Stopping syslogd.
Starting syslogd.

테스트를 위해 4번 이상 패스워드를 틀리게 접속 해보면 자동으로 차단 해버리며 아래처럼 /var/log/debug.log 에 기록이 남게 됩니다. (방화벽(ipfw)에서는 55000 ~ 55050 목록 사이에 차단 된 아이피들이 추가 됩니다.)
[root@yongbok ~]# ipfw show | grep 5500*
55007       16        3008 deny ip from 115.137.195.153 to me
[root@yongbok ~]# ipfw list | awk '{ if($1 >= 55000 && $1 <= 55050) print $5 }'
115.137.195.153

로그 확인 모습
[root@yongbok ~]# cat /var/log/debug.log
Nov 22 18:31:08 yongbok sshguard[33434]: Matched IP address 115.137.195.153
Nov 22 18:31:18 yongbok last message repeated 3 times
Nov 22 18:31:18 yongbok sshguard[33434]: Running command: '/sbin/ipfw add 55007 drop ip from 115.137.195.153 to me'.
Nov 22 18:31:18 yongbok sshguard[33434]: Command exited 0.

[root@yongbok ~]# cat /var/log/messages | grep Blocking
Nov 22 17:13:49 yongbok sshguard[32581]: Blocking 115.137.195.153: 4 failures over 5 seconds.
Nov 22 17:41:07 yongbok sshguard[32920]: Blocking 115.238.59.216: 4 failures over 3 seconds.
Nov 22 18:06:35 yongbok bruteblock[33339]: Blocking failed for 115.137.195.153
Nov 22 18:31:18 yongbok sshguard[33434]: Blocking 115.137.195.153: 4 failures over 10 seconds.
Nov 22 18:45:13 yongbok sshguard[33434]: Blocking 118.35.34.179: 4 failures over 16 seconds.
Nov 22 21:24:18 yongbok sshguard[34464]: Blocking 222.68.199.238: 4 failures over 3 seconds.

참고
http://www.sshguard.net/docs/setup/firewall/ipfw/

2009/11/22 19:04 2009/11/22 19:04
필자는 FreeBSD 에서 Bind 네임서버를 운영중에 /var/log/messages 를 보았더니 아래와 같은 에러를 만날수 있었습니다.
yongbok named[1435]: could not listen on UDP socket: permission denied
yongbok named[1435]: creating IPv4 interface fxp0 failed; interface ignored

위 에러는 커널에 MAC portacl Module 이 있어야 해결 됩니다.
해당 모듈의 이름은 mac_portacl.ko 이며 커널설정파일에 options MAC 과 options MAC_PORTACL 를 추가 후 커널 컴파일을 하셔야 합니다.
[root@yongbok ~]# cp /usr/src/sys/i386/conf/GENERIC ~/KERNEL/Yongbok
[root@yongbok ~]# ee ~/KERNEL/Yongbok
[root@yongbok ~]# make buildkernel KERNEL=Yongbok && make installkernel KERNEL=Yongbok
사용자 삽입 이미지

 커널 컴파일 후 부트로더 안에 집어넣고 재부팅하면 해결 됩니다.
[root@yongbok ~]# echo 'mac_portacl_load="YES"' >> /boot/loader.conf
[root@yongbok ~]# cat /boot/loader.conf | grep mac_portacl_load
mac_portacl_load="YES"
참고
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/mac-portacl.html
2009/11/19 21:49 2009/11/19 21:49

FreeBSD - proc 사용하기

from FreeBSD 2009/11/19 13:02
FreeBSD 에서는 수동적으로 마운트 해줘야 합니다.

/etc/fstab 파일 내용에 아래와 같이 한줄 추가 해줍니다.
[root@yongbok ~]# echo 'linproc /compat/linux/proc linprocfs rw 0 0' >> /etc/fstab
[root@yongbok ~]# cat /etc/fstab | grep linproc
linproc         /compat/linux/proc      linprocfs       rw      0       0

위에서 추가한 linproc 를 마운트 합니다.
[root@yongbok ~]# mount linproc
[root@yongbok ~]# mount | grep linproc
linprocfs on /usr/compat/linux/proc (linprocfs, local)

CPU 정보를 봅니다.
[root@yongbok ~]# cat /compat/linux/proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 16
model name      : Intel(R) Celeron(R) CPU 2.00GHz
stepping        : 9
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 b19 b21 mmxext mmx fxsr xmm b26 b27 b28 b29 3dnow
cpu MHz         : 1993.54
bogomips        : 1993.54

메모리 정보를 봅니다.
[root@yongbok ~]# cat /compat/linux/proc/meminfo
             total:    used:    free:  shared: buffers:  cached:
Mem:  794726400 137551872 657174528 14995456 0 15265792
Swap: 1076879360 0 1076879360
MemTotal:    776100 kB
MemFree:     641772 kB
MemShared:    14644 kB
Buffers:          0 kB
Cached:       14908 kB
SwapTotal:  1051640 kB
SwapFree:   1051640 kB

버전정보를 봅니다.
[root@yongbok ~]# cat /compat/linux/proc/version
Linux version 2.4.2 (des@freebsd.org) (gcc version 4.2.1 20070719  [FreeBSD]) #4 Sun Dec 18 04:30:00 CET 1977
2009/11/19 13:02 2009/11/19 13:02
CentOS 에서 yum 을 사용하여 Apache, PHP, MySQL 설치 하는 방법을 알려드리며
MySQL -> Apache -> PHP 순서로 설치 하도록 하고 MySQL 웹 인터페이스 관리 툴인 phpMyadmin 설치까지 진행 하도록 하겠습니다.

1.  MySQL 설치
[root@ruo91 ~]# yum -y install mysql mysql-server

MySQL 를 서비스에 등록을 해줍니다.
[root@ruo91 ~]# chkconfig --levels 235 mysqld on

MySQL 을 실행 합니다.
[root@ruo91 ~]# /etc/init.d/mysqld start

MySQL 을 처음 설치 하면 기본 root 비밀번호가 설정 되어 있지 않으므로 mysqladmin 으로 설정 해줍니다.
[root@ruo91 ~]# mysqladmin -u root password 비밀번호

2. Apache 설치

[root@ruo91 ~]# yum -y install httpd

Apache 를 서비스에 등록 시켜 줍니다.
[root@ruo91 ~]# chkconfig --levels 235 httpd on

3. PHP 설치

[root@ruo91 ~]# yum -y install php php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc

4. phpMyadmin 설치

phpmyadmin 는 기본 저장소에 없으므로 RPM Forge 에서 패키지 정보를 다운로드 후 설치 하셔야 합니다.
아래 사이트에 들어가시게 되면 그림과 같이 오른쪽 부분에 해당 시스템에 맞는 패키지 파일을 다운로드 받아 주시면 됩니다.
http://packages.sw.be/rpmforge-release/
사용자 삽입 이미지
[root@ruo91 ~]# wget \
http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

다운받은 rpm 패키지를 설치 해줍니다.
[root@ruo91 ~]# rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

phpmyadmin 을 설치 합니다.
[root@ruo91 ~]# yum -y install phpmyadmin

phpmyadmin 설정 파일에 알리아스(Alias) 부분만 남기고 모두 주석(#) 처리 합니다.
[root@ruo91 ~]# vi /etc/httpd/conf.d/phpmyadmin.conf
#
#  Web application to manage MySQL
#
#<Directory "/usr/share/phpmyadmin">
#  Order Deny,Allow
#  Deny from all
#  Allow from 127.0.0.1
#</Directory>
#
Alias /phpmyadmin /usr/share/phpmyadmin
Alias /phpMyAdmin /usr/share/phpmyadmin
Alias /mysqladmin /usr/share/phpmyadmin
phpmyadmin 의 인증 방법을 변경 합니다.
기본값은 cookie 로 되어 있는데 이 인증 방식은 보안상 좋지 않으므로 http 형식으로 로그인 창이 뜨도록 해줍니다.
[root@ruo91 ~]# vi /usr/share/phpmyadmin/config.inc.php
사용자 삽입 이미지

변경 전
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
변경 후
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'http';

5. 웹페이지 확인

웹페이지 확인을 위해서 Apache 를 시작 합니다.
[root@ruo91 ~]# /etc/init.d/httpd start
httpd (을)를 시작 중: [  OK  ]

기본 웹 페이지 확인
사용자 삽입 이미지

PHP 와 연동이 잘되었는지 확인 하기 위해 phpinfo 페이지를 하나 생성합니다.
[root@ruo91 ~]# echo '<?php phpinfo(); ?>' > /var/www/html/phpinfo.php
사용자 삽입 이미지

phpmyadmin 페이지 확인
사용자 삽입 이미지

2009/11/19 12:43 2009/11/19 12:43

FreeBSD - chflags 명령어

from FreeBSD 2009/11/18 03:28
chflags 는 해당 파일의 모드를 읽기 전용으로 변경 해줍니다. (리눅스의 chattr 모드와 같은..)

chflags 사용법
[root@yongbok ~]# chflags [option] [flags] [file]
사용 예
해당 파일을 읽기 전용(read only) 모드로 변경시
[root@yongbok ~]# chflags schg hello.c
해당 파일의 읽기 전용(read only) 모드를 해제시
[root@yongbok ~]# chflags -R nouchg  hello.c

플래그(Flags)
arch, archived
set the archived flag (super-user only)

opaque
set the opaque flag (owner or super-user only)

nodump
set the nodump flag (owner or super-user only)

sappnd, sappend
set the system append-only flag (super-user only)

schg, schange, simmutable
set the system immutable flag (super-user only)

sunlnk, sunlink
set the system undeletable flag (super-user only)

uappnd, uappend
set the user append-only flag (owner or super-user only)

uchg, uchange, uimmutable
set the user immutable flag (owner or super-user only)

uunlnk, uunlink
set the user undeletable flag (owner or super-user only)

더 자세한 내용은 man 페이지 참조 ( http://www.freebsd.org/cgi/man.cgi?query=chflags&sektion=1 )
[root@yongbok ~]# man chflags
2009/11/18 03:28 2009/11/18 03:28

리눅스 OpenVPN 구축

from Linux 2009/11/07 22:09
VPN?
가상 사설망(Virtual private network)은 공중 네트워크를 통해 한 회사나 몇몇 단체가 내용을 바깥 사람에게 드러내지 않고 통신할 목적으로 쓰이는 사설 통신망을 뜻합니다.  보통 해외에서 몇몇 사이트 차단으로 접근 불가능한  곳을 뚫는데 사용하기도 합니다. 더 자세한건 위키피디아를 참고하세요.
http://ko.wikipedia.org/wiki/VPN

1. OpenVPN 설치
필자는 CentOS 5.4 이므로 yum 을 통해 설치를 진행했습니다.
yum 으로 설치하기 위해서는 rpmforge 저장소를 추가 해줘야 합니다.
[root@ruo91 ~]# wget rpmforge-release-0.3.6-1.el5.rf.i386.rpm
[root@ruo91 ~]# rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

OpenVPN 을 설치합니다.
[root@ruo91 ~]# yum -y install openvpn

2. OpenVPN 서버 키(key) 추가
설치가 완료되면 vars 파일 내용 중 맨 아래 부분을 사용자 환경에 맞게 편집을 해줍니다.
[root@ruo91 ~]# cd /usr/share/doc/openvpn-2.0.9/easy-rsa/2.0/
[root@ruo91 2.0]# vi vars
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="KR"
export KEY_PROVINCE="NA"
export KEY_CITY="Seoul"
export KEY_ORG="OpenVPN-ruo91"
export KEY_EMAIL="ruo91@yongbok.net"

편집한 vars 의 환경변수를 적용 해줍니다.
[root@ruo91 2.0]# chmod +rwx *
[root@ruo91 2.0]# source ./vars
[root@ruo91 2.0]# ./clean-all

ca.crt, ca.key 를 생성을 해주면 현재 디렉토리에 keys 디릭토리가 생성 됩니다.
(그냥 엔터 눌러서 생성하면 됩니다.)
[root@ruo91 2.0]# ./build-ca
Generating a 1024 bit RSA private key
..++++++
..........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KR]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [Seoul]:
Organization Name (eg, company) [OpenVPN-ruo91]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [OpenVPN-ruo91 CA]:
Email Address [ruo91@yongbok.net]:

서버로 사용될 키를 생성 해줄때 마지막 물어보는 2가지 항목에서 y 를 눌러 동의 하고 넘어 갑니다.
[root@ruo91 2.0]# ./build-key-server server
Generating a 1024 bit RSA private key
........++++++
.......++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KR]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [Seoul]:
Organization Name (eg, company) [OpenVPN-ruo91]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Email Address [ruo91@yongbok.net]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn-2.0.9/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'KR'
stateOrProvinceName   :PRINTABLE:'NA'
localityName          :PRINTABLE:'Seoul'
organizationName      :PRINTABLE:'OpenVPN-ruo91'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'ruo91@yongbok.net'
Certificate is to be certified until Nov  5 20:33:41 2019 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

3. OpenVPN 클라이언트 사용자 키 추가
VPN 을 사용할 클라이언트의 사용자 키를 만들어 줍니다. 이것 역시 서버키 생성과 마찬가지로 마지막 물어보는 2가지 항목에서 y 를 눌러 동의 하고 넘어 갑니다.
[root@ruo91 2.0]# ./build-key ruo91
Generating a 1024 bit RSA private key
.........++++++
..................................................................................++++++
writing new private key to 'ruo91.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KR]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [Seoul]:
Organization Name (eg, company) [OpenVPN-ruo91]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [ruo91]:
Email Address [ruo91@yongbok.net]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn-2.0.9/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'KR'
stateOrProvinceName   :PRINTABLE:'NA'
localityName          :PRINTABLE:'Seoul'
organizationName      :PRINTABLE:'OpenVPN-ruo91'
commonName            :PRINTABLE:'ruo91'
emailAddress          :IA5STRING:'ruo91@yongbok.net'
Certificate is to be certified until Nov  5 20:38:27 2019 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

이제 최종적으로 pem 파일을 만들어 줍니다.
[root@ruo91 2.0]# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
............+...................+..........................................+................................+.........+.....................
.........................................................+.............................+.................................................+...
.........................+....................................+...............................................................................
..................+...........................................+.....+.........................................................................
............+...........................+..............................................................................................+.....
...........+......................+................................+............................................++*++*++*

위에서 생성한 키 파일들 확인 해봤습니다.
[root@ruo91 2.0]# ls -al ../keys/
합계 76
drwx------ 2 root root 4096 11월  8  2009 .
drwxr-xr-x 3 root root 4096 11월  8  2009 ..
-rw-r--r-- 1 root root 3889 11월  8  2009 01.pem
-rw-r--r-- 1 root root 3767 11월  8  2009 02.pem
-rw-r--r-- 1 root root 1237 11월  8  2009 ca.crt
-rw------- 1 root root  887 11월  8  2009 ca.key
-rw-r--r-- 1 root root  245 11월  8  2009 dh1024.pem
-rw-r--r-- 1 root root  209 11월  8  2009 index.txt
-rw-r--r-- 1 root root   20 11월  8  2009 index.txt.attr
-rw-r--r-- 1 root root   21 11월  8  2009 index.txt.attr.old
-rw-r--r-- 1 root root  105 11월  8  2009 index.txt.old
-rw-r--r-- 1 root root 3767 11월  8  2009 ruo91.crt
-rw-r--r-- 1 root root  668 11월  8  2009 ruo91.csr
-rw------- 1 root root  887 11월  8  2009 ruo91.key
-rw-r--r-- 1 root root    3 11월  8  2009 serial
-rw-r--r-- 1 root root    3 11월  8  2009 serial.old
-rw-r--r-- 1 root root 3889 11월  8  2009 server.crt
-rw-r--r-- 1 root root  668 11월  8  2009 server.csr
-rw------- 1 root root  887 11월  8  2009 server.key

4. OpenVPN 설정파일 추가
openvpn.conf 환결 설정 파일을 생성합니다.
[root@ruo91 2.0]# pwd
/usr/share/doc/openvpn-2.0.9/easy-rsa/2.0
[root@ruo91 2.0]# cd ../../
[root@ruo91 openvpn-2.0.9]# vi openvpn.conf
# vpn 서버로 사용할 포트를 지정 합니다.
port 1194
# TCP 프로토콜을 사용합니다.
proto tcp
dev tun
# 위에서 생성한 key 파일의 경로를 지정해줍니다.
ca easy-rsa/2.0/keys/ca.crt
cert easy-rsa/2.0/keys/server.crt
key easy-rsa/2.0/keys/server.key
dh easy-rsa/2.0/keys/dh1024.pem
# VPN 클라이언트가 사용할 아이피 대역을 지정해줍니다.
# 10.10.10.0 ~ 10.10.10.254 까지 DHCP로 할당 됩니다.
server 10.10.10.0 255.255.255.0
# 클라이언트에 아이피를 할당시 DNS 서버를 지정 해줍니다.
# VPN 자체의 DNS 서버가 있다면 더욱 좋습니다.
push "dhcp-option DNS 168.126.63.1"
push "dhcp-option DNS 168.126.63.2"
# 만약 VPN 클라이언트의 네트워크 환경이 10.10.10.0 대역의 아이피가 존재 한다면
# 자동으로 192.168.100.0 대역으로 변경해서 할당 받게 해줍니다.
push "route 192.168.100.0 255.255.255.0"
# 머무르는 시간입니다.
keepalive 10 120
comp-lzo
# 사용자/그룹을 nobody 로 VPN 서버를 실행합니다.
user nobody
group nobody
persist-key
persist-tun
# VPN 서버 로그를 활성화 합니다.
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 3
client-to-client
duplicate-cn

환경 설정파일을 수정하기 쉽도록 /etc 디렉토리에 심볼릭 링크를 샤방하게 걸어줍니다.
[root@ruo91 ~]# ln -s /usr/share/doc/openvpn-2.0.9 /etc/openvpn

5. OpenVPN 서버 실행
OpenVPN 서버를 서비스에 등록 후 실행 합니다.
[root@ruo91 ~]# chkconfig --add openvpn
[root@ruo91 ~]# /etc/init.d/openvpn start
openvpn을 시작 중: [  OK  ]
[root@ruo91 ~]# netstat -ant | grep 1194
tcp        0      0 0.0.0.0:1194                0.0.0.0:*                   LISTEN

6. OpenVPN 클라이언트 설정
윈도우용 GUI OpenVPN 클라이언트를 아래 사이트에서 다운로드 받고 설치를 합니다.
http://openvpn.se/download.html
설치시에 아래와 같은 윈도우 호환 테스트 메세지가 나오면 계속을 눌러 나머지 설치를 진행 합니다.
사용자 삽입 이미지

설치가 완료 되면 윈도우 트레이부분에 OpenVPN 클라이언트와 연결되지 않는 로컬영역 연결이 보입니다.
사용자 삽입 이미지

리눅스 서버에서 생성한 사용자 키 ca.crt, ruo91.crt, ruo91.key 3가지 파일을 안전하게 윈도우로 다운로드 하여 윈도우용 OpenVPN 이 설치된 경로인 C:\Program Files\OpenVPN\config 에 넣어 줍니다.

클라이언트 설정파일을 C:\Program Files\OpenVPN\sample-config 에 가서 client.ovpn 파일을 config 폴더로 복사 해옵니다.

사용자 삽입 이미지

복사된 client.ovpn 파일을 메모장이나 아래와 같이 윈도우 시계쪽 트레이 부분에 OpenVPN 클라이언트에 마우스 오른쪽 클릭하여 Edit Config 를 눌러서 클라이언트 설정을 편집을 해줍니다.

사용자 삽입 이미지

아래는 클라이언트 설정 파일인 client.ovpn 내용입니다. 사용자 환경에 맞게 수정 해주시면 됩니다.

# 클라이언트로 설정
client
#
dev tun
# TCP 프로토콜 사용
proto tcp
# VPN 서버의 도메인주소 또는 아이피주소 와 포트를 설정
# remote VPN서버 포트
remote yongbok.net 1194

# Keep trying indefinitely to resolve the
# host name of the OpenVPN server.  Very useful
# on machines which are not permanently connected
# to the internet such as laptops.
resolv-retry infinite

# Most clients don't need to bind to
# a specific local port number.
nobind

# Try to preserve some state across restarts.
persist-key
persist-tun
# 사용자 키 파일 경로 지정
ca ca.crt
cert ruo91.crt
key ruo91.key
#
comp-lzo
#
# Set log file verbosity.
verb 3

윈도우 시계쪽 트레이 부분에 OpenVPN 클라이언트를 더블클릭 하게 되면 자동으로 VPN 서버로 접속이 됩니다.
서버 접속 상황을 보여주다가 연결이 성립되면 자동으로 사라집니다.
사용자 삽입 이미지

 VPN 서버와 정상적으로 연결된 화면입니다.
사용자 삽입 이미지

연결된 상태 확인
사용자 삽입 이미지

VPN 서버와 클라이언트 간의 핑 테스트를 해봅니다.
사용자 삽입 이미지

참고
http://wiki.kldp.org/wiki.php/OpenVPN
http://www.howtoforge.com/openvpn-server-on-centos-5.2
http://openvpn.net/index.php/open-source/documentation/howto.html#install
2009/11/07 22:09 2009/11/07 22:09