APACHE 보안
1. 웹문서디렉토리(DocumentRoot)에서 불필요한 문서 제거
소스로 아파치를 설치하게 되면 기본 웹 문서가 위치하는 디렉토리가 /usr/local/apache/htdocs입니다. htdocs 디렉토리에는 아파치 관련정보가 들어있는 문서와 공개될 필요가 없는 문서가 위치하고 있습니다. 이 문서들을 제거합니다.
httpd.conf 지시자
DocumentRoot "/usr/local/apache/htdocs"
명령어
① [root@nextline ~]# cd /usr/local/apache/htdocs/
DocumentRoot 디렉토리로 이동합니다.
② [root@nextline htdocs]# rm -rf *
rm 명령어를 이용하여 /usr/local/apache/htdocs/ 하위의 모든 문서를 제거합니다.
또 다른 방법으로는 httpd.conf에서 DocumentRoot값을 새로운 경로로 지정합니다.
2. 불필요한 CGI 스크립트제거하기
apache를 설치하면 cgi-bin 디렉토리에 기본으로 CGI스크립트가 설치됩니다. 이 CGI 스크립트가 공격에 이용될 수도 있기 때문에 모두 제거하도록 합니다. 특히 초기버전인 경우에 php.cgi등이 제공되었는데 해킹의 빌미를 제공하였다. cgi-bin 디렉토리에 있는 모든 파일을 제거합니다.
cgi-bin 경로
/usr/local/apache/cgi-bin
명령어
① [root@nextline ~]# cd /usr/local/apache/cgi-bin
DocumentRoot 디렉토리로 이동합니다.
② [root@nextline htdocs]# rm -rf *
rm 명령어를 이용하여 /usr/local/apache/cgi-bin 하위의 모든 문서를 제거합니다.
3. DocumentRoot, 사용자 홈디렉토리(/home)에 설정하는 디렉토리 옵션 설정하기
기본적인 설정을 모두 제거하고 보안과 관련있는 항목만 옵션으로 지정합니다.
httpd.conf 지시자
/usr/local/apache/htdocs/">
Options Indexes FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Options Includes FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
/usr/local/apache/htdocs/">
tag에 의하여 각 directory마다 적절하게 permission을 걸 수가 있습니다.
① Options Indexes FollowSymLinks ExecCGI
None
어떤 옵션도 이용할 수 없습니다.
All
지정한 directory에서 모든 명령을 이용할 수 있습니다.
Indexes
URL에 지정된 디렉토리에 (index.html 같은) 지정된 파일이 없을 경우 디렉토리의 파일 목록을 보여주는 옵션입니다.
Includes
서버측의 추가적인 정보를 제공할 수 있게 합니다.
IncludesNoExec
서버측의 추가적인 정보를 제공할 수 있게 하지만, 어떠한 실행 파일을 실행하는 것을 방지합니다.
FollowSymLinks
디렉토리상의 심볼릭 링크를 사용 가능하게 합니다.
ExecCGI
CGI 스크립트를 실행할 수 있게 합니다.
MultiViews
All 옵션이 설정되었을 때만 지정된 목록의 multiviews를 허용합니다.
② AllowOverride All
.htaccess파일은 서버의 각 디렉토리에 만들어서 각 디렉토리에 대한 접근을 제어하기 위한 것으로 디렉토리에 .htaccess파일이 있으면, 서버 전체에 작용하는 access.conf 보다 우선권을 가집니다. .htaccess파일에 대한 Override에 대한 옵션입니다.
None
.htaccess파일을 읽을 수 없게 합니다.
All
모든 지정에 대해 가능하게 합니다.
Options
규정된 디렉토리 형식을 콘트롤하는 지정의 사용을 허락합니다.
FileInfo
문서형식을 콘트롤하는 지정의 사용을 허용합니다.
AuthConfig
사용자 인증 지정의 사용을 허용합니다. 사용자 인증 변수를 사용합니다.
Limit
호스트 접근을 콘트롤하는 지정을 허용합니다.
③ Order
Limit에 관련된 부분을 설정을 합니다. 서버가 access control을 수행하는 순서를 나타냅니다. 여기서는 allow기능을 먼저 수행하고, deny기능을 수행하라는 것입니다.
deny, allow
deny 지시자 부터 검사하고 allow 지시자를 검사 합니다.
allow, deny
allow 지시자 부터 검사하고 deny 지시자를 검사 합니다.
mutual-failure
allow목록에 없는 모든 host에게 접속을 거부 합니다.
allow from
나열되는 주소들에 대한 access control을 가능하게 합니다. 사용 가능한 주소는 도메인 네임, 호스트 이름 주소, 호스트 ip 주소, ip 주소의 앞부분 3바이트, 모든 주소에 해당하는 all 이 있습니다.
deny from
allow from과 반대되는 개념이며, 사용가능한 주소는 allow from과 같다.
Require
사용자, 그룹에 대한 접근을 통제할 수 있습니다.
사용방법 : require entity en1 en2 ... enn
entity에 들어갈 수 있는 것은 user, group, valid-user의 세가지이다.
User
지정된 사용자들에게만 접근을 허용하는 것으로, 지정된 사용자에 대한 정보는 AuthUserFile에서 지정한 파일에 있습니다.
Group
지정된 그룹에게만 접근을 허용하는 것으로, 지정된 그룹에 대한 정보는
AuthGroupFile에서 지정한 파일에 있습니다.
valid-user
AuthUserFile에 있는 모든 사용자에 대해 접근을 허용합니다.
4. ~ 태그 이용하기
태그는 각 디렉토리별로 HTTP Method의 사용여부를 통제하는 태그입니다. 파일의 업로드 및 파일의 수정, 삭제를 위해서 사용되는 HTTP Method는 PUT과 POST, DELETE 가 있는데 이 Method를 제한합니다.
httpd.conf 지시자
Require valid-user
개인 사용자 홈디렉토리에서 POST, PUT, DELETE Method를 패스워드 파일에 등록된 사용자만이 이용가능하도록 제한한 것입니다.
5. 헤더 정보 숨기기
클라이언트가 Apache 웹서버에 접속했을 때 웹서버에서는 응답 메시지의 헤더에 웹서버 버전, 설치된 응용프로그램 등과 같은 정보를 전달합니다.
① 헤더 정보 확인하기
[root@nextline ~]# telnet xxx.xxx.xxx.xxx 80
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Date: Sat, 14 Dec 2002 14:24:11 GMT
Server: Apache/1.3.26 (Unix) PHP/4.2.2
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
이 정보는 공격자에 의해 Apache 웹서버 버전과 구동되고 있는 응용프로그램의 버전을 확인하고 알려진 취약점을 이용하여 공격하는데 유용하게 이용될 수 있습니다.
② 헤더 정보 숨기기
Apache 웹서버에서는 "ServerTokens"지시자를 수정함으로써 헤더에 의해 전송되는 정보를 바꿀 수 있습니다.
httpd.conf 지시자
ServerTokens 키워드
③ 키워드와 제공되는 정보
Prod[ductOnly]
웹서버 종류만 표기됩니다. 예) Server:Apache
Min[imal]
Prod 키워드 제공정보 + 웹서버 버전 예) Server:Apache/1.3.26
OS
Min 키워드 제공 정보 + 운영체제 예) Server:Apache/1.3.26 (Unix)
Full
OS 키워드 제공정보 + 설치된 모듈(응용프로그램) 정보
예) Server: Apache/1.3.26 (Unix) PHP/4.2.2
참고: ServerToken은 apache 1.3이상에서 가능하고 ProductOnly키워드는 1.3.12버전 이상에서만 사용가능하다. 일반적으로 ServerTokens은 httpd.conf에 명시되어 있지 않는 경우가 많다. 이런 경우에는 기본값인 "ServerTokens Full"이 적용되어 모든 정보가 응답 헤더에 포함되어 클라이언트에게 전송됩니다. 최소한의 정보를 주기 위해서는 "ServerTokens Prod"가 좋습니다.
6. 기본 사용자 인증 설정
기본 사용자 인증과 다이제스트 사용자 인증의 설정 방법은 매우 유사하다. 다음과 같이 두가지 절차를 거쳐 설정할 수 있습니다.
* 패스워드 파일 생성
* 패스워드 파일을 사용할 수 있도록 Apache 환경 설정
① 패스워드 파일생성
[root@nextline ~]# cd /usr/local/apache/bin/
아파치 bin 디렉토리로 이동합니다.
[root@nextline ~]# ./htpasswd -c /usr/local/apache/password nextline
New password: (패스워드입력)
Re-type new password: (패스워드입력)
패스워드 파일을 처음 생성할 경우에는 -c 옵션을 사용하여 만듭니다.
[root@www /usr/local/apache/bin]# ./htpasswd /usr/local/apache/password nextline2
New password: (패스워드입력)
Re-type new password: (패스워드입력)
사용자를 추가할 경우에는 -c 옵션을 빼고 사용하면 됩니다. 만약 -c 옵션을 사용할 경우에는 기존의 등독된 사용자들은 지워지므로 주의해야 합니다.
[root@www /usr/local/apache/bin]# cat ../password
nextline:LT30X3txYYEuY
nextline2:/RfZRDXV1N/Eo
패스워드 파일을 확인해보면 사용자ID와 패스워드 필드로 구성되어 있는데, 패스워드 필드는 암호화되어 저장됩니다. 또한 두 사용자가 암호를 동일하게 입력해도 암호화된 값 은 다르게 나타납니다.
② 패스워드 파일을 사용가능하기 위한 환경설정
httpd.conf파일내에서 디렉토리별로 사용자 인증을 하기 위한 설정을 하면 됩니다.
httpd.conf 지시자
AllowOverride AuthConfig
사용자 인증이 필요한 디렉토리에 아래의 지시자들이 포함된 .htaccess파일을 생성 합니다.
지시자
AuthType
인증형태(Basic 또는 Digest)
AuthName
인증영역(웹브라우저의 인증창에 표시됨)
AuthUserFile
사용자 패스워드 파일의 위치
AuthGroupFile
그룹 파일의 위치(옵션)
Require
접근을 허용할 사용자 또는 그룹정의
예문
앞의 패스워드 파일에 등록된 nextline, nextline2라는 사용자만을 정해진 디렉토리에 접속할 수 있도록 설정해보자.
[nextline@nextline ~]$ cat .htaccess
AuthType Basic
AuthName "Welcome nextline's Home
AuthUserFile /usr/local/apache/password
Require user nextline nextline // 만약 패스워드파일에 등록된 모든 사용자를 접근가능하도록 설정하려면 Require valid-user 라고 하면 됩니다.
관련명령어
htpasswd
아파치 사용자 인증을 위한 파일을 생성하거나 업데이트를 하는 명령입니다.
사용법
htpasswd [options] password_file username
options
-c
새로운 패스워드 파일을 생성합니다.
[nextline@nextline ~]$ htpasswd -c /usr/local/apache/password nextline
password라는 파일을 생성하면서 nextline이라는 사용자를 등록합니다.
[nextline@nextline ~]$ htpasswd /usr/local/apache/password nextline2
nextline2 라는 사용자를 등록합니다.
7. 접근통제
클라이언트가 사용하는 호스트의 IP주소나 도메인에 의해서 웹서버의 데이터에 대한 접근을 통제할 수 있습니다.. 기본적인 서버 설정은 DocumentRoot의 내용에 대해 누구나 접속 을 허락하도록 설정되어 있습니다.
Apache의 "Allow"와 "Deny"지시자는 사용자 시스템의 호스트 이름과 호스트 주소를 근간으로 접속을 허락 또는 차단할 수 있도록 지정할 수 있습니다. 또한, "Allow"와 "Deny"지시자를 동시에 사용할 경우 그 순서를 정하는 "Order" 지시자를 사용하여 보다 정교한 정책설정을 할 수 있습니다.
Order Deny,Allow
Deny지시자가 Allow지시자보다 먼저 검사됩니다. 접근을 기본적으로 허용됩니다.
즉, Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의 접속을 허용합니다.
Order Allow,Deny
Allow지시자가 Deny지시자보다 먼저 검사됩니다. 접근을 기본적으로 차단됩니다.
즉, Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의 접속은 차단합니다.
Order Mutual-failure
Allow 리스트에 있고, Deny리스트에 없는 호스트만 접근을 허용합니다.순서는 "Allow,Deny"때와 같다.
(참고) 일반적인 Firewall이나 라우터의 접근통제 Rule은 순차적으로 비교하다가 최초로 일치하는 Rule을 적용하고 그 이후는 비교하지 않지만, Apache에서는 Allow와 Deny를 일단 모두 비교하고 둘 중에 하나라도 일치할 경우 적용합니다는 점에서 차이가 있습니다.. 또한 "Order"지시자 사용시 키워드(Allow 또는 Deny)는 콤마(,)에 의해서만 분리되고 공백이 들어가서는 안됩니다.
Order deny,allow
deny from all
allow from 172.16.10
"deny from"과 "allow from"지시자는 호스트, 도메인 이름, IP주소, 서브넷마스크를 가진 주소(예를 들면 172.16.10.0/255.255.255.0), CIDR(Classes InterDomain Routing)마스크를 가진 IP주소(172.16.10.0/24)를 사용할 수 있습니다.
8. 권한부여
권한부여는 특정한 자원에 접근할 사용자 퍼미션이 유효한지를 확인하는 것입니다. 어떤 퍼미션에 의해 허락되고 거부될지는 자원과 그 자원과 관련된 규칙들에 따라서 다양하다. 각 파일과 디렉토리구조는 다른 접근통제나 사용자인증 방법을 가질 수 있습니다. 접근통제와 사용자 인증방법을 사용하여 각 자원에 대한 다양한 권한을 부여할 수 있습니다. 가령 인터넷에서 접속 시에는 사용자이름과 패스워드를 확인하고 인트라넷에서 접속 시에는 요구하지 않도록 설정할 수도 있습니다. 이는 "Satisfy"지시자를 통해서 구현할 수 있습니다.
Satisfy any | all
all은 인트라넷 사용자에 대해 패스워드를 묻지 않고 접속이 가능하게 하는 것이고, any는인트라넷 사용자라도 패스워드를 묻는다.
Order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
AuthType Basic
AuthName "Welcome Posein's Home"
AuthUserFile /usr/local/apache/password
Require nextline nextline2
Satisfy Any
AuthName 항목에서 1.3버전에서는 겹따옴표가 앞쪽에 하나이고, 2.0버전에서는 겹따옴표가 앞뒤로 두개를 써야 합니다.
|