<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>디지문닷넷</title>
		<link>http://www.digimoon.net/blog/</link>
		<description>DigiMoon 맘대로 닦고 조이고 기름치는 재미가 있는 DigiMoon만의 기억 저장소</description>
		<language>ko</language>
		<pubDate>Fri, 12 Mar 2010 01:49:45 +0900</pubDate>
		<generator>Textcube 1.7.8 : Con moto</generator>
		<image>
		<title>디지문닷넷</title>
		<url>http://www.digimoon.net/blog/attach/1/1328558559.gif</url>
		<link>http://www.digimoon.net/blog/</link>
		<width>190</width>
		<height>175</height>
		<description>DigiMoon 맘대로 닦고 조이고 기름치는 재미가 있는 DigiMoon만의 기억 저장소</description>
		</image>
		<item>
			<title>써니 주부애 (주먹을 부르는 애교)</title>
			<link>http://www.digimoon.net/blog/346</link>
			<description>&lt;P align=center&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/iPQXrhlT-CM&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=ko_KR&amp;amp;feature=player_embedded&amp;amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/iPQXrhlT-CM&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=ko_KR&amp;amp;feature=player_embedded&amp;amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowScriptAccess=&quot;always&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/P&gt;</description>
			<category>유희</category>
			<category>써니</category>
			<category>주먹을 부르는 애교</category>
			<category>주부애</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/346</guid>
			<comments>http://www.digimoon.net/blog/346#entry346comment</comments>
			<pubDate>Tue, 02 Mar 2010 10:56:54 +0900</pubDate>
		</item>
		<item>
			<title>suPHP로 웹서버 보안을 강화하자</title>
			<link>http://www.digimoon.net/blog/345</link>
			<description>&lt;FONT color=#0000ff&gt;작성자: 주인장 &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;디지문&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;(&lt;A href=&quot;http://www.digimoon.net/&quot; target=_blank&gt;http://www.digimoon.net/&lt;/A&gt;)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;BR&gt;공식 사이트 : &lt;INS&gt;&lt;FONT color=#0000ff&gt;&lt;A href=&quot;http://suphp.org/&quot; target=_blank&gt;http://suphp.org&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/INS&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;웹서버 보안을 위한 예방책으로 mod_suphp라는 아파치 웹서버 모듈을 소개하고자 합니다.&lt;BR&gt;&amp;nbsp;해외에서는 suPHP가 이미 널리 사용되고 있는 모양입니다. 그러나 국내엔 구글링 등을 통해 관련 한글문서를 검색해도 거의 자료가 나오지 않더군요. suPHP의 국내 확산을 위해 문서를 한 번 만들어 보았습니다.&lt;BR&gt;&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;&lt;STRONG&gt;suPHP란?&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;BR&gt;suPHP 는 일종의 PHP wrapper 기능과 Apache module (mod_suphp) 를 제공한다고 보면 된다.&lt;BR&gt;&lt;BR&gt;각 사용자들의 cgi-bin 디렉토리에 PHP 바이너리를 넣지 않고도 PHP 스크립트를 실행할 수 있도록 하여주며 아파치의 suExec 를 필요로 하지도 않는다.&lt;BR&gt;&lt;BR&gt;또한 로깅 기능도 제공하여 주고 있다.&lt;/DIV&gt;&lt;BR&gt;▲ 원문출처: &lt;A href=&quot;http://cafe.naver.com/ArticleRead.nhn?clubid=10576009&amp;amp;articleid=7351&quot; target=_blank&gt;http://cafe.naver.com/ArticleRead.nhn?clubid=10576009&amp;amp;articleid=7351&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;사실 제 경우는 보안 문제를 떠나서 suPHP 도입이 상당히 끌리는 이유가 따로 있었으니 바로 웹호스팅 환경에서 계정별 디스크 quota 설정이 보다 더 용이해진다는 점이었습니다.&lt;BR&gt;&amp;nbsp;아파치 웹서버를 사용하는 경우 웹상에서 첨부파일 형식으로 업로드된 데이터의 경우는 해당 계정 소유권이 아닌 아파치 웹서버 소유권(nobody 또는 apache)으로 올라가기에 해당 계정의 홈디렉토리에서 아파치 소유권으로 올라가 있는 데이터는 nobody 또는 apache 계정의 쿼터 수치로 따로 계산되는 quota 설정의 맹점을 극복하기가 어려워질 수 밖에 없습니다.&lt;BR&gt;&amp;nbsp;그러나 suPHP를 도입하면 웹으로 데이터를 업로드한다 하더라도 아파치 웹서버 소유권이 아닌 해당 계정의 소유권으로만 올라가기에 정확한 쿼터 설정이 가능하게 됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이렇게 되면 또 하나 반가운 장점이 생기게 되는데 제로보드4, 그누보드, 텍스트큐브, XE 등과 같은 게시판 어플을 사용시 기존 아파치 소유권으로만 데이터가 들어가던 디렉토리와 파일을 FTP나 SSH 상에서 삭제할 수 없던 문제점도 해결된다는 겁니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;위 2가지 장점만으로도 웹호스팅을 운영하고 있거나 운영을 계획하고 있던 분들께는 반가운 소식이 될 것으로 봅니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;보안상 얻을 수 있는 장점으로는 shPHP 설정으로 디렉토리는 755, 파일은 644 이상의 퍼미션을 부여하지 않아도 정상적인 웹서비스가 가능해진다는 것입니다. other 퍼미션에 쓰기 권한을 주어야 설치가 가능했던 제로보드4, 그누보드 등을 비롯한 각종 어플리케이션을 설치할 때엔 707이나 777 퍼미션을 줄 필요 없이 그냥 설치를 진행하면 됩니다. 취약한 707, 777 퍼미션을 허용하지 않으니 웹크래킹 예방에 큰 도움이 될 수 있겠죠.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이렇게 보안과 기능상 이점을 두루 얻을 수 있는 suPHP를 CentOS 5.x 32bit에 도입해 보도록 하겠습니다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;APM 구성: Apache 2.0.63, PHP 5.2.10, MySQL 5.0.77, Zend Optimizer 3.3.3&lt;BR&gt;&lt;A href=&quot;http://suphp.org/Home.html&quot; target=_blank&gt;&lt;BR&gt;&lt;/A&gt;&lt;BR&gt;&amp;nbsp;suPHP 설치의 핵심은 php 설치 방식의 변화에 있습니다. 각종 문서에 두루 소개되어 있는 아파치 웹서버에 모듈형으로 연동하는 PHP엔 suPHP를 적용할 수 없습니다. PHP를 CGI 바이너리 형태로 설치해야 합니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;▼ apache 컴파일 옵션 (prefork가 아닌 worker 방식으로 설치할 경우 suphp 작동 시 아파치 에러 로그에 child process 관련 에러를 내뿜는 경우가 있어 prefork로 설치할 것을 권장합니다) 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# ./configure --prefix=/usr/local/apache --enable-mods-shared=all --enable-ssl --with-mpm=prefork --enable-suexec --with-suexec --with-suexec-caller=nobody --with-suexec-docroot=/home --with-suexec-logfile=/usr/local/apache/logs/suexec.log --with-suexec-uidmin=500 --with-suexec-gidmin=500 --enable-cgid --enable-cache --enable-disk-cache --enable-mem-cache --enable-deflate&lt;/DIV&gt;&lt;BR&gt;▼ php 컴파일 옵션 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# ./configure --prefix=/usr/local/php --enable-mod-charset --enable-safe-mode --enable-sigchild --enable-magic-quotes --with-libxml-dir --with-openssl --with-zlib --with-zlib-dir --with-bz2 --enable-calendar --with-curl --enable-dba --with-gdbm --enable-exif --enable-ftp --with-gd --with-jpeg-dir --with-png-dir &amp;nbsp;--with-ttf --with-freetype-dir --enable-gd-native-ttf --with-gettext --with-imap --with-imap-ssl --with-kerberos --enable-mbstring --with-mhash --with-mcrypt --with-mysql=/usr/local/mysql --enable-sockets --with-regex=php --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --enable-zend-multibyte &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;--enable-force-cgi-redirect --enable-fastcgi&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/DIV&gt;※ 여태 아파치에 DSO 방식으로 php를 연동해서 쓰던 옵션에서 다른 부분은 크게 손 볼 필요 없이 --with-apxs(아파치 2.x.x의 경우 --with-apxs2)만 제거하고 --enable-force-cgi-redirect --enable-fastcgi 옵션만 추가해 주면 무난하게 적용 가능할 것입니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;APM 구성이 끝났으면 이제 mod_suphp 최신 소스를 배포 사이트에서 받아 설치합니다.&lt;BR&gt;apr 패키지를 필요로 하므로 apr 관련 패키지를 먼저 설치합니다.&lt;BR&gt;&lt;BR&gt;▼ apr 패키지 설치 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# yum -y install apr apr-devel&lt;/DIV&gt;&lt;BR&gt;▼ suPHP 모듈 설치(DSO 방식으로 추가) 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# wget &lt;A href=&quot;http://suphp.org/download/suphp-0.7.1.tar.gz&quot; target=&quot;&quot;&gt;http://suphp.org/download/suphp-0.7.1.tar.gz&lt;/A&gt;&lt;BR&gt;[root@localhost ~]# tar xvfz suphp-0.7.1.tar.gz&lt;BR&gt;[root@localhost ~]# cd suphp-0.7.1&lt;BR&gt;[root@localhost suphp-0.7.1]# ./configure --sysconfdir=/usr/local/apache/conf --with-apr=/usr/bin/apr-1-config --with-apxs=/usr/local/apache/bin/apxs --with-apache-user=nobody --with-php=/usr/local/php/bin/php-cgi&lt;BR&gt;[root@localhost suphp-0.7.1]# make &lt;BR&gt;[root@localhost suphp-0.7.1]# make install&lt;BR&gt;&lt;/DIV&gt;&lt;BR&gt;▼ 아파치 httpd.conf에 아래 설정 추가&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;LoadModule suphp_module &amp;nbsp; &amp;nbsp; &amp;nbsp; modules/mod_suphp.so&lt;/DIV&gt;&lt;BR&gt;▼ suphp.conf 파일 설정 &lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# cat /usr/local/apache/conf/suphp.conf 
&lt;P&gt;[global]&lt;BR&gt;;Path to logfile&lt;BR&gt;logfile=/usr/local/apache/logs/suphp.log&lt;/P&gt;
&lt;P&gt;;Loglevel&lt;BR&gt;loglevel=info&lt;/P&gt;
&lt;P&gt;;User Apache is running as&lt;BR&gt;webserver_user=nobody&lt;/P&gt;
&lt;P&gt;;Path all scripts have to be in&lt;BR&gt;docroot=/usr/local/apache/htdocs:${HOME}/www&lt;/P&gt;
&lt;P&gt;;Path to chroot() to before executing script&lt;BR&gt;;chroot=/mychroot&lt;/P&gt;
&lt;P&gt;; Security options&lt;BR&gt;allow_file_group_writeable=false&lt;BR&gt;allow_file_others_writeable=false&lt;BR&gt;allow_directory_group_writeable=false&lt;BR&gt;allow_directory_others_writeable=false&lt;/P&gt;
&lt;P&gt;;Check wheter script is within DOCUMENT_ROOT&lt;BR&gt;check_vhost_docroot=true&lt;/P&gt;
&lt;P&gt;;Send minor error messages to browser&lt;BR&gt;errors_to_browser=false&lt;/P&gt;
&lt;P&gt;;PATH environment variable&lt;BR&gt;env_path=/bin:/usr/bin&lt;/P&gt;
&lt;P&gt;;Umask to set, specify in octal notation&lt;BR&gt;umask=022&lt;/P&gt;
&lt;P&gt;; Minimum UID&lt;BR&gt;min_uid=500&lt;/P&gt;
&lt;P&gt;; Minimum GID&lt;BR&gt;min_gid=500&lt;/P&gt;
&lt;P&gt;[handlers]&lt;BR&gt;;Handler for php-scripts&lt;BR&gt;x-httpd-php=&quot;php:/usr/local/php/bin/php-cgi&quot;&lt;/P&gt;;Handler for CGI-scripts&lt;BR&gt;x-suphp-cgi=&quot;execute:!self&quot;&lt;BR&gt;[root@localhost ~]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;▼ apache 가상호스트 설정(푸른색으로 추가한 부분) 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; DocumentRoot /home/aaa/www&lt;BR&gt;&amp;nbsp; &amp;nbsp; ServerName www.aaa.com&lt;BR&gt;&amp;nbsp; &amp;nbsp; ServerAlias aaa.com&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;&amp;lt;IfModule mod_suphp.c&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; suPHP_Engine On&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; suPHP_UserGroup aaa aaa&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; AddHandler x-httpd-php .html .htm .php .php3 .php4 .php5 .phtml .cgi .inc&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; suPHP_AddHandler x-httpd-php .html .htm .php .php3 .php4 .php5 .phtml .cgi .inc&lt;BR&gt;&amp;nbsp;&amp;lt;/IfModule&amp;gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이제 제로보드나 그누보드 등을 설치해 보시기 바랍니다.&lt;BR&gt;&amp;nbsp;707, 777 퍼미션 변경을 어플리케이션에서 요구할 것이나 보안상 suPHP가 이를 막습니다. 퍼미션 변경 없이 그대로 진행 가능합니다.&lt;BR&gt;&amp;nbsp;그리고 게시판 상에서 파일을 첨부한 뒤 해당 파일이 업로드되어 있는 경로를 FTP나 SSH 쉘상에서 확인해 보면 종전까지는 nobody나 apache와 같은 웹서버 소유권으로만 올라가던 것이 이젠 해당 계정의 소유권으로 올라가 있는 것을 확인할 수 있을 것입니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이렇게 suPHP의 장점을 강조하며 포스팅을 해 보았으나 실제 테스트를 해 보니 이미 서비스 중인 웹서버에 도입하기에는 쉽지 않은 작업이 될 것으로 보입니다.&lt;BR&gt;&amp;nbsp;일단 제로보드4, 그누보드, XE, 텍스트큐브와 같은 각종 어플리케이션을 초기 설정값 그대로 사용하기에는 조금 어려운 점이 있을 수 있습니다. 설치 단계나 실 운영 중에 디렉토리나 파일 퍼미션을 707이나 777로 강제하는 소스가 있기 때문이죠. 제로보드4의 경우엔 기본 게시판 소스 뿐만 아니라 각종 플러그인, 스킨 게시판 소스 상에서의 적절한 수정 작업이 불가피했습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;일단 제로보드4의 경우 아래 소스는 필수적으로 수정해야 하는 것으로 테스트 결과 확인하였습니다.&lt;BR&gt;&amp;nbsp;bbs/lib.php 파일의 아래 부분 수정(994번째 줄 근처, 붉은색 부분처럼 수정)&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;// 파일을 삭제하는 함수&lt;BR&gt;&amp;nbsp; function z_unlink($filename) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; @chmod($filename,&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;0755&lt;/STRONG&gt;&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp; &amp;nbsp; $handle = @unlink($filename);&lt;BR&gt;&amp;nbsp; &amp;nbsp; if(@file_exists($filename)) {&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; @chmod($filename,&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;0755&lt;/STRONG&gt;&lt;/FONT&gt;);&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $handle=@unlink($filename);&lt;BR&gt;&amp;nbsp; &amp;nbsp; }&lt;BR&gt;&amp;nbsp; &amp;nbsp; return $handle;&lt;BR&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;널리 사용되는 또다른 어플 중 하나인 XE(XpressEngine)의 경우는 게시판 설치 및 초기 운영 단계에서는 소스 수정이 필요 없었습니다.&lt;BR&gt;&amp;nbsp;어쨌든 여타 다른 어플리케이션의 경우 소스 수정이 불가피한 경우가 생긴다면 위에 소개한 제로보드4 소스 수정의 경우과 같이 게시물 작성 및 수정, 첨부파일 업로드 등에 관여하는 소스에서 퍼미션을 707 이상으로 강제하는 부분을 수정해야 하는 때일 것입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;그리고 또 하나 난관으로 작용하는 점이 있습니다. 아파치의 버추얼호스트 설정에서 root 소유권의 디렉토리 영역을 DocumentRoot 옵션으로 잡아 운영하고 있는 각종 소스에 대한 문제입니다. 주로 mrtg, webalizer, squirrelmail과 같은 웹브라우저를 통한 제어 및 열람을 지원하는 어플리케이션들이 이에 해당합니다. &lt;BR&gt;&amp;nbsp;suPHP는 보안상 UID/GID 500 이상의 시스템 계정 소유권에 한해서만 755, 644 퍼미션 이하의 디렉토리 및 파일의 웹접근을 허용하고자 하는 취지에서 고안되어 나온 모듈입니다. mrtg, webalizer 등의 문제까지 해결하고자 한다면 root를 비롯한 UID/GID 500 이하의 계정에도 suPHP를 통한 웹접근이 가능토록 suphp.conf 파일의 min_uid=500 , min_gid=500 옵션의 수치를 하향 조정하는 수 밖에 없게 되는데 이렇게 하면 보안으로서의 의미가 퇴색될 수 밖에 없습니다.&lt;BR&gt;&amp;nbsp;이를 극복하려면 cron을 이용하여 root로 생성되어 있는 파일을 주기적으로 특정 계정 소유권으로 강제 변환시키거나 suPHP를 적용하지 않는 Apache + PHP 세트를 하나 더 설치해서 운영하면 됩니다. 그리고 포트는 80번을 피한 다른 포트를 이용해야 하겠죠.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;지금까지 suPHP 설치 방법과 장단점을 간략하게나마 열거해 보았습니다. 검색 사이트에서 수집되는 정보들만 확인한 바로는 국내엔 도입 사례가 많지 않은 것으로 보입니다. suPHP 환경에서 정상 작동하는 어플리케이션에 관한 정확한 정보 확산을 위해서는 suPHP 설치에 관한 자료가 먼저 확산되길 바라는 수 밖에 없겠습니다. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;끝으로 본 문서를 작성하는데 큰 도움을 주신 스타호스트(&lt;A href=&quot;http://starhost.co.kr/&quot; target=_blank&gt;http://starhost.co.kr&lt;/A&gt;) 운영자님께 깊은 감사의 뜻을 전합니다. 스타호스트님께서 suPHP 지원 어플리케이션 리스트를 계속 업데이트 중이시니 아래 URL 참고하시기 바랍니다.&lt;BR&gt;&lt;A href=&quot;http://www.starhost.co.kr/xe/hosting_tip/2898&quot; target=_blank&gt;http://www.starhost.co.kr/xe/hosting_tip/2898&lt;/A&gt;</description>
			<category>리눅스</category>
			<category>modules</category>
			<category>nobody</category>
			<category>php</category>
			<category>suphp</category>
			<category>XE</category>
			<category>게시판</category>
			<category>그누보드</category>
			<category>단점</category>
			<category>모듈</category>
			<category>보안</category>
			<category>소유권</category>
			<category>아파치</category>
			<category>업로드</category>
			<category>웹호스팅</category>
			<category>장단점</category>
			<category>장점</category>
			<category>제로보드</category>
			<category>첨부파일</category>
			<category>컴파일</category>
			<category>텍스트큐브</category>
			<category>퍼미션</category>
			<category>허가권</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/345</guid>
			<comments>http://www.digimoon.net/blog/345#entry345comment</comments>
			<pubDate>Wed, 17 Feb 2010 16:53:51 +0900</pubDate>
		</item>
		<item>
			<title>OpenSSH chroot 설정</title>
			<link>http://www.digimoon.net/blog/343</link>
			<description>&amp;nbsp;&lt;FONT color=#0000ff&gt;작성자: 주인장 &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;디지문&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;(&lt;A href=&quot;http://www.digimoon.net/&quot; target=_blank&gt;http://www.digimoon.net/&lt;/A&gt;)&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;&amp;nbsp;무료 웹호스팅을 하면서 늘 아쉬웠던 점이 일반사용자들에게 SSH/SFTP를 개방하기 힘들다는 점이었습니다.&lt;BR&gt;SSH/SFTP를 통해 일반사용자 권한으로 쉘에 들어오면 &#039;/&#039; 디렉토리 하단으로 디렉토리 이동이 자유롭기에 서버관리자만이 드나들며 관리해야 할 영역이 너무 쉽게 노출이 된다는 점 때문이죠.&lt;BR&gt;&amp;nbsp;vsftpd, proftpd 등과 같이 ftp 서버 데몬의 경우는 환경설정파일에 간단하게 옵션 몇 줄만 추가해 주면 데몬 차원에서 상위 디렉토리 이동을 막을 수 있기에 FTP 서비스를 하는 경우는 크게 문제될 점이 없지만 일반사용자에게 쉘 접근권한을 주는 것은 안전장치를 마련해 놓지 않는 이상은 구현하기 어렵지는 않다 하더라도 다소 복잡한 설정이 필요하게 됩니다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;SSH서버 데몬으로 널리 쓰이는 오픈소스인 OpenSSH의 경우 종전까지는 기본으로 chroot 기능을 지원하지 않아 chroot 프로젝트를 통해 나온 소스포지(&lt;A href=&quot;http://sourceforge.net/&quot;&gt;http://sourceforge.net&lt;/A&gt;)에서 제공하는 패치 버전을 통해서만이 가능하였으나 OpenSSH 4.8p1 버전부터는 chroot 기능을 자체적으로 지원하기 시작하였습니다. 본 문서에서는 OpenSSH 5.x 버전을 이용한 chroot 구현 방법에 대해 소개합니다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;CentOS 5.x 64bit에서의 설치 및 설정 방법에 대해 설명합니다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;STRONG&gt;&lt;FONT size=3&gt;1. telnet-server 설치 및 설정, 기존 OpenSSH 삭제&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;우선 chroot를 지원하지 않는 기존의 OpenSSH를 삭제해야 합니다. OpenSSH를 삭제하게 되므로&amp;nbsp; 원격지에서 작업할 때엔 반드시 telnet과 같은 예비 접속 통로를 미리 마련해 놓고 작업을 시작하도록 합니다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;OpenSSH를 삭제하기 전에 telnet으로 원격 접속 수단을 먼저 마련합니다.&lt;/P&gt;&amp;nbsp;telnet-server가 설치되어 있는지 확인합니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost /usr/local/src]# rpm -qa | grep telnet-server&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;없으면 설치하고 xinetd 수퍼데몬으로 구동, iptables에 tcp 23번 포트를 열어줍니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost /usr/local/src]# yum -y install telnet-server&lt;BR&gt;[root@localhost /usr/local/src]# cat /etc/xinetd.d/telnet&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;# default: on&lt;BR&gt;# description: The telnet server serves telnet sessions; it uses \&lt;BR&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; unencrypted username/password pairs for authentication.&lt;BR&gt;service telnet&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; flags &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = REUSE&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; socket_type &amp;nbsp; &amp;nbsp; = stream&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wait &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; = no&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; = root&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; server &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; = /usr/sbin/in.telnetd&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; log_on_failure&amp;nbsp; += USERID&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; disable &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = no &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;&amp;lt;- 기존 yes를 no로 수정합니다.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;}&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost /usr/local/src]# /etc/init.d/xinetd restart&lt;BR&gt;xinetd 를 정지 중: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&amp;nbsp; OK&amp;nbsp; ]&lt;BR&gt;xinetd (을)를 시작 중: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&amp;nbsp; OK&amp;nbsp; ]&lt;BR&gt;[root@localhost /usr/local/src]# netstat -ntlp | grep xinetd&lt;BR&gt;tcp &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 0 &amp;nbsp; &amp;nbsp;&amp;nbsp; 0 0.0.0.0:23 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 0.0.0.0:* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LISTEN &amp;nbsp; &amp;nbsp;&amp;nbsp; 1685/xinetd&lt;BR&gt;[root@localhost ~]#iptables -I INPUT -p tcp --dport 23 -j ACCEPT&lt;BR&gt;[root@localhost /usr/local/src]# iptables -nL | grep 23&lt;BR&gt;ACCEPT &amp;nbsp; &amp;nbsp; tcp&amp;nbsp; --&amp;nbsp; 0.0.0.0/0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 0.0.0.0/0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tcp dpt:23&lt;BR&gt;[root@localhost /usr/local/src]#&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;이제 telnet으로 접속한 뒤 기존의 OpenSSH를 삭제합니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# yum -y remove openssh&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;2. OpenSSH 5.x 설치&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이제 새로운 OpenSSH를 설치해 보도록 하겠습니다.&lt;BR&gt;소스컴파일로 설치하는 방법은 인터넷에 수두룩하니 여기선 rpm으로 설치하는 방법을 다루겠습니다.&lt;BR&gt;srpm 파일을 받습니다. CentOS 5.x의 경우 2009년 11월 5일 현재 미러서버에서 아직까지도 5.x 버전의 rpm을 제공하지 않고 있군요. 하는 수 없이 페도라용 srpm을 받아 CentOS용으로 리빌드하여 설치해 보겠습니다. &lt;BR&gt;다행히 페도라10의 OpenSSH 5.1p1-4 srpm은 CentOS 5.4와 라이브러리 충돌 없이 궁합이 맞는군요. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# wget &lt;A href=&quot;ftp://ftp.kaist.ac.kr/fedora/linux/releases/10/Fedora/source/SRPMS/openssh-5.1p1-3.fc10.src.rpm&quot; target=&quot;&quot;&gt;ftp://ftp.kaist.ac.kr/fedora/linux/releases/10/Fedora/source/SRPMS/openssh-5.1p1-3.fc10.src.rpm&lt;/A&gt;&lt;BR&gt;[root@localhost ~]# rpm -ivh openssh-5.1p1-4.fc10.src.rpm&lt;BR&gt;[root@localhost ~]# cd /usr/src/redhat/SPECS/&lt;BR&gt;[root@localhost SPECS]# ls -lh&lt;BR&gt;합계 108K&lt;BR&gt;-rw-r--r-- 1 mockbuild mockbuild&amp;nbsp; 24K 11월&amp;nbsp; 2 19:31 dovecot.spec&lt;BR&gt;-rw-r--r-- 1 mockbuild mockbuild&amp;nbsp; 17K&amp;nbsp; 5월 19 21:22 iptables.spec&lt;BR&gt;-rw-r--r-- 1 root &amp;nbsp; &amp;nbsp;&amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 10월 30 00:02 kernel.spec&lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;-rw-r--r-- 1 mockbuild mockbuild&amp;nbsp; 50K&amp;nbsp; 6월 30 20:50 openssh.spec&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;-rw-rw-r-- 1 root &amp;nbsp; &amp;nbsp;&amp;nbsp; root &amp;nbsp; &amp;nbsp;&amp;nbsp; 6.6K&amp;nbsp; 5월 19&amp;nbsp; 2008 pptp.spec&lt;BR&gt;[root@localhost SPECS]#&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;리빌드해 보니 아래와 같이 의존성 에러를 내뿜는군요. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost SPECS]# rpmbuild -ba openssh.spec&lt;BR&gt;오류: Failed build dependencies:&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gtk2-devel is needed by openssh-5.1p1-4.i386&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; audit-libs-devel is needed by openssh-5.1p1-4.i386&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tcp_wrappers-devel is needed by openssh-5.1p1-4.i386&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libedit-devel is needed by openssh-5.1p1-4.i386&lt;BR&gt;[root@localhost SPECS]#&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;위 의존성 에러 결과는 시스템에 따라 다를 수 있습니다. 어쨌든 gtk2-devel, audit-libs, tcp_wrappers-devel, libedit-devel 패키지를 yum으로 설치합니다.&lt;BR&gt;&amp;nbsp;tcp_wrappers-devel, libedit-devel는 yum으로 설치 안 되는군요. 어쩔 수 없이 spec 파일을 직접 수정하여 관련된 설정 부분을 주석처리하거나 삭제하도록 합니다.&lt;BR&gt;&amp;nbsp;vi 편집기로 tcp_wrappers-devel, libedit-devel 라는 문자열이 들어가는 부분을 모두 삭제하고 페도라10에 포함된 pam-1.0.1-3 버전을 찾는 문제를 해결하기 위해 CentOS 5.x의 pam-0.99.6.2을 찾도록 수정한 spec 파일 견본을 첨부합니다. spec 파일 편집이 어려운 분들은 그대로 가져다 쓰시면 되겠습니다.&lt;BR&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://www.digimoon.net/blog/attachment/1142316943.spec&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; /&gt; openssh.spec&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;빌드하고 /usr/src/redhat/RPMS/x86_64 디렉토리 안으로 들어가면(32bit의 경우 /usr/src/redhat/RPMS/i386) rpm 파일이 생성되어 있는 것을 확인할 수 있습니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost SPECS]# rpmbuild -ba openssh.spec&lt;BR&gt;[root@localhost /usr/src/redhat/SPECS]# cd /usr/src/redhat/RPMS/x86_64/&lt;BR&gt;[root@localhost /usr/src/redhat/RPMS/x86_64]# ls -lh&lt;BR&gt;합계 8920&lt;BR&gt;drwxr-xr-x 2 root root &amp;nbsp;&amp;nbsp; 4096 11월&amp;nbsp; 5 09:29 ./&lt;BR&gt;drwxr-xr-x 4 root root &amp;nbsp;&amp;nbsp; 4096&amp;nbsp; 9월&amp;nbsp; 4 09:25 ../&lt;BR&gt;-rw-r--r-- 1 root root 1765164 11월&amp;nbsp; 2 19:14 dovecot-1.0.7-7.x86_64.rpm&lt;BR&gt;-rw-r--r-- 1 root root 4037311 11월&amp;nbsp; 2 19:14 dovecot-debuginfo-1.0.7-7.x86_64.rpm&lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;-rw-r--r-- 1 root root&amp;nbsp; 316357 11월&amp;nbsp; 5 09:29 openssh-5.1p1-3.x86_64.rpm&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 41130 11월&amp;nbsp; 5 09:29 openssh-askpass-5.1p1-3.x86_64.rpm&lt;BR&gt;-rw-r--r-- 1 root root&amp;nbsp; 510589 11월&amp;nbsp; 5 09:29 openssh-clients-5.1p1-3.x86_64.rpm&lt;BR&gt;-rw-r--r-- 1 root root 2100357 11월&amp;nbsp; 5 09:29 openssh-debuginfo-5.1p1-3.x86_64.rpm&lt;BR&gt;-rw-r--r-- 1 root root&amp;nbsp; 307443 11월&amp;nbsp; 5 09:29 openssh-server-5.1p1-3.x86_64.rpm&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;[root@localhost /usr/src/redhat/RPMS/x86_64]#&lt;/DIV&gt;&lt;BR&gt;설치합니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost /usr/src/redhat/RPMS/x86_64]# rpm -Uvh openssh-*&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;3. chroot 설정을 위한 /etc/ssh/sshd_config 수정&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;/etc/ssh/sshd_config 파일 최하단에 아래 설정을 추가하거나 기존 설정을 수정하고 sshd를 시작합니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;Subsystem sftp&amp;nbsp; internal-sftp&lt;BR&gt;Match Group chrootgroup&lt;BR&gt;ChrootDirectory /chroot&lt;/DIV&gt;※ Match Group과 ChrootDirectory 옵션의 순서가 서로 뒤바뀌지 않도록 합니다.&lt;BR&gt;&lt;BR&gt;위 설정에 의하면 시스템 최상위 경로에 /chroot 라는 디렉토리를 만들어 일반 계정의 쉘환경을 /chroot 에 국한시키는 겁니다. /chroot 디렉토리 하단에 bin, dev, usr, etc 등의 디렉토리를 동일하게 복사해 집어 넣고 home 디렉토리도 만들어 넣어 기존 home 사용자들은 /chroot/home에 위치시키면 됩니다.&lt;BR&gt;그러나 /chroot/home으로 몽땅 이동시키려면 아파치 버추얼호스트 설정도 모두 변경해 주어야 하고 /etc/passwd 파일에 기록된 계정 홈디렉토리 정보도 모두 수정해야 하는 번거로움이 있기 때문에 아래와 같은 방법으로 간단하게 해결할 수 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;기존 /home 디렉토리를 /chroot/home 디렉토리에 바인딩 마운트시키면 간단하게 해결됩니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# mkdir -p /chroot/home&lt;BR&gt;[root@localhost ~]# mount --bind /home /chroot/home&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;시스템 시작시 자동으로 마운트되도록 /etc/rc.d/rc.local 파일에 마운트 커맨드를 추가해 줍니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# echo &quot;mount --bind /home /chroot/home&quot; &amp;gt;&amp;gt; /etc/rc.d/rc.local&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이제 chroot를 적용할 시스템 계정의 그룹 소유권을 chrootgroup으로 변경합니다. chrootgroup이라는 이름의 그룹은 아까 /etc/ssh/sshd_config 파일에 추가한 Match Group 옵션에 지정해 준 그룹명으로 지정하는 것입니다.&lt;BR&gt;&amp;nbsp;/etc/passwd 파일을 열어 GID 부분을 chrootgroup 그룹의 GID로 수정하면 됩니다. asdf 라는 계정이 있다고 가정하고 작업해 보겠습니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# groupadd -g 499 chrootgroup&lt;BR&gt;[root@localhost ~]# cat /etc/passwd | grep asdf&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;asdf:x:998:&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;499&lt;/STRONG&gt;&lt;/FONT&gt;::/asdf:/bin/bash&lt;BR&gt;[root@localhost ~]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;4. 시스템 바이너리, 라이브러리 및 환경설정 파일 복사&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이제 제한된 쉘에서 사용을 허용할 시스템 커맨드 세팅을 위해 앞서 언급했던 /chroot 디렉토리 하단에 bin, dev, usr, etc 관련 시스템 디렉토리 및 파일을 복사해 넣는 작업을 해주면 됩니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# cd /chroot&lt;BR&gt;[root@localhost ~]# mkdir bin dev etc lib tmp usr&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;우선 null, zero와 같은 특수파일을 만들어 줍니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# mknod dev/null c 1 3&lt;BR&gt;[root@localhost ~]# mknod dev/zero c 1 5&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;실행 바이너리와 이에 연관된 각종 라이브러리를 복사해 넣어줍니다. 작업 요령은 간단합니다.&lt;BR&gt;&amp;nbsp;우선 시스템 커맨드 중 하나인 cp를 예로 들어보겠습니다.&lt;BR&gt;&amp;nbsp;cp 커맨드의 절대 경로는 아래와 같네요.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# which cp&lt;BR&gt;/bin/cp&lt;BR&gt;[root@localhost ~]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;ldd 커맨드로 바이너리 실행에 필요한 라이브러리를 파악할 수 있습니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# ldd /bin/cp&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; linux-gate.so.1 =&amp;gt;&amp;nbsp; (0xb7fa8000)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libacl.so.1 =&amp;gt; /lib/libacl.so.1 (0x48d0d000)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libselinux.so.1 =&amp;gt; /lib/libselinux.so.1 (0x48968000)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libc.so.6 =&amp;gt; /lib/libc.so.6 (0x477c0000)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libattr.so.1 =&amp;gt; /lib/libattr.so.1 (0x48d06000)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libdl.so.2 =&amp;gt; /lib/libdl.so.2 (0x47906000)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libsepol.so.1 =&amp;gt; /lib/libsepol.so.1 (0x48982000)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /lib/ld-linux.so.2 (0x477a2000)&lt;BR&gt;[root@localhost ~]#&lt;/DIV&gt;&amp;nbsp;위에 출력된 내용을 참고하여 관련 라이브러리 원본 및 심볼릭링크 파일을 복사해 넣어주면 됩니다.&lt;BR&gt;/lib/libacl.so.1 은 /chroot/lib/libacl.so.1 로 복사하면 되는 것이죠.&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;5. 실서비스를 위한 세부 설정&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;그러나 여기까지 작업을 마쳐도 실질적으로 chroot 환경의 ssh 서비스를 하기에는 미흡합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;지금까지의 설정만으로는 제한된 쉘을 이용하는 일반 사용자들이 /chroot 로 가두어진 쉘을 이용한다 하더라도 다른 계정 사용자들의 홈디렉토리로는 마음대로 이동이 가능하다는 단점이 남게 됩니다. 이는 chroot 설정으로 가두어진 쉘을 이용하는 모든 계정들을 하나의 그룹으로 묶고 각 계정 홈디렉토리의 그룹 퍼미션을 0으로 만들면 해결할 수 있습니다. &lt;BR&gt;&amp;nbsp;그러므로 /etc/ssh/sshd_config 파일에 정의했던 Match Group chrootgroup 옵션에 따라 /chroot/home 안의 사용자들은 모두 chrootgroup에 속하게 하고 각 계정 홈디렉토리 안의 모든 디렉토리와 파일의 그룹 퍼미션을 0으로 만들면 되겠죠. 이렇게 하면 chrootgroup 그룹에 속한 모든 계정은 오직 자신의 계정 디렉토리 내용만 읽기 및 쓰기, 실행이 가능하고 타 계정 사용자의 홈디렉토리는 접근 자체가 불가능하게 됩니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;우선 /chroot/home 하단의 모든 디렉토리 및 파일의 그룹 소유권을 chrootgroup으로 변경합니다. 아파치 웹서버의 경우 웹게시판 등을 통해 웹상에서 첨부파일로 업로드된 데이터나 nobody 소유권이어야 정상 작동하는 웹소스의 경우 nobody 소유권을 그대로 유지하여야 하므로 무작정 일괄 변경해서는 안됩니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# find /chroot/home \( ! -user nobody -o ! -group nobody \) -exec chown .chrootgroup {} \;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;그리고 아래와 같이 명령을 내려 /chroot/home 하단의 chrootgroup에 속한 모든 계정의 디렉토리와 파일의 그룹퍼미션을 0으로 만듭니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# find /chroot/home -group chrootgroup -exec chmod g-w-r-x {} \;&lt;BR&gt;&lt;/DIV&gt;&lt;BR&gt;그렇게 해서 설정한 /chroot 하단의 디렉토리 및 파일의 소유권 및 퍼미션 구성도를 정리하면 아래와 같습니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost /]# ls -lh / | grep chroot&lt;BR&gt;drwx--x--x&amp;nbsp; 9 root chrootgroup 4.0K 11월&amp;nbsp; 6 01:07 chroot&lt;BR&gt;drwx--x--x&amp;nbsp; 3 root chrootgroup 4.0K 11월&amp;nbsp; 6 01:15 home&lt;BR&gt;[root@localhost /]# ls -lh /chroot&lt;BR&gt;drwx--x--x 2 root root &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 4.0K&amp;nbsp; 7월 30 12:43 bin&lt;BR&gt;drwx--x--x 2 root root &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 4.0K&amp;nbsp; 6월&amp;nbsp; 3 18:07 dev&lt;BR&gt;drwx--x--x 4 root root &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 4.0K 11월&amp;nbsp; 6 01:25 etc&lt;BR&gt;drwx--x--x 3 root root &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 4.0K 11월&amp;nbsp; 6 01:15 home&lt;BR&gt;drwx--x--x 2 root root &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 4.0K&amp;nbsp; 7월 28 11:20 lib&lt;BR&gt;drwxrwxrwt 4 root root &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 1.0K 11월&amp;nbsp; 6 01:14 tmp&lt;BR&gt;drwx--x--x 9 root root &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 4.0K&amp;nbsp; 6월&amp;nbsp; 8 01:56 usr&lt;BR&gt;[root@localhost /]# ls -lh /chroot/home&lt;BR&gt;drwx---r-x 3 one chrootgroup 4.0K 11월&amp;nbsp; 6 01:22 one&lt;BR&gt;drwx---r-x 3 two chrootgroup 4.0K 11월&amp;nbsp; 6 01:22 two&lt;BR&gt;drwx---r-x 3 three chrootgroup 4.0K 11월&amp;nbsp; 6 01:22 three&lt;BR&gt;[root@localhost /]#&lt;BR&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이제 타 계정 홈디렉토리로 이동하려 하면 퍼미션 금지 에러가 뜨는 것을 확인할 수 있을 것입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;※ 위에 소개한 소유권/퍼미션 일괄 변경 방법은 시스템에 따라 돌이킬 수 없는 사태를 야기할 수 있으므로 맹목적으로 무작정 따라하지 마시길 바랍니다. 될 수 있으면 find 커맨드 바로 뒤의 경로 설정을 최소한도로 국한시켜가며 차근차근 테스트하며 진행하시길 바랍니다.&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;이제 root가 아닌 일반계정으로 ssh에 접속하여 시스템 최상위 경로로 이동해 보면 /가 아닌 /chroot 경로에 가두어진 쉘환경임을 확인할 수 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;그리고 기존의 데이터 뿐만이 아닌 앞으로 쉘상에서 새롭게 생성할 계정도 그룹 퍼미션 환경을 0으로 만들어줄 필요가 있겠죠.&lt;BR&gt;&amp;nbsp;새롭게 생성할 계정 GID를 모두 chrootgroup으로 지정하고 UMASK 설정을 통해 그룹퍼미션을 제거합니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# cat /etc/default/useradd&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;# useradd defaults file&lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;GROUP=499&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;HOME=/home&lt;BR&gt;INACTIVE=-1&lt;BR&gt;EXPIRE=&lt;BR&gt;SHELL=/bin/bash&lt;BR&gt;SKEL=/etc/skel&lt;BR&gt;CREATE_MAIL_SPOOL=yes&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# cat /etc/login.defs&amp;nbsp; | grep UMASK&lt;/DIV&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;UMASK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 072&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이젠 일반사용자들이 쉘에 접속했을 때 처음 만나게 되는 프롬프트 모양을 결정지으며 원활한 커맨드 및 편집기 사용을 위한 일반사용자 전용의 쉘 환경변수를 새롭게 정의해 줄 필요가 있습니다. chroot 환경의 쉘에 접속하는 일반 사용자는 /chroot/etc/bashrc 파일의 설정을 지배받게 되므로 이를 적절히 수정하면 됩니다. /etc/bashrc 파일을 복사해와 편집기로 열어 상단 부분을 한 번 보겠습니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# cp /etc/bashrc /chroot/etc/&lt;BR&gt;[root@localhost ~]# head -n 13 /chroot/etc/bashrc&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;
&lt;P&gt;# /etc/bashrc&lt;/P&gt;
&lt;P&gt;# System wide functions and aliases&lt;BR&gt;# Environment stuff goes in /etc/profile&lt;/P&gt;
&lt;P&gt;# By default, we want this to get set.&lt;BR&gt;# Even for non-interactive, non-login shells.&lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;if [ $UID -gt 99 ] &amp;amp;&amp;amp; [ &quot;`id -gn`&quot; = &quot;`id -un`&quot; ]; then&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; umask 002&lt;BR&gt;else&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; umask 022&lt;BR&gt;fi&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;&amp;nbsp;붉은색으로 표시한 스크립트 조건문에 의하면 UID가 99보다 크면서 UID와 GID 값이 같은 경우 umask 002를 적용하고 그 외의 경우는 022를 적용하라는 의미입니다.&lt;BR&gt;&amp;nbsp;/etc/passwd 파일에서 UID가 99인 사용자를 확인하면 nobody이죠.&lt;BR&gt;&amp;nbsp;nobody보다 UID가 크면서 UID와 GID값이 같은 계정은 useradd 커맨드로 생성하는 /home 아래의 일반사용자들의 경우가 대표적입니다 결국 root나 일반계정으로 bash 쉘에 로그인 후 디렉토리나 파일을 생성하면 별다른 이유가 없는 한 umask 002를 적용하게 되는 것입니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;그러나 본 문서의 ssh chroot 적용 방법이라면 /etc/passwd, /etc/group, /etc/shadow 파일을 /chroot/etc 안에 복사해 넣을 필요가 없고 쉘상에서 UID나 GID를 확인하는 데에 관계되는 커맨드나 환경설정 파일도 없기 때문에 /chroot/etc/bashrc 파일 상에서의 위 설정 내용은 수정이 필요합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;답은 간단합니다. 위 붉은색 부분을 삭제하고 아래 한 줄로 대신하면 됩니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;umask 072&lt;/DIV&gt;&amp;nbsp;어차피 chrootgroup으로 묶은 일반사용자들만 chroot로 제한된 쉘에 접속할 것이기 때문에 쉘스크립트의 조건문 등으로 예외 상황을 가정할 필요 없이 위의 단 한 줄 만으로 umask를 선언하면 되는 것입니다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;하단부의 불필요한 부분도 모두 제거하여 최적화시킨 bashrc 파일의 내용은 아래와 같습니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost:/chroot/etc]# cat /chroot/etc/bashrc&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;
&lt;P&gt;# /etc/bashrc&lt;/P&gt;
&lt;P&gt;# System wide functions and aliases&lt;BR&gt;# Environment stuff goes in /etc/profile&lt;/P&gt;
&lt;P&gt;# By default, we want this to get set.&lt;BR&gt;# Even for non-interactive, non-login shells.&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; umask 072&lt;/P&gt;
&lt;P&gt;# vim:ts=4:sw=4&lt;BR&gt;alias vi=&#039;vim&#039;&lt;BR&gt;alias grep=&#039;grep --color=auto&#039;&lt;BR&gt;alias ll=&#039;ls -alhF --color=tty --show-control-chars&#039;&lt;BR&gt;alias mysqldump=&#039;/usr/local/mysql/bin/mysqldump&#039;&lt;BR&gt;alias mysql=&#039;/usr/local/mysql/bin/mysql&#039;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;PS1=&quot;\[\033[1;31m\][SSH:\w]$ \[\033[0;37m\]&quot;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;붉은색으로 굵게 표시한 부분은 프롬프트 형태를 결정짓는 변수값으로 딱히 정해진 방법이 있는게 아니니 입맛에 맞게 수정해서 사용하면 됩니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;ssh 로그인 시 뜰 안내문은 /chroot/etc/motd 파일로 설정하면 됩니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost:/chroot/etc]# cat motd&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;
&lt;P&gt;▒▒▒▒▒ &amp;nbsp;Welcom to foobar.com !!! ▒▒▒▒▒&lt;/P&gt;
&lt;P&gt;지금 접속하신 쉘은 실제 사용할 수 있는 커맨드가 대폭 제한된 환경입니다.&lt;BR&gt;디렉토리 생성 및 삭제, 계정 백업 및 복구를 위한 기능에만 초점이 맞추어진&lt;BR&gt;환경이므로 리눅스/유닉스 학습을 위한 수단으로는 사용이 사실상 불가능합니다.&lt;/P&gt;
&lt;P&gt;※ 사용 가능 커맨드&lt;/P&gt;
&lt;P&gt;cat chmod cp grep gunzip gzip ls ll mkdir mv mysql mysqldump rm tar vi zip unzip pwd&lt;/P&gt;&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;mysql을 운영하는 경우 일부 mysql 쉘커맨드 중 /tmp/mysql.sock을 참고하게 되는데 chroot 환경의 쉘에서도 사용하려면 /chroot/tmp에도 mysql.sock를 위치시켜야 합니다. 바인딩 마운트로 해결 가능합니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost:~]# chmod 1777 /chroot/tmp&lt;BR&gt;[root@localhost:~]# mount --bind /tmp /chroot/tmp&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;시스템 시작시 자동으로 적용되도록 /etc/rc.d/rc.local 파일에 커맨드를 추가합니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost:~]# echo &quot;mount --bind /tmp /chroot/tmp&quot; &amp;gt;&amp;gt; /etc/rc.d/rc.local&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;이렇게 설정한 각종 시스템 디렉토리 및 파일들의 변조를 원천 봉쇄하기 위해 chattr 커맨드로 수정/복사/삭제 속성을 제거합니다. 이렇게 하면 그나마 chroot 환경의 쉘에 들어와서 뻘짓을 감행하려는 시도조차 불가능해집니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost:~]# chattr +i -R /chroot/lib&lt;BR&gt;[root@localhost:~]# chattr +i -R /chroot/usr&lt;BR&gt;[root@localhost:~]# chattr +i -R /chroot/etc&lt;BR&gt;[root@localhost:~]# chattr +i -R /chroot/bin&lt;BR&gt;[root@localhost:~]# chattr +i -R /chroot/dev&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이 외에도 세밀하게 설정해야 할 부분들이 여럿 있을 수 있습니다. 특히 vi 편집기와 관련된 환경설정파일과 라이브러리와 관련된 디렉토리 및 파일 설정이 처음 시도하는 분들께는 다소 까다로운 작업이 될 수 있겠습니다. 검색 신공만이 답이겠죠. 저 같은 경우는 chroot 설정을 해보면서 쉘을 구성하는 환경설정 파일들에 대해 좀 더 깊은 이해를 할 수 있었습니다. 쉘스크립트에 대해서도 기초적인 이해의 필요성을 새삼 깨닫게 해준 보람된 작업이었다고나 할까요? 암튼 이 문서가 chroot 설정을 시도하려는 분들께 조금이나마 도움이 되었음 하는 바입니다.</description>
			<category>리눅스</category>
			<category>chroot</category>
			<category>OpenSSH</category>
			<category>rpm</category>
			<category>srpm</category>
			<category>SSH</category>
			<category>리빌드</category>
			<category>빌드</category>
			<category>쉘</category>
			<category>패치</category>
			<category>패키지</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/343</guid>
			<comments>http://www.digimoon.net/blog/343#entry343comment</comments>
			<pubDate>Thu, 05 Nov 2009 15:50:12 +0900</pubDate>
		</item>
		<item>
			<title>CentOS 5.x kernel &amp; iptables rpm에 GeoIP 모듈 리빌드하기</title>
			<link>http://www.digimoon.net/blog/342</link>
			<description>&amp;nbsp;&lt;FONT color=#0000ff&gt;작성자: 주인장 &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;디지문&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;(&lt;A href=&quot;http://www.digimoon.net/&quot; target=_blank&gt;http://www.digimoon.net/&lt;/A&gt;) &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;일전에 커널과 iptables 소스를 새로 받아다가 완전히 새로 컴파일하여 geoip 모듈을 탑재하는 걸 &lt;A href=&quot;http://www.digimoon.net/blog/320&quot; target=_blank&gt;포스팅&lt;/A&gt;한 적이 있는데 이번엔 기존 커널 &amp;amp; iptables rpm 패키지를 그대로 유지한 채 geoip 모듈만 리빌드하는 방법을 포스팅합니다.&lt;BR&gt;&amp;nbsp;rpm으로 기본 탑재된 커널도 충분히 재구실을 하는지라... 사실 커널 소스를 받아 컴파일해서 설치하는 건 요즘 들어선 불필요한 모듈을 뺄 수 있다는 점 외엔 거의 메리트가 없다고 봐도 무방합니다. &lt;BR&gt;( &lt;A href=&quot;http://kldp.org/node/103402&quot; target=_blank&gt;http://kldp.org/node/103402&lt;/A&gt;&amp;nbsp;)&lt;BR&gt;&lt;BR&gt;시간 소요도 커널을 통으로 컴파일하는 방법에 비해 훨씬 적고 간단하기에 개인적으로 선호하는 방법이 되겠습니다.&lt;BR&gt;&lt;BR&gt;2009년 10월 31일 현재 CentOS 5.4 32bit의 최신 커널과 iptables 버전은 아래와 같네요. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost ~]# uname -a&lt;BR&gt;Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Thu Sep 3 03:33:56 EDT 2009 i686 athlon i386 GNU/Linux&lt;BR&gt;[root@localhost ~]# iptables -V&lt;BR&gt;iptables v1.3.5&lt;BR&gt;[root@localhost ~]#&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;patch-o-matic-ng 구버전을 받아 압축을 풉니다.&lt;BR&gt;&amp;nbsp;patch-o-matic-ng 최근 버전의 경우 커널과 iptables에 ipt_geoip가 아닌 xt_geoip 모듈이 추가되는데 정보를 검색한 결과 이게 2.6.18.x 커널과 iptables 1.3.5 버전엔 맞지 않는 모듈이더군요. iptables의 경우 v1.4.3 이상이 설치되어 있어야 사용 가능합니다.&lt;BR&gt;&lt;STRIKE&gt;그러나 CentOS 업데이트 서버에서 현재까지 지원하는 rpm 버전의 iptables은 v1.3.5가 현재론 최신이라 ipt_geoip가 지원되는 07년도에 나온 patch-o-matic-ng을 사용해야 하더군요.&lt;BR&gt;&lt;/STRIKE&gt;&amp;nbsp;그러나 CentOS 업데이트 서버에서 현재까지 지원하는 rpm 버전의 iptables은 v1.3.5가 현재론 최신이라 ipt_geoip가 지원되는 patch-o-matic-ng를 사용해야 합니다. 최신 버전은 08년 5월 21일자 버전이네요.&lt;BR&gt;&lt;STRIKE&gt;(이왕이면 ipt_geoip를 지원하는 좀 더 최신의 버전을 08년도 버전에서 찾고 싶었으나 영어의 압박으로 포기)&lt;BR&gt;&lt;/STRIKE&gt;&amp;nbsp; 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost ~]# cd /usr/src/&lt;BR&gt;[root@localhost src]# wget &lt;A href=&quot;http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080521.tar.bz2&quot;&gt;http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080521.tar.bz2&lt;/A&gt;&lt;BR&gt;--13:39:59--&amp;nbsp; &lt;A href=&quot;http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080521.tar.bz2&quot;&gt;http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080521.tar.bz2&lt;/A&gt;&lt;BR&gt;Resolving &lt;A href=&quot;ftp://ftp.netfilter.org/&quot;&gt;ftp.netfilter.org&lt;/A&gt;... 213.95.27.115, 2001:780:45:1d:20d:93ff:fe9b:e443&lt;BR&gt;Connecting to &lt;A href=&quot;ftp://ftp.netfilter.org|213.95.27.115|:80/&quot;&gt;ftp.netfilter.org|213.95.27.115|:80&lt;/A&gt;... connected.&lt;BR&gt;HTTP request sent, awaiting response... 200 OK&lt;BR&gt;Length: 137310 (134K) [application/x-tar]&lt;BR&gt;Saving to: `patch-o-matic-ng-20071231.tar.bz2&#039; 100%[====================================================================================&amp;gt;] 137,310 &amp;nbsp; &amp;nbsp; 84.2K/s &amp;nbsp; in 1.6s 13:40:02 (84.2 KB/s) - `patch-o-matic-ng-20080521.tar.bz2&#039; saved [137310/137310] &lt;/ br&gt;&lt;BR&gt;&lt;BR&gt;[root@localhost src]# tar xvfj patch-o-matic-ng-20080521.tar.bz2&lt;/DIV&gt;&lt;BR&gt;rpm으로 설치된 iptables에 geoip extension을 추가하려면 iptables srpm을 받아 patch-o-matic-ng를 적용하고 리빌드하여 설치해야 합니다.&lt;BR&gt;아래 링크 참고하여 iptables srpm을 받습니다.&lt;BR&gt;&lt;A href=&quot;http://free4u.wo.tc/weblog/10440&quot; target=_blank&gt;http://free4u.wo.tc/weblog/10440&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;srpm을 받았으면 일단 설치합니다. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost ~]# rpm -ivh iptables-1.3.5-5.3.el5.src.rpm&lt;/DIV&gt;&lt;BR&gt;/usr/src/redhat/SOURCES 디렉토리로 이동해보면 iptables 소스가 고스란히 위치해 있는 것을 확인할 수 있습니다. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost ~]# cd /usr/src/redhat/SOURCES&lt;BR&gt;[root@localhost SOURCES]# ls -l&lt;BR&gt;합계 256&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 560&amp;nbsp; 9월&amp;nbsp; 9&amp;nbsp; 2004 iptables-1.2.10-counters.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 254&amp;nbsp; 9월&amp;nbsp; 9&amp;nbsp; 2004 iptables-1.2.8-nolibnsl.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 359&amp;nbsp; 9월&amp;nbsp; 9&amp;nbsp; 2004 iptables-1.2.9-netlink.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 378&amp;nbsp; 2월 22&amp;nbsp; 2005 iptables-1.3.0-autoload.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 2286 11월 18&amp;nbsp; 2005 iptables-1.3.0-cleanup.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 398&amp;nbsp; 3월 19&amp;nbsp; 2005 iptables-1.3.0-no_root.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 1082&amp;nbsp; 2월 22&amp;nbsp; 2005 iptables-1.3.0-selinux.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 5794&amp;nbsp; 5월&amp;nbsp; 5 00:57 iptables-1.3.5-DSCPv6.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 732&amp;nbsp; 5월&amp;nbsp; 5 00:57 iptables-1.3.5-ICMP6_reject_types.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 631&amp;nbsp; 1월 15&amp;nbsp; 2008 iptables-1.3.5-dscp_max.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 2933&amp;nbsp; 1월 15&amp;nbsp; 2008 iptables-1.3.5-headers.patch&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 1407&amp;nbsp; 5월&amp;nbsp; 5 00:57 iptables-1.3.5-restore_opts.patch&lt;BR&gt;-rw-rw-r-- 1 root root 191820&amp;nbsp; 2월&amp;nbsp; 2&amp;nbsp; 2006 iptables-1.3.5.tar.bz2&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 1740&amp;nbsp; 1월 20&amp;nbsp; 2007 iptables-config&lt;BR&gt;-rwxr-xr-x 1 root root &amp;nbsp; 7460&amp;nbsp; 5월 13 01:00 iptables.init&lt;/DIV&gt;&lt;BR&gt;iptables-1.3.5.tar.bz2 파일의 압축을 풀고 난 뒤... 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost SOURCES]# tar xfj iptables-1.3.5.tar.bz2&lt;/DIV&gt;&lt;BR&gt;patch-o-matic-ng 패치를 가하기 위해 아래와 같이 kernel 소스와 iptables 소스가 위치한 곳을 심볼릭링크해 줍니다.&lt;BR&gt;patch-o-matic-ng가 default로 찾는 커널과 iptables의 경로가 /usr/src 이기 때문에 하는 작업이죠. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost SOURCES]# cd /usr/src&lt;BR&gt;[root@localhost src]# ln -s /usr/src/redhat/SOURCES/iptables-1.3.5 /usr/src/iptables&lt;BR&gt;[root@localhost src]# ln -s /usr/src/kernels/2.6.18-164.el5-i686 /usr/src/linux&lt;/DIV&gt;&lt;BR&gt;이제 커널과 iptables에 patch-o-matic-ng 패치를 가합니다. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost src]# cd /usr/src/patch-o-matic-ng-20080521&lt;BR&gt;[root@localhost patch-o-matic-ng-20080521]# ./runme --download&lt;BR&gt;[root@localhost patch-o-matic-ng-20080521]# ./runme geoip&lt;BR&gt;Welcome to Patch-o-matic ($Revision: 6736 $)! Kernel: &amp;nbsp; 2.6.18, /usr/src/linux&lt;BR&gt;Iptables: 1.3.5, /usr/src/iptables&lt;BR&gt;Each patch is a new feature: many have minimal impact, some do not.&lt;BR&gt;Almost every one has bugs, so don&#039;t apply what you don&#039;t need!&lt;BR&gt;-------------------------------------------------------&lt;BR&gt;Already applied:&lt;BR&gt;Testing geoip... not applied&lt;BR&gt;The geoip patch:&lt;BR&gt;&amp;nbsp;&amp;nbsp; Author: Samuel Jean &amp;lt;&lt;A href=&quot;mailto:jix@bugmachine.ca&quot;&gt;jix@bugmachine.ca&lt;/A&gt;&amp;gt;; Nicolas Bouliane &amp;lt;&lt;A href=&quot;mailto:nib@bugmachine.ca&quot;&gt;nib@bugmachine.ca&lt;/A&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; Status: Stable This patch makes possible to match a packet&lt;BR&gt;by its source or destination country. GeoIP options:&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [!] &amp;nbsp; --src-cc, --source-country country[,country,country,...] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Match packet coming from (one of)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; the specified country(ies) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [!] &amp;nbsp; --dst-cc, --destination-country country[,country,country,...] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Match packet going to (one of)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; the specified country(ies) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; NOTE: The country is inputed by its ISO3166 code. The only extra files you need is a binary db (geoipdb.bin) &amp;amp; its index file (geoipdb.idx).&lt;BR&gt;Take a look at &lt;A href=&quot;http://people.netfilter.org/peejix/geoip/howto/geoip-HOWTO.html&quot;&gt;http://people.netfilter.org/peejix/geoip/howto/geoip-HOWTO.html&lt;/A&gt;&lt;BR&gt;for a quick HOWTO.&lt;BR&gt;-----------------------------------------------------------------&lt;BR&gt;Do you want to apply this patch [N/y/t/f/a/r/b/w/q/?] y 
&lt;P&gt;Excellent! Source trees are ready for compilation. 
&lt;P&gt;
&lt;P&gt;Recompile the kernel image (if there are non-modular netfilter modules).&lt;BR&gt;Recompile the netfilter kernel modules.&lt;BR&gt;Recompile the iptables binaries.&lt;BR&gt;[root@localhost patch-o-matic-ng-20080521]#&lt;/P&gt;&lt;/DIV&gt;&lt;BR&gt;srpm으로 받아놓은 iptables의 extension 디렉토리에 geoip 관련 패치파일이 생성되어 있는 것을 확인할 수 있습니다. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost extensions]# ls -l /usr/src/iptables/extensions | grep geoip&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp; 9518 10월 31 13:53 libipt_geoip.c&lt;BR&gt;-rw-r--r-- 1 root root &amp;nbsp;&amp;nbsp; 817 10월 31 13:53 libipt_geoip.man&lt;BR&gt;[root@localhost extensions]#&lt;/DIV&gt;&lt;BR&gt;/usr/src/iptables 디렉토리 안에서 make 해 준 뒤 extension 디렉토리에 들어가면 libipt_geoip.so 파일이 생성되어 있는 것을 확인할 수 있습니다. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost extensions]# cd /usr/src/iptables&lt;BR&gt;[root@localhost iptables]# make&lt;BR&gt;[root@localhost iptables]# cd extensions&lt;BR&gt;[root@localhost extensions]# ls -l | grep libipt_geoip.so&lt;BR&gt;-rwxr-xr-x 1 root root &amp;nbsp; 7470 10월 31 13:55 libipt_geoip.so&lt;BR&gt;[root@localhost extensions]#&lt;/DIV&gt;&lt;BR&gt;libipt_geoip.so 파일을 /lib/iptables 디렉토리 안에 복사해 넣어주면 iptables 관련 작업은 끝납니다. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost extensions]# cp libipt_geoip.so /lib/iptables&lt;BR&gt;[root@localhost extensions]# ls -l /lib/iptables | grep geoip&lt;BR&gt;-rwxr-xr-x 1 root root&amp;nbsp; 7470 10월 31 13:57 libipt_geoip.so&lt;BR&gt;[root@localhost extensions]#&lt;/DIV&gt;&lt;BR&gt;커널 작업은 아래와 같습니다. 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost extensions]# cd /usr/src/linux&lt;BR&gt;[root@localhost extensions]# make oldconfig&lt;BR&gt;geoip match support (IP_NF_MATCH_GEOIP) [N/&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;m&lt;/STRONG&gt;&lt;/FONT&gt;/?] (NEW)&lt;BR&gt;[root@localhost linux]# make modules_prepare&lt;BR&gt;scripts/kconfig/conf -s arch/i386/Kconfig&lt;BR&gt;&amp;nbsp; CHK &amp;nbsp; &amp;nbsp; include/linux/version.h&lt;BR&gt;&amp;nbsp; CHK &amp;nbsp; &amp;nbsp; include/linux/utsrelease.h&lt;BR&gt;&amp;nbsp; HOSTCC&amp;nbsp; scripts/genksyms/genksyms.o&lt;BR&gt;&amp;nbsp; HOSTCC&amp;nbsp; scripts/genksyms/lex.o&lt;BR&gt;&amp;nbsp; HOSTCC&amp;nbsp; scripts/genksyms/parse.o&lt;BR&gt;&amp;nbsp; HOSTLD&amp;nbsp; scripts/genksyms/genksyms&lt;BR&gt;&amp;nbsp; CC &amp;nbsp; &amp;nbsp;&amp;nbsp; scripts/mod/empty.o&lt;BR&gt;&amp;nbsp; MKELF &amp;nbsp; scripts/mod/elfconfig.h&lt;BR&gt;&amp;nbsp; HOSTCC&amp;nbsp; scripts/mod/file2alias.o&lt;BR&gt;&amp;nbsp; HOSTCC&amp;nbsp; scripts/mod/modpost.o&lt;BR&gt;&amp;nbsp; HOSTCC&amp;nbsp; scripts/mod/sumversion.o&lt;BR&gt;&amp;nbsp; HOSTLD&amp;nbsp; scripts/mod/modpost&lt;BR&gt;[root@localhost linux]#&lt;BR&gt;&lt;BR&gt;[root@localhost linux]# mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile.orig&lt;BR&gt;[root@localhost linux]# vim net/ipv4/netfilter/Makefile&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;
&lt;P&gt;obj-m := ipt_geoip.o&lt;/P&gt;
&lt;P&gt;KDIR := /lib/modules/$(shell uname -r)/build&lt;BR&gt;PWD &amp;nbsp; := $(shell pwd)&lt;/P&gt;
&lt;P&gt;default:&lt;BR&gt;&amp;nbsp; &amp;nbsp; $(MAKE) -C $(KDIR) M=$(PWD) modules&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost linux]# make M=net/ipv4/netfilter&lt;BR&gt;[root@localhost linux]# cp net/ipv4/netfilter/ipt_geoip.ko /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter/&lt;BR&gt;[root@localhost linux]# chmod 744 /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter/ipt_geoip.ko&lt;BR&gt;[root@localhost linux]# depmod -a&lt;BR&gt;[root@localhost linux]# ls -l /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter | grep geoip&lt;BR&gt;-rwxr--r-- 1 root root 139757 10월 31 14:02 &lt;FONT color=#ff0000&gt;&lt;STRONG&gt;ipt_geoip.ko&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;[root@localhost linux]# modprobe ipt_geoip&lt;BR&gt;[root@localhost linux]# lsmod | grep geoip&lt;BR&gt;ipt_geoip &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 7684&amp;nbsp; 0&lt;BR&gt;x_tables &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 17349&amp;nbsp; 5 &lt;FONT color=#ff0000&gt;&lt;STRONG&gt;ipt_geoip&lt;/STRONG&gt;&lt;/FONT&gt;,ipt_REJECT,xt_state,xt_tcpudp,ip_tables&lt;BR&gt;[root@localhost linux]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;※ CentOS 커널에 geoip 붙이는 건 김정균님이 배포하고 계신 스크립트로 간단하게 해결 가능합니다.&lt;BR&gt;&lt;A href=&quot;http://my.oops.org/117&quot; target=_blank&gt;http://my.oops.org/117&lt;/A&gt;</description>
			<category>리눅스</category>
			<category>CentOS</category>
			<category>geoip</category>
			<category>iptables</category>
			<category>리빌드</category>
			<category>모듈</category>
			<category>커널</category>
			<category>컴파일</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/342</guid>
			<comments>http://www.digimoon.net/blog/342#entry342comment</comments>
			<pubDate>Sun, 01 Nov 2009 00:21:19 +0900</pubDate>
		</item>
		<item>
			<title>CentOS 5.3용 Filezilla Cilent Unofficial Binaries</title>
			<link>http://www.digimoon.net/blog/341</link>
			<description>파일질라 공식 홈페이지에서 배포하고 있는 바이너리 소스를 CentOS 5.3 32bit 에 설치하고 실행하면 아래와 같은 라이브러리 관련 오류 발생&lt;BR&gt;[root@localhost bin]# ./filezilla&lt;BR&gt;./filezilla: error while loading shared libraries: libtasn1.so.3: cannot open shared object file: No such file or directory&lt;BR&gt;[root@localhost bin]#&lt;BR&gt;&lt;BR&gt;바이너리 배포본의 한계... ㅜ,.ㅜ;;&lt;BR&gt;CentOS 5.x 라이브러리와 호환되는 바이너리 버전을 배포해 달라~&lt;BR&gt;rpm 배포가 힘들면 컴파일용 소스라도 배포하든가... ㅋ&lt;BR&gt;&lt;BR&gt;비공식 바이너리 버전은 있음.&lt;BR&gt;&lt;A href=&quot;http://wiki.filezilla-project.org/Unofficial_Binaries&quot; target=_blank&gt;http://wiki.filezilla-project.org/Unofficial_Binaries&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;</description>
			<category>리눅스</category>
			<category>binary</category>
			<category>client</category>
			<category>Filezilla</category>
			<category>Unofficial</category>
			<category>바이너리</category>
			<category>비공식</category>
			<category>클라이언트</category>
			<category>파일질라</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/341</guid>
			<comments>http://www.digimoon.net/blog/341#entry341comment</comments>
			<pubDate>Mon, 12 Oct 2009 22:24:37 +0900</pubDate>
		</item>
		<item>
			<title>Poptop (The PPTP VPN Server for Linux) 설치</title>
			<link>http://www.digimoon.net/blog/340</link>
			<description>테스트 OS : CentOS 5.3 32bit&lt;BR&gt;&lt;BR&gt;참고 링크 : &lt;BR&gt;&lt;A href=&quot;http://www.nabble.com/pptp-on-CentOS-td10425221.html&quot; target=_blank&gt;http://www.nabble.com/pptp-on-CentOS-td10425221.html&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://annyung.oops.org/?m=white&amp;amp;p=pptpd&quot; target=_blank&gt;http://annyung.oops.org/?m=white&amp;amp;p=pptpd&lt;/A&gt;&lt;BR&gt;&lt;A href=&quot;http://blog.naver.com/poorpuppet?Redirect=Log&amp;amp;logNo=40005182496&quot; target=_blank&gt;http://blog.naver.com/poorpuppet?Redirect=Log&amp;amp;logNo=40005182496&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;2009년 10월 현재 CentOS 공식 미러 사이트의 레파지토리에는 아직 pptpd 세트가 등록되어 있지 않길래 CentOS 5.x 32bit에 rpm으로 한방 설치할 수 있게끔 각종 소스 링크 찾아 다니느라 애먹었습니다. ^^ 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# rpm -Uvh &lt;A href=&quot;http://pptpclient.sourceforge.net/yum/stable/rhel5/pptp-release-current.noarch.rpm&quot;&gt;http://pptpclient.sourceforge.net/yum/stable/rhel5/pptp-release-current.noarch.rpm&lt;/A&gt;&lt;BR&gt;[root@localhost ~]# yum -y install ppp pptpd&lt;/DIV&gt;※ 웹상의 poptop 설치에 대한 문서들 대부분이 dkms와 kernel_ppp_mppe 설치까지 소개하고 있는데 커널에 mppe 모듈이 포함되지 않던 시절에나 필요하던 겁니다. 요즘 커널엔 mppe 모듈이 기본 포함되어 있어 ppp, pptpd 두 가지만 설치합니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# cat /etc/pptpd.conf&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;option /etc/ppp/options.pptpd&lt;BR&gt;logwtmp&lt;BR&gt;localip 10.0.0.1&lt;BR&gt;remoteip 10.0.0.2-50&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# cat /etc/ppp/options.pptpd&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;
&lt;P&gt;debug&lt;BR&gt;name pptpd&lt;BR&gt;refuse-pap&lt;BR&gt;refuse-chap&lt;BR&gt;refuse-mschap&lt;BR&gt;require-mschap-v2&lt;BR&gt;# require-mppe-128 &lt;FONT color=#0000ff&gt;&amp;lt;== 이 설정을 주석처리 하지 않으면 특정 사이트에 접속이 되지 않는다. 주석처리하고 pptp 클라이언트 상에서도 해당 옵션을 사용치 않도록 한다.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;ms-dns 168.126.63.1&lt;BR&gt;#ms-wins 10.0.0.3&lt;BR&gt;&lt;BR&gt;proxyarp&lt;BR&gt;nodefaultroute&lt;BR&gt;lock&lt;BR&gt;nobsdcomp&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost:~]# cat /etc/ppp/chap-secrets&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #c9edff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;# Secrets for authentication using CHAP&lt;BR&gt;# client &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; server&amp;nbsp; secret &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; IP addresses&lt;BR&gt;####### redhat-config-network will overwrite this part!!! (begin) ##########&lt;BR&gt;aaa &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; * &amp;nbsp;&amp;nbsp; password@ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; *&lt;BR&gt;bbb &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; * &amp;nbsp;&amp;nbsp; password@ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; *&lt;BR&gt;####### redhat-config-network will overwrite this part!!! (end) ############&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;[root@localhost ~]# iptables -I INPUT -p tcp --dport 1723 -j ACCEPT&lt;BR&gt;[root@localhost ~]# /etc/init.d/pptpd start&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;위처럼 설정한 pptp 서버에 접속하기 위한 클라이언트 측 설정은 아래와 같습니다.&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1394029177.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;420&quot; width=&quot;424&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1345353011.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;417&quot; width=&quot;424&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1076328380.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;416&quot; width=&quot;423&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;클라이언트에서 접속하면 아래와 같이 서버 측 인터페이스 정보에 ppp0 인터페이스가 추가된 것을 확인할 수 있습니다. 
&lt;DIV style=&quot;PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #e4e4e4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 10px&quot;&gt;
&lt;P&gt;[root@localhost ~]# ifconfig&lt;BR&gt;eth0 &amp;nbsp; &amp;nbsp;&amp;nbsp; Link encap:Ethernet&amp;nbsp; HWaddr 00:0C:29:4D:95:7B&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inet addr:192.168.0.150&amp;nbsp; Bcast:192.168.0.255&amp;nbsp; Mask:255.255.255.0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inet6 addr: fe80::20c:29ff:fe4d:957b/64 Scope:Link&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UP BROADCAST RUNNING MULTICAST&amp;nbsp; MTU:1500&amp;nbsp; Metric:1&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RX packets:3980 errors:0 dropped:0 overruns:0 frame:0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TX packets:3899 errors:0 dropped:0 overruns:0 carrier:0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; collisions:0 txqueuelen:1000&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RX bytes:1029989 (1005.8 KiB)&amp;nbsp; TX bytes:998987 (975.5 KiB)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Interrupt:177 Base address:0x1400&lt;/P&gt;
&lt;P&gt;lo &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Link encap:Local Loopback&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inet addr:127.0.0.1&amp;nbsp; Mask:255.0.0.0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inet6 addr: ::1/128 Scope:Host&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UP LOOPBACK RUNNING&amp;nbsp; MTU:16436&amp;nbsp; Metric:1&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RX packets:84 errors:0 dropped:0 overruns:0 frame:0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TX packets:84 errors:0 dropped:0 overruns:0 carrier:0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; collisions:0 txqueuelen:0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RX bytes:7200 (7.0 KiB)&amp;nbsp; TX bytes:7200 (7.0 KiB)&lt;/P&gt;
&lt;P&gt;ppp0 &amp;nbsp; &amp;nbsp;&amp;nbsp; Link encap:Point-to-Point Protocol&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inet addr:10.0.0.1&amp;nbsp; P-t-P:10.0.0.2&amp;nbsp; Mask:255.255.255.255&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UP POINTOPOINT RUNNING NOARP MULTICAST&amp;nbsp; MTU:1400&amp;nbsp; Metric:1&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RX packets:32 errors:0 dropped:0 overruns:0 frame:0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TX packets:10 errors:0 dropped:0 overruns:0 carrier:0&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; collisions:0 txqueuelen:3&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RX bytes:3376 (3.2 KiB)&amp;nbsp; TX bytes:121 (121.0 b)&lt;/P&gt;
&lt;P&gt;[root@localhost ~]#&lt;/P&gt;&lt;/DIV&gt;</description>
			<category>리눅스</category>
			<category>kernel</category>
			<category>mppe</category>
			<category>poptop</category>
			<category>ppp</category>
			<category>pptp</category>
			<category>vpn</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/340</guid>
			<comments>http://www.digimoon.net/blog/340#entry340comment</comments>
			<pubDate>Fri, 09 Oct 2009 13:03:04 +0900</pubDate>
		</item>
		<item>
			<title>Adaptec Storage Manager - Adaptec Serial ATA II RAID 2820SA</title>
			<link>http://www.digimoon.net/blog/339</link>
			<description>&lt;A href=&quot;http://www.adaptec.com/en-US/downloads/storage_manager/sm?productId=AAR-2820SA&amp;amp;dn=Adaptec+Serial+ATA+II+RAID+2820SA&quot; target=_blank&gt;http://www.adaptec.com/en-US/downloads/storage_manager/sm?productId=AAR-2820SA&amp;amp;dn=Adaptec+Serial+ATA+II+RAID+2820SA&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1190948031.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;480&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;</description>
			<category>하드웨어</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/339</guid>
			<comments>http://www.digimoon.net/blog/339#entry339comment</comments>
			<pubDate>Wed, 16 Sep 2009 01:14:38 +0900</pubDate>
		</item>
		<item>
			<title>써니 써니 써니~~~</title>
			<link>http://www.digimoon.net/blog/338</link>
			<description>울 복덩이 순규~~~ ^^&lt;BR&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1267740942.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;308&quot; width=&quot;400&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1059321171.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;207&quot; width=&quot;161&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1045079132.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;484&quot; width=&quot;237&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;울 순규 지못미~ ㅋㅋㅋ&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1022399597.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;480&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1202482486.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;480&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1324226067.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;352&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;
&lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;BR&gt;&lt;BR&gt;그래도 우리 순규가 최고 이쁨~ ^^&lt;/DIV&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1284972536.gif&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;268&quot; width=&quot;330&quot; /&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://www.digimoon.net/blog/attach/1/1125595162.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;1157&quot; width=&quot;451&quot; /&gt;&lt;/div&gt;</description>
			<category>유희</category>
			<category>복덩이</category>
			<category>소녀시대</category>
			<category>써니</category>
			<category>이순규</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/338</guid>
			<comments>http://www.digimoon.net/blog/338#entry338comment</comments>
			<pubDate>Mon, 31 Aug 2009 23:45:25 +0900</pubDate>
		</item>
		<item>
			<title>iptables와 mod_security 연동을 통한 ip 차단</title>
			<link>http://www.digimoon.net/blog/337</link>
			<description>&lt;FONT color=#0000ff&gt;작성자: 주인장 &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;디지문&lt;/FONT&gt;&lt;BR&gt;&lt;/STRONG&gt;(&lt;A href=&quot;http://www.digimoon.net/&quot; target=_blank&gt;http://www.digimoon.net/&lt;/A&gt;)&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;참고 링크:&lt;BR&gt;&lt;A href=&quot;http://free4u.wo.tc/weblog/11278&quot; target=_blank&gt;http://free4u.wo.tc/weblog/11278&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;원문 링크:&lt;BR&gt;&lt;A href=&quot;http://spamcleaner.org/en/misc/modsec2ipt.html&quot; target=_blank&gt;http://spamcleaner.org/en/misc/modsec2ipt.html&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;우선 이런 좋은 팁을 소개해 주신 &lt;A href=&quot;http://free4u.wo.tc/&quot; target=_blank&gt;http://free4u.wo.tc&lt;/A&gt;&amp;nbsp;의 &lt;SPAN class=member_4&gt;&lt;IMG title=&quot;id: EcusE&quot; style=&quot;VERTICAL-ALIGN: middle; MARGIN-RIGHT: 3px&quot; alt=&quot;id: EcusE&quot; src=&quot;http://free4u.wo.tc/weblog/files/member_extra_info/image_name/004/4.gif&quot; border=0&gt;님께 감사의 뜻을 전합니다.&lt;BR&gt;&lt;BR&gt;서버를 운영하면서 한 때 tcp 80번 포트를 목표로 한 Cache Control Attack을 받은 적이 있습니다.&lt;BR&gt;아파치 로그에 아래와 같은 로그가 마구마구 기록되면서 말이죠.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;xx.xx.xx.xx - - [13/Jun/2009:16:31:57 +0900] &quot;GET /zbxe/ HTTP/1.1&quot; 302 281 &quot;&lt;A href=&quot;http://www.foobar.com/&quot;&gt;http://www.foobar.com&lt;/A&gt;&quot; &quot;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate&quot; &lt;A href=&quot;http://www.foobar.com/&quot;&gt;www.foobar.com&lt;/A&gt; KR&lt;BR&gt;xx.xx.xx.xx - - [13/Jun/2009:16:31:57 +0900] &quot;GET /zbxe/ HTTP/1.1&quot; 302 281 &quot;&lt;A href=&quot;http://www.foobar.com/&quot;&gt;http://www.foobar.com&lt;/A&gt;&quot; &quot;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate&quot; &lt;A href=&quot;http://www.foobar.com/&quot;&gt;www.foobar.com&lt;/A&gt; KR&lt;BR&gt;xx.xx.xx.xx - - [13/Jun/2009:16:31:57 +0900] &quot;GET /zbxe/ HTTP/1.1&quot; 302 281 &quot;&lt;A href=&quot;http://www.foobar.com/&quot;&gt;http://www.foobar.com&lt;/A&gt;&quot; &quot;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate&quot; &lt;A href=&quot;http://www.foobar.com/&quot;&gt;www.foobar.com&lt;/A&gt; KR&lt;BR&gt;xx.xx.xx.xx - - [13/Jun/2009:16:31:57 +0900] &quot;GET /zbxe/ HTTP/1.1&quot; 302 281 &quot;&lt;A href=&quot;http://www.foobar.com/&quot;&gt;http://www.foobar.com&lt;/A&gt;&quot; &quot;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate&quot; &lt;A href=&quot;http://www.foobar.com/&quot;&gt;www.foobar.com&lt;/A&gt; KR&lt;BR&gt;--------------- ( 이 하 생 략 ) -------------------&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;Cache Control Attack은 DDOS 공격의 일종인데 2008년 하반기부터 기승을 부리기 시작한 비교적 최근의 공격 트렌드 방식입니다. 특징이 여타 DDOS 공격에 비해 bps와 pps 수치가 그다지 높지 않은 편임에도 불구하고 CPU와 메모리 자원을 거의 full로 소진시킨다는 점입니다. 이런 까닭에 네트워크 모니터링 장비에서 쉽사리 포착이 되지 않는 면이 있습니다. 공격받을 당시 pps 수치는 최대치가 15000 정도였고 그 외에 간헐적으로 공격이 들어올 때에는 5000-10000 정도에 달하는 수준이었습니다. 이 정도는 평상시 대용량 파일을 업/다운로드할 때에도 충분히 발생할 수 있는 수치인지라 Layer3~4 장비 단에서 공격 여부를 검출해 내기가 어려운 면이 있습니다. &lt;BR&gt;&amp;nbsp;그래서 http 헤더까지 분석하여 막을 필요가 있는데요. 위 로그에 나온 바와 같이 아파치 로그의 User Agent 란에 &quot;Cache-Control: no-store, must-revalidate&quot; 라는 문자열을 발생시키는 접근에 대해서 mod_security 웹방화벽에 의해 해당 패턴의 접근을 필터링하도록 설정하고 해당 IP를 자동으로 iptables에 등록시켜 tcp 80 포트로의 접근을 차단하는 방법을 스크립트로 구현 가능하지 않을까 평소에도 궁리를 하던 부분이었는데 이번에 우연찮게 원하던 방법을 구현하는 perl 스크립트에 대해 정보를 구할 수 있었습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;A href=&quot;http://spamcleaner.org/en/misc/modsec2ipt.html&quot; target=_blank&gt;http://spamcleaner.org/en/misc/modsec2ipt.html&lt;/A&gt;&amp;nbsp;에서 배포하고 있는 perl 스크립트입니다. 설치 및 운영에 관한 메뉴얼을 영문으로 자세하게 소개하고 있으므로 처음 보시는 분들도 적용하는데 무리 없을 겁니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;웹페이지 최하단에 첨부되어 있는 modsec2ipt.tgz 파일을 먼저 받습니다. 압축을 풀어보면 내용물은 아래와 같습니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost:~]# wget &lt;A href=&quot;http://spamcleaner.org/en/misc/modsec2ipt.tgz&quot;&gt;http://spamcleaner.org/en/misc/modsec2ipt.tgz&lt;/A&gt;&lt;BR&gt;[root@localhost:~]# tar xvfz modsec2ipt.tgz&lt;BR&gt;[root@localhost:~]# cd modsec2ipt&lt;BR&gt;[root@localhost:~]# ls -lh&lt;BR&gt;합계 12K&lt;BR&gt;-rw-r--r-- 1 root root&amp;nbsp; 422 2009-01-10 06:18 modsec2ipt&lt;BR&gt;-rwxr-xr-x 1 root root 1.2K 2009-04-07 22:27 modsec2ipt.pl&lt;BR&gt;-rwx------ 1 root root 1.6K 2009-04-07 22:27 modsec2ipt_srv.pl&lt;BR&gt;[root@localhost:~]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;보안을 위해 modsec2ipt.pl 파일을 웹으로 접근할 수 없는 경로에 위치시키고 mod_security에 의해 실행 가능하도록 nobody나 apache 소유권을 줍니다. 필자의 경우 /usr/local/apache 에 아파치를 설치해서 사용하고 있어서 바이너리 파일이 위치해 있는 /usr/local/apache/bin에 넣어서 사용하고 있습니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost:/usr/local/apache/bin]# pwd&lt;BR&gt;/usr/local/apache/bin&lt;BR&gt;[root@localhost:/usr/local/apache/bin]# ls -lh modsec2ipt.pl&lt;BR&gt;-rwxr-xr-x 1 nobody nobody 1.1K&amp;nbsp; 6월 18 11:55 modsec2ipt.pl&lt;BR&gt;[root@localhost:/usr/local/apache/bin]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;modsec2ipt_srv.pl 파일을 /usr/bin 디렉토리에 넣습니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost:/usr/bin]# pwd&lt;BR&gt;/usr/bin&lt;BR&gt;[root@localhost:/usr/bin]# ls -lh modsec2ipt_srv.pl&lt;BR&gt;-rwx------ 1 root root 1.7K&amp;nbsp; 6월 18 12:24 modsec2ipt_srv.pl&lt;BR&gt;[root@localhost:/usr/bin]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;modsec2ipt_srv.pl 파일을 편집기로 열어보면 아래와 같이 상단부에 로그 파일 경로가 지정되어 있습니다(붉은색 부분). 기본값으로는 /var/log/modsec2ipt.log, /var/log/modsec2ipt_error.log 인데 임의로 변경 가능합니다. 기본값을 그대로 유지한다면 touch 커맨드로 /var/log/modsec2ipt.log, /var/log/modsec2ipt_error.log 파일을 생성해 줍니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;#!/usr/bin/perl&lt;BR&gt;###########################################################&lt;BR&gt;# modsec2ipt_srv.pl&lt;BR&gt;#&lt;BR&gt;# server used to block IPs with iptables and mod_security.&lt;BR&gt;# uses/creates the chain &quot;MODSEC2IPT&quot;&lt;BR&gt;#&lt;BR&gt;###########################################################&lt;BR&gt;$chain = &quot;MODSEC2IPT&quot;;&lt;BR&gt;# blocked IP&#039;s log :&lt;BR&gt;$log&amp;nbsp; = &#039;&lt;FONT color=#ff0000&gt;/var/log/modsec2ipt.log&lt;/FONT&gt;&#039;;&lt;BR&gt;# errors log :&lt;BR&gt;$error_log=&#039;&lt;FONT color=#ff0000&gt;/var/log/modsec2ipt_error.log&lt;/FONT&gt;&#039;;&lt;BR&gt;###########################################################&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;/etc/xinetd.d/modsec2ipt 파일을 아래와 같이 작성합니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;service modsec2ipt&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp; &amp;nbsp; flags &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = NAMEINARGS&lt;BR&gt;&amp;nbsp; &amp;nbsp; socket_type &amp;nbsp; = stream&lt;BR&gt;&amp;nbsp; &amp;nbsp; protocol &amp;nbsp; &amp;nbsp;&amp;nbsp; = tcp&lt;BR&gt;&amp;nbsp; &amp;nbsp; wait &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; = no&lt;BR&gt;&amp;nbsp; &amp;nbsp; user &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; = root&lt;BR&gt;&amp;nbsp; &amp;nbsp; server &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; = /usr/sbin/tcpd&lt;BR&gt;&amp;nbsp; &amp;nbsp; server_args &amp;nbsp; = /usr/bin/modsec2ipt_srv.pl&lt;BR&gt;&amp;nbsp; &amp;nbsp; only_from &amp;nbsp; &amp;nbsp; = 127.0.0.1&lt;BR&gt;&amp;nbsp; &amp;nbsp; cps &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 1 1&lt;BR&gt;&amp;nbsp; }&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;/etc/services에 아래 내용을 한 줄 추가합니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;modsec2ipt &amp;nbsp; 54545/tcp&lt;/DIV&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;xinetd 수퍼데몬을 리스타트하면 스크립트가 작동을 시작합니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost:/usr/bin]# /etc/init.d/xinetd restart&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;아래와 같은 검사 결과가 나오면 설정에 이상 없는 것입니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost:/usr/bin]# telnet localhost 54545&lt;BR&gt;Trying 127.0.0.1...&lt;BR&gt;Connected to localhost.&lt;BR&gt;Escape character is &#039;^]&#039;.&lt;BR&gt;OK, modsec2ipt server&lt;BR&gt;quit&lt;BR&gt;OK&lt;BR&gt;Connection closed by foreign host.&lt;BR&gt;[root@localhost:/usr/bin]#&lt;BR&gt;&lt;BR&gt;[root@localhost:/usr/bin]# netstat -ntlp | grep 54545&lt;BR&gt;tcp &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 0 &amp;nbsp; &amp;nbsp;&amp;nbsp; 0 0.0.0.0:54545 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.0.0.0:* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LISTEN &amp;nbsp; &amp;nbsp;&amp;nbsp; 3227/xinetd&lt;BR&gt;[root@localhost:/usr/bin]#&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이제부터 스크립트에 의해 iptables에 등록되는 룰은 MODSEC2IPT라는 체인에 별도로 작성됩니다. 이 체인은 스크립트가 처음 작동할 때 자동으로 생성되므로 수동으로 직접 생성해 줄 필요가 없습니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;[root@localhost:~]# iptables -nL MODSEC2IPT | less&lt;BR&gt;Chain MODSEC2IPT (1 references)&lt;BR&gt;target &amp;nbsp; &amp;nbsp; prot opt source &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; destination&lt;BR&gt;DROP &amp;nbsp; &amp;nbsp; &amp;nbsp; all&amp;nbsp; -- &amp;nbsp;xx.xx.xx.xx &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 0.0.0.0/0&lt;BR&gt;DROP &amp;nbsp; &amp;nbsp; &amp;nbsp; all&amp;nbsp; -- &amp;nbsp;yy.yy.yy.yy &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.0.0.0/0&lt;BR&gt;DROP &amp;nbsp; &amp;nbsp; &amp;nbsp; all&amp;nbsp; -- &amp;nbsp;zz.zz.zz.zz &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 0.0.0.0/0&lt;BR&gt;( 이 하 생 략 )&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;실제로 웹방화벽에 의해 필터링되는 즉시 iptables에 의해 차단이 되는지 테스트해보겠습니다.&lt;BR&gt;&amp;nbsp;mod_security 설치 방법 및 운영에 관한 메뉴얼은 아래 URL에서 구하시기 바랍니다.&lt;BR&gt;&amp;nbsp;&lt;A href=&quot;http://www.krcert.or.kr/firewall2/index2.jsp&quot; target=_blank&gt;http://www.krcert.or.kr/firewall2/index2.jsp&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;URL주소 뒤에 &#039;ddos&#039;라는 문자열의 서브 디렉토리 경로를 추가 입력해서 접근을 시도할 경우 차단되도록 하기 위해 mod_security 룰 파일에 아래 룰을 추가하고 아파치를 리스타트합니다.&lt;BR&gt;&amp;nbsp;참고로 지금부터 언급하는 mod_security 룰은 1.9.5 버전을 기준으로 설명합니다. 2.x 버전부터는 룰 패턴이 조금 다르므로 이 점 유의 바랍니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;# modsec2ipt 최초 테스트 룰&lt;BR&gt;SecFilterSignatureAction &quot;log,deny,status:403,msg:&#039;Test Rule&#039;,exec:/usr/local/apache/bin/modsec2ipt.pl&quot;&lt;BR&gt;SecFilter &quot;\/ddos&quot;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;이제 &lt;A href=&quot;http://도메인/ddos&quot;&gt;http://도메인/ddos&lt;/A&gt; 과 같이 접속해 보면 예전처럼 웹방화벽의 필터링에 걸리면 웹브라우저에 403 에러 등의 메시지가 출력되는 것과는 달리 아예 접속 자체가 차단되는 것을 확인할 수 있습니다. tcp 80 포트로의 접근만 차단되는 것이므로 터미널로 iptables -nL 커맨드를 통해 접근을 시도한 클라이언트 측 IP가 MODSEC2IPT 체인에 등록된 것을 직접 확인할&amp;nbsp; 수 있습니다.&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;본 게시물의 서두에서 언급한 Cache Control Attcak 을 막기 위해서는 아래 룰을 추가해 주면 됩니다. 그러나 Cache Control Attcak이 반드시 위와 같은 아파치 로그 패턴을 남기는 것은 아니기 때문에 상황에 따라 알맞은 룰을 직접 커스터마이징해서 관리해야 할 것입니다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;# Cache-Control Attack 방어&lt;BR&gt;SecFilterSignatureAction &quot;log,deny,status:403,msg:&#039;Cache-Control Attack&#039;,exec:/usr/local/apache/bin/modsec2ipt.pl&quot;&lt;BR&gt;SecFilterSelective HTTP_User-Agent &quot;cache\-control|no\-store|must\-revalidate&quot;&lt;/DIV&gt;</description>
			<category>리눅스</category>
			<category>Cache Control Attack</category>
			<category>iptables</category>
			<category>mod_security</category>
			<category>스크립트</category>
			<category>웹방화벽</category>
			<category>펄스크립트</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/337</guid>
			<comments>http://www.digimoon.net/blog/337#entry337comment</comments>
			<pubDate>Thu, 06 Aug 2009 20:28:21 +0900</pubDate>
		</item>
		<item>
			<title>Ubuntu/Debian/Gentoo용 iptables 스크립트</title>
			<link>http://www.digimoon.net/blog/336</link>
			<description>&lt;P&gt;참고링크:&lt;BR&gt;&lt;A href=&quot;http://ubuntuforums.org/archive/index.php/t-19106.html&quot; target=_blank&gt;http://ubuntuforums.org/archive/index.php/t-19106.html&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;vi /etc/init.d/iptables&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;
&lt;P&gt;#!/bin/sh&lt;/P&gt;
&lt;P&gt;#This is an Ubuntu adapted iptables script from gentoo&lt;BR&gt;#(&lt;A href=&quot;http://www.gentoo.org/&quot;&gt;http://www.gentoo.org&lt;/A&gt;) which was originally distributed&lt;BR&gt;#under the terms of the GNU General Public License v2&lt;BR&gt;#and was Copyrighted 1999-2004 by the Gentoo Foundation&lt;BR&gt;#&lt;BR&gt;#This adapted version was intended for and ad-hoc personal&lt;BR&gt;#situation and as such no warranty is provided.&lt;/P&gt;
&lt;P&gt;. /lib/lsb/init-functions&lt;/P&gt;
&lt;P&gt;IPTABLES_SAVE=&quot;/etc/iptables&quot;&lt;BR&gt;SAVE_RESTORE_OPTIONS=&quot;-c&quot;&lt;/P&gt;
&lt;P&gt;checkrules() {&lt;BR&gt;if [ ! -f ${IPTABLES_SAVE} ]&lt;BR&gt;then&lt;BR&gt;echo &quot;Not starting iptables. First create some rules then run&quot;&lt;BR&gt;echo &quot;\&quot;/etc/init.d/iptables save\&quot;&quot;&lt;BR&gt;return 1&lt;BR&gt;fi&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;save() {&lt;BR&gt;/sbin/iptables-save ${SAVE_RESTORE_OPTIONS} &amp;gt; ${IPTABLES_SAVE}&lt;BR&gt;return $?&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;start(){&lt;BR&gt;checkrules || return 1&lt;BR&gt;/sbin/iptables-restore ${SAVE_RESTORE_OPTIONS} &amp;lt; ${IPTABLES_SAVE}&lt;BR&gt;return $?&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;case &quot;$1&quot; in&lt;BR&gt;save)&lt;BR&gt;echo -n &quot;Saving iptables state...&quot;&lt;BR&gt;save&lt;BR&gt;if [ $? -eq 0 ] ; then&lt;BR&gt;echo &quot; ok&quot;&lt;BR&gt;else&lt;BR&gt;echo &quot; error !&quot;&lt;BR&gt;fi&lt;BR&gt;;;&lt;/P&gt;
&lt;P&gt;start)&lt;BR&gt;log_begin_msg &quot;Loading iptables state and starting firewall...&quot;&lt;BR&gt;start&lt;BR&gt;log_end_msg $?&lt;BR&gt;;;&lt;BR&gt;stop)&lt;BR&gt;log_begin_msg &quot;Stopping firewall...&quot;&lt;BR&gt;for a in `cat /proc/net/ip_tables_names`; do&lt;BR&gt;/sbin/iptables -F -t $a&lt;BR&gt;/sbin/iptables -X -t $a&lt;/P&gt;
&lt;P&gt;if [ $a = nat ]; then&lt;BR&gt;/sbin/iptables -t nat -P PREROUTING ACCEPT&lt;BR&gt;/sbin/iptables -t nat -P POSTROUTING ACCEPT&lt;BR&gt;/sbin/iptables -t nat -P OUTPUT ACCEPT&lt;BR&gt;elif [ $a = mangle ]; then&lt;BR&gt;/sbin/iptables -t mangle -P PREROUTING ACCEPT&lt;BR&gt;/sbin/iptables -t mangle -P INPUT ACCEPT&lt;BR&gt;/sbin/iptables -t mangle -P FORWARD ACCEPT&lt;BR&gt;/sbin/iptables -t mangle -P OUTPUT ACCEPT&lt;BR&gt;/sbin/iptables -t mangle -P POSTROUTING ACCEPT&lt;BR&gt;elif [ $a = filter ]; then&lt;BR&gt;/sbin/iptables -t filter -P INPUT ACCEPT&lt;BR&gt;/sbin/iptables -t filter -P FORWARD ACCEPT&lt;BR&gt;/sbin/iptables -t filter -P OUTPUT ACCEPT&lt;BR&gt;fi&lt;BR&gt;done&lt;BR&gt;log_end_msg 0&lt;BR&gt;;;&lt;/P&gt;
&lt;P&gt;restart)&lt;BR&gt;log_begin_msg &quot;Restarting firewall...&quot;&lt;BR&gt;for a in `cat /proc/net/ip_tables_names`; do&lt;BR&gt;/sbin/iptables -F -t $a&lt;BR&gt;/sbin/iptables -X -t $a&lt;BR&gt;done;&lt;BR&gt;start&lt;BR&gt;log_end_msg $?&lt;BR&gt;;;&lt;/P&gt;*)&lt;BR&gt;echo &quot;Usage: /etc/init.d/iptables {start|stop|restart|save}&quot; &amp;gt;&amp;amp;2&lt;BR&gt;exit 1&lt;BR&gt;;;&lt;BR&gt;esac&lt;BR&gt;&lt;BR&gt;exit 0&lt;/DIV&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;chmod 700 /etc/init.d/iptables&lt;BR&gt;update-rc.d iptables defaults&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;스크립트 작성이 끝나면 스크립트 구동 전 수동으로 iptables 룰을 먼저 작성한다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;BR&gt;iptables -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT&lt;BR&gt;iptables -A INPUT -p udp -m udp --dport 631 -j ACCEPT&lt;BR&gt;iptables -A INPUT -d 224.0.0.251/32 -p udp -m udp --dport 5353 -j ACCEPT&lt;BR&gt;iptables -A INPUT -p ah -j ACCEPT&lt;BR&gt;iptables -A INPUT -p esp -j ACCEPT&lt;BR&gt;iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT&lt;BR&gt;iptables -A INPUT -i lo -j ACCEPT&lt;BR&gt;iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT&lt;BR&gt;iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT&lt;BR&gt;iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT&lt;BR&gt;iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT&lt;BR&gt;iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT&lt;BR&gt;iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT&lt;BR&gt;iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;그 다음 init 스크립트로 현재 룰을 저장한다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;/etc/init.d/iptables save&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;이제부터는 수동으로 일일이 iptables 룰 입력 없이 /etc/iptables 파일을 직접 편집하면서 init 스크립트로 iptables 룰을 손쉽게 관리할 수 있다.&lt;BR&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;/etc/init.d/iptables start|stop|restart|save&lt;/DIV&gt;</description>
			<category>리눅스</category>
			<category>.</category>
			<author>(디지문)</author>
			<guid>http://www.digimoon.net/blog/336</guid>
			<comments>http://www.digimoon.net/blog/336#entry336comment</comments>
			<pubDate>Mon, 03 Aug 2009 01:41:53 +0900</pubDate>
		</item>
	</channel>
</rss>
