# 웹서버일경우 80으로 들어오는 요청과 1.1.1.1 에서들어오는 ssh 요청을
# 받아들인다.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 1.1.1.1 --dport 22 -j ACCEPT
# 1초에 15번 이상의 HTTP 접근을 할경우 (DOS공격) 접근을 차단한다.
# 이기능을 사용하려면 커널컴파일 및 iptables 패치가 필요하다. (리눅스서버 보완관리 실무 P.298 참조)
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -connlimit-mask 24 -j DROP
# 메일서버의 경우 동시에 5개이상 SMTP 접근자(스팸머)의 경우 5분동안
# 접근을 제한한다.
iptables -A INPUT -m recent --name spammer --rcheck --seconds 300 -j drop
iptables -A INPUT -p tcp --syn --dport 25 -m connlimit --connlimit-above 5 -m recent --name spammer --set -j DROP
# STRING 필터기능
# MSN 문자열이들어간 패킷 차단
iptables -A FORWARD -m string --string "messenger.msn.com" -j DROP
# 싸이월드로 접속차단
iptables -A FORWARD -p tcp --dport 80 -m string --string "Host: cyworld.nate.com" -j DROP
# 포트스캔을 차단한다.
iptables -A INPUT -m psd -j DROP
# 만약서버가 해킹당해 DOS공격지로 사용될때 적용시킴.
# DNS 쿼리이외에 UDP 패킷이 나가는 것을 방지
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp ! --dport 53 -m state --state NEW -j DROP
MRTG(Multi Router Traffic Grap her)는 펄(Perl)과 C 언어로 구성돼 있고, 유닉스와 NT에서 동작한다. 일, 주, 월, 년 간으로 트래픽 발생량을 그래프화해 보여주므로 시간대별 흐름을 파악하는데 좋은 분석 도구가 될 수 있다.
대체적으로 MRTG는 네트워크 장비인터페이스별 트래픽 분석, CPU나 메모리 사용률 분석, 모뎀별 포트 사용률 분석 등에 사용되고 있다. 그러나 트래픽 모니터링 뿐만 아니라, SNMP 값(MIB 값)을 이용해 다양한 모니터링이 가능하고 외부 프로그램을 사용할 수 있기 때문에 다양한 변형이 가능하며, MRTG가 생성하는 로그 값을 가공해 새 DB의 구축에도 응용할 수도 있다.
MRTG의 주요 기능
기본적으로 네트워크 장비가 SNMP를 지원한다면 MRTG를 사용할 수 있다. MRTG의 가장 큰 장점이라면 결과치의 흐름을 알 수 있기 때문에 사업 계획을 세우는 자료로 활용할 수 있고, 로그값을 가공해 여러 용도로 이용할 수 있는 것.
로그값을 가공하는 데는 여러 방법이 있겠지만, 필자는 주로 펄 언어를 사용했다. 그러나 PHP를 이용하면 복잡한 CGI 프로그램이 없어도 쉽게 웹 상에서 활용할 수 있을 것이다. 주로 활용되는 분야는 다음과 같다.
·장비의 특정 인터페이스에 대한 트래픽 모니터링
(그림 1)은 MRTG를 이용한 라우터에 관한 일간 그래프다. KT-IX와 155Mbps로 연결된 라우터의 1개 포트에 대한 트래픽을 보여주고 있다.
·CPU 사용률 모니터링
(그림 2)는 주간 그래프로, 라우터의 CPU 사용률을 보여주고 있다. 이를 통해 입출력이 같음을 알 수 있다.
·RAS 장비에 대한 포트 사용률 모니터링
(그림 3)은 가입자들이 014XY로 접속한 포트 수를 보여준다. 이 값은 RAS 장비에서 현재 접속한 사용자 수를 읽어와서 펄 언어로 작성된 프로그램을 이용해 가공한 후, MRTG를 이용한 그래프 작성법을 이용했다.
·특정 서버에 대한 세션 수 측정
(그림 4)는 일간 그래프로, 프록시 서버의 TCP 세션 수를 보여 준다. 사용된 OID는 ‘1.3.6.1.2.1.6. 9.0’.
MRTG 그래프는 이 로그 값을 기초로 해서 만들어진다. 형식은 unix time, current_in, current_out, max _in, max_out로 나타난다. 유닉스 시간은 1970년 1월 1일을 0으로 해서 1초마다 카운트한 값이다. 로그 시간을 보면 5분마다 쌓이는 것을 볼 수 있다. 각 레코드가 공백으로 구분돼 있기 때문에, C언어나 펄 언어 등을 이용해서 current_in 값을 배열로 저장해, 매일 특정 시간대의 평균 트래픽 등을 계산하는데 이용할 수 있다.
유닉스에서 MRTG 구축하기
MRTG는 소스 코드로 제공되기 때문에 다운로드 받은 후 컴파일하는 작업이 필요하다. 따라서 컴파일하기 위해서는 C 컴파일러가 설치돼 있어야 한다. 그외 유닉스에서 MRTG를 수행하는 데 필요한 프로그램으로써는 Perl, gd, libpng, zlib가 있어야 한다. 그리고 웹으로 공유하기 위해서는 웹 서버가 필요하다.
① GCC 설치하기
웹(http://gcc.gnu.org)에서 다운로드 받아서 인스톨하면 된다.
② Perl 설치하기
웹에서(www.perl.com) v5.005 이상을 다운로드 받아서 설치한다. 이미 설치가 돼 있는 경우, 버전 확인은 ‘perl -v’로 알 수 있다.
gzip -d stable.tar.gzip (stable이라는 이름에서 최신의 안정된 버전 이라는 뜻으로 추정) tar -xvf stable.tar mv ./stable*/ /usr/local/perl/ (프로그램은 주로 /usr/local/ 디렉토리로 이동시킨다) cd /usr/local/perl rm -f config.sh(기존에 설치된 config shell 파일을 지움) sh Configure (configure 파일 생성) make (소스 파일이므로 컴파일 함) make test make install(컴파일 후 인스톨 함)
③ 그래픽 생성용 라이버러리 만들기
MRTG가 생성하는 그래픽 파일의 형식이 PNG라고 위에서 언급했다. 이를 위해 gd 라이브러리가 필요하고, 이 gd 라이브러리는 2개의 라이브러리(zlib, libpng)가 설치돼 있어야 컴파일이 가능하다.
a. zlib(그래픽 파일을 압축함)
웹(www.info-zip.org/pub/infozip/zlib)에서 최신 버전을 다운받아 설치한다.
gzip -d zlib.tar.gz tar -xvf zlib.tar mv ./zlib*/ /usr/local/zlib/(program은 주로 /usr/local/ 디렉토리로 이동) cd /usr/local/zlib ./configure make make test make install
b. libpng(zlib의 그래픽 파일을 PNG 포맷으로 변형)
웹(www.libpng.org/pub/png)에서 다운로드 한다.
gzip -d libpng-1.0.8.tar.gz (stable 이라는 이름에서 최신의 안정된 버전을 말하는 것 같음) tar -xvf libpng-1.0.8.tar mv ./libpng*/ /usr/local/libpng/(program은 주로 /usr/local/ 디렉토리로 이동) cd /usr/local/libpng cp scripts/makefile.std makefile(scripts 디렉토리 밑에서 해당 OS에 맞는 makefile 선택해서 makefile로 복사함) make test make install
c. gd
웹(www.boutell.com/gd)에서 다운로드 한다.
gzip -d gd-1.8.3.tar.gz (stable 이라는 이름에서 최신의 안정된 버전을 말하는 것 같음) tar -xvf gd-1.8.3.tar mv ./gd*/ /usr/local/gd/ (program은 주로 /usr/local/ 디렉토리로 이동) cd /usr/local/gd make make install
④ MRTG 설치하기
웹(http://ee-staff.ethz.ch/~oetiker/webtools/ mrtg/pub/beta)에서 최신 버전을 다운로드 한다.
gzip -d mrtg-2.9.0pre21.tar.gz | tar -xvf (gzip과 tar를 한꺼번에 실행함) mv ./mrtg*/ /usr/local/mrtg/ cd /usr/local/mrtg ./configure --with-gd=/usr/local/src/gd --with-z=/usr/local/src/zlib --with-png=/usr/local/src/libpng(라이버러리들이 있는 위치를 지정해줌) make
MRTG가 이상없이 설치됐다면 run 디렉토리 밑에 mrtg, cfgmaker와 같은 실행 파일이 만들어지게 된다. run 디렉토리 밑에 있는 실행 파일들은 꼭 이 위치가 아니더라도 실행하는 데는 지장이 없다.
⑤ cfg 파일 생성
이제 cfgmaker를 이용해 mrtg.cfg 파일(꼭 이름이 mrtg.cfg일 필요는 없다. cfg 성격에 맞게, router.cfg, switch.cfg 등의 이름을 만들어 주면 된다)을 형식에 맞게 만들어서 실행하면 된다.
cfgmaker --global ‘WorkDir: /home/httpd/mrtg’ --global ‘Options[_]: bits,growright’ --output /home/httpd/mrtg/mrtg.cfg community at router.abc.xyz
WorkDir은 결과 파일이 만들어질 디렉토리를 말한다. 옵션은 여러 가지가 있는데, 비트를 선택하지 않으면 바이트가 기본값이 되고, growright는 그래프를 오른쪽에서 왼쪽 순서로 그리도록 한다.
Output은 mrtg.cfg 파일이 생성되는 경로를 지정하는 것이고, 마지막 줄은 실제 모니터링 하려고 하는 네트워크 장비를 적어 준다. 여기서 community는 장비마다 SNMP 값을 갖고 올 때 사용하는 고유값인데, 기본적으로 public을 사용한다. router.abc.zyz는 네트워크 장비의 IP 주소나 호스트명을 적으면 된다.
이렇게 실행하면 그 결과 값이 /home/httpd/mrtg 디렉토리 밑에 만들어진다. 처음 실행하면 경고 메시지가 뜨는데, 이는 비교할 수 있는 로그값이 없기 때문이므로 걱정하지 않아도 된다. 위의 명령을 2, 3번 정도 반복하면 정상적인 트래픽을 볼 수 있다.
⑦ 5분마다 MRTG 실행하기
위의 명령이 주기적으로 실행되게 하기 위해서는 crontab을 이용하면 된다. 만일 매 5분마다 실행하기 위해서는 crontab 파일에 다음 한 줄을 추가하면 된다(crontab 파일은 시스템마다 다른데, 우리 환경의 경우 /var/spool/cron/crontabs/root 파일을 이용한다).
0,5,10,15,20,25,30,35,40,45,50,55 * * * * [CODE]<mrtg-bin>/mrtg <path to mrtg-cfg>/mrtg.cfg[/CODE]
그리고 이를 적용하려면 ‘crontab root’ 하면 된다.
⑧ 아파치 서버 설치
마지막으로 html 파일들을 웹 브라우저를 통해 보기 위해서는 웹 서버를 구동해야 되는데, 유닉스 시스템에서 가장 많이 사용되어지는 아파치(Apache) 서버에 대해 간단히 설명하겠다(보다 자세한 것은 아파치 홈페이지를 참조하기 바란다). 먼저 웹(www.apache.org /dist)에서 최신 버전을 다운로드 받아 설치한다.
gzip -d apapche_1.3.12.tar.gz | tar -xvf mv ./apache*/ /usr/local/apache/ cd /usr/local/apache ./configure make make install conf/httpd.conf 파일 수정작업(기본적인 웹서버로 동작하기 위해 필요한 설정을 하는 곳) /usr/local/apache/bin/apachectl start(아파치를 실행)
윈도우 NT에서 MRTG 설치하기
윈도우 NT에서의 MRTG 설치는 간단하다. 윈도우 NT용 펄(perl) 프로그램과 MRTG를 다운로드 받아서 설치하면 된다.
① 펄 설치하기
웹에서(www.ActiveState.com)에서 ActivePerl 616을 다운 받아 설치한다. 설치 후에는 경로가 제대로 설정됐는지 [제어판] → [시스템] → [환경변수]에서 확인.
② MRTG 설치하기
MRTG도 마찬가지로 MRTG 사이트(http://ee-staff.ethz.ch/~oetiker/webtools/mrtg/pub/beta)에서 윈도우 NT용 최신버전을 다운로드 받아서 설치만 하면 된다(윈도우 NT용은 확장자가 .zip인 파일). 이전 버전에서는 MRTG 파일을 수정해야 됐지만, 이제는 그럴 필요가 없다. MRTG 설치가 끝나면 이제 실제 cfg 파일을 만든 후 MRTG가 제대로 동작하는지 확인하는 과정만 거치면 된다.
(IP주소가 10.10.10.1인 라우터인 경우 인터페이스별로 고유의 포트 번호를 가진 cfg 파일을 만들게 된다)
④ MRTG 실행하기
c:>perl mrtg mrtg.cfg
이렇게 실행하면 유닉스도 마찬가지지만 에러 메시지가 나타나는데, 2번 더 반복하면 더 이상 에러 메시지없이 정상 그래프를 출력하게 된다. 유닉스와 마찬가지로 5분마다 MRTG를 실행하기 위해서는 윈도우 NT의 AT 스케줄러를 이용하거나 MRTG 스태틱 업데이터(Static Updater) 서비스를 사용할 수도 있지만, 간단히 mrtg. cfg 파일에 ‘RunAsDamon: yes’를 추가하면 된다.
전용회선 가입자별로 MRTG 화면 보여주기
ISP나 그외 전용회선을 구축해 회선 임대를 하는 공공기관이나 학교 등에서는 해당 가입자별로 ID와 패스워드를 부여해 접속한 ID별로 MRTG 그래프를 볼 수 있도록 할 수 있다. 이때 이용되는 것은 펄 언어와 아파치 서버(물론 GCI를 처리하는 다른 언어도 사용 가능).
한 ISP와 전용회선으로 연결된 랜드라는 회사에 ID와 패스워드를 부여해 이 ID로 자기 회사의 전용회선 트래픽을 볼 수 있도록 ID 입력창→ 인증창→ MRTG 화면의 순서를 거치면 된다.
① ID와 패스워드 정하기
랜드 - ID: land, 패스워드: ld1234
② cfg 파일 생성
mrtg.cfg파일에 land 라는 이름으로 등록하자. 여기서 WorkDir은 /home/httpd/MRTG/ 설정.
home/httpd/land 디렉토리에 .htpasswd파일과 .htaccess파일을 생성해 아래와 같이 수정한다. 이 파일의 역할은 웹 상에서 이 디렉토리로 접근하려면 ID와 패스워드를 물어보는 역할을 한다.
mrtg# cat .htaccess AuthName MRTG (이 값은 시스템마다 다름) AuthType Basic AuthUserFile /home/httpd/land/.htpasswd ( 패스워드가 저장된 파일 지정) AuthGroupFile /dev/null [CODE]<Limit GET POST> require valid-user </Limit>[/CODE] mrtg# cat .htpasswd land:z5EPIRJHqBQV (암호화된 패스워드)
⑤ Symbolic Link 설정 단계
현재 MRTG 결과 파일들은 ‘/home/httpd/MRTG/’에 저장되어 있고, 외부에서 ID별로 접속할 때는 ‘/home/httpd/land/로 연결되도록 구성하고자 한다. 이 경우 실제 파일들이 있는 위치를 ‘ln’명령을 사용하여 symbolic link를 시킬 수 있다.
마지막으로 웹 상에서 ID(land)를 입력하고 ‘/home /httpd/land/land.html’ 창이 뜨도록 하면, 이 디렉토리에는 ‘.htaccess’파일이 있기 때문에 인증창이 뜨게 된다. 다시 말해 웹페이지에서 ID를 입력받도록 페이지를 만들고, CGI를 이용해 ID별로 해당 MRTG 그래프가 뜨도록 하면 된다. 필자는 CGI 프로그램을 펄을 이용해 작성해 봤다.
[CODE] $qs = $ENV{‘QUERY_STRING’}; # ‘fname&land’ 와 같은 형식으로 넘어오기 때문에, ‘&’를 기준으로 분리해 저장 @qs = split(/&/, $qs); foreach $i (0 .. $#qs) { # convert plus chars to spaces $qs[$i] =~ s/+/ /g; # convert the hx characters $qs[$i] =~ s/%(..)/pack(“c”, hex($1))/ge; # split each one into name and value ($name, $value) = split(/=/, $qs[$i],2); # $value변수에 ‘land’가 할당된다. # create the associative element $qs{$name} = $value; } # 실제 html 형식으로 출력하는 부분. print “Content-type: text/html”, “”; print “<HTML>”, “”; print “<HEAD><TITLE>$value MRTG 트래픽</TITLE></HEAD>”, “”; # mrtg.co.kr이라는 도메인을 운영할 경우 아래와 같이 사용 가능 print “\u8221”http://www.mrtg.co.kr/$value/$value.html\u8221”>”, “”; print “</HTML>”, “”; [/CODE] 이상으로 MRTG에 대한 기본적인 내용과 설치 방법, 그리고 몇 가지 응용 예를 살펴봤다. 이외에도 MRTG를 활용해 수 있는 일이 많다.
Interval: 5 (5분마다 반복) RunAsDamon: yes (운영체제로 하여금 매 5분마다 mrtg를 실행하도록 함)
3번 포트의 경우 기본적인 키워드만 사용한 경우로써, 10Mbps 이더넷 포트에 대한 트래픽을 보여준다.
MaxBytes는 125×대역폭(bit)를 의미하므로, 10Mbps인 경우 1250000가 된다. [CODE] Target[cat5500_3]: 3:public@10.10.10.1 MaxBytes[cat5500_3]: 1250000 Title[cat5500_3]: LC-Bridge (sample-device): ether0 PageTop[cat5500_3]: <H1>Traffic Analysis for ether0</H1> <TABLE> <TR><TD>System:</TD><TD>LC-Bridge inAndover</TD></TR> <TR><TD>Maintainer:</TD><TD>Administrator</TD></TR> <TR><TD>Interface:</TD><TD>ether0(3)</TD></TR> <TR><TD>IP:</TD><TD>sample-device(10.10.10.1)</TD></TR> <TR><TD>Max Speed:</TD> <TD>1250.0 kBytes/s (ethernetCsmacd)</TD></TR> </TABLE> [/CODE] 5번 포트의 경우 추가의 키워드를 적용했고, 웹 페이지에 나타나는 부분도 수정을 했음. 키워드에 관해서는 ‘doc/co nfig.txt’를 참조.
[CODE] Target[cat5500_5]: 5:public@10.10.10.1 MaxBytes[cat5500_5]: 1250000 Title[cat5500_5]: Catalyst 5500 Port 5번 PageTop[cat5500_5]: <H1> Catalyst 5500 Port 5번 트래픽 </H1> <TABLE> <TR><TD>Interface:</TD><TD>Ethernet 1/5</TD></TR> <TR><TD>IP:</TD><TD>10.10.1.1</TD></TR> <TR><TD>Max Speed:</TD> <TD>10.0 Mbit/s (ethernetCsmacd)</TD></TR> </TABLE> [/CODE] ### XScale YScale------------ XScale[cat5500_5]: 1.5 YScale[cat5500_5]: 1.5 WithPeak[cat5500_5]: ymw Unscaled[cat5500_5]: ymwd Options[cat5500_5]: growright, bits Colours[cat5500_5]: GREEN#00eb0c,BLUE#1000ff,DARK GREEN#006600,VIOLET#ff00ff YLegend[cat5500_5]: Bits per Second ShortLegend[cat5500_5]: b/s Legend1[cat5500_5]: Incoming Traffic in Bits per Second Legend2[cat5500_5]: Outgoing Traffic in Bits per Second Legend3[cat5500_5]: Maximal 5 Minute Incoming Traffic Legend4[cat5500_5]: Maximal 5 Minute Outgoing Traffic LegendI[cat5500_5]: In: LegendO[cat5500_5]: Out:
카탈리스트 5500의 CPU 사용률을 보기 위해서는 포트 번호 대신 특정 OID(Object ID = MIB값)가 필요하다. mrtg는 기본적으로 인력과 출력의 2개 값이 필요하므로, CPU 사용률과 같이 값이 하나인 경우에는 ‘&’를 기준으로 같은 OID를 적어 주면 된다.
Target[cat5500_cpu]:1.3.6.1.4.1.9.2.1.58.0&1.3.6.1.4.1.9.2.1.58.0:public@10.10.10.1 RouterUptime[cat5500_cpu]: public@10.10.10.1 MaxBytes[cat5500_cpu]: 100 Title[cat5500_cpu]: CPU LOAD PageTop[cat5500_cpu]:
CPU Load %
Unscaled[cat5500_cpu]: ymwd ShortLegend[cat5500_cpu]: % XSize[cat5500_cpu]: 380 YSize[cat5500_cpu]: 100 YLegend[cat5500_cpu]: CPU Utilization Legend1[cat5500_cpu]: CPU Utilization in % (Load) Legend2[cat5500_cpu]: CPU Utilization in % (Load) Legend3[cat5500_cpu]: Legend4[cat5500_cpu]: LegendI[cat5500_cpu]: LegendO[cat5500_cpu]: Usage Options[cat5500_cpu]: gauge
SELinux 란 미 국가 보안국 (U.S. National Security Agency)리 오픈소스커뮤니티에 릴리즈한 Linux의 보안 강화 버전(코드 포함)으로서 리눅스 보안 모듈 구조체(Linux Security Modules(LSM) framework)를 이용하여 리눅스 커널에 의무 접근 제어(Mandatory Access Control - MAC)를 구현하는 것이다. Fedora Core3부터 기본으로 적용되기 시작하였고, 현재 대부분의 최신 리눅스 배포판에서 지원되고있다.
SELinux에 대한 이해를 돕기위해서 DAC, MAC를 잠깐 이야기 해보자.
표준 리눅스 보안은 Discretionary Access Control - DAC 모델을 따른다. DAC 모델에서, 파일과 자원에 대한 결정권은 오직 해당 객체(objects)의 사용자(user id)에게 있고 소유권(ownership)에 따라 이뤄진다. 각 사용자와 그 사용자에 의해 실행된 프로그램은 자기에게 할당된 객체에 대해 전적으로 자유재량권을 갖는다. 이러한 상황에서는, 악의 있는 일반 혹은 루트 사용자(예로, setuid와 setgid)가 실행시킨 결함이 있는 소프트웨어를 통해 주어진 객체로 원하는 어떠한 일을 해도 막아낼 방법이 없으며 보안 정책을 시스템 전체에 걸쳐 시행되도록 할 방법이 없다.
반면에 SELinux하에서 MAC는 모든 주체(subjects - 사용자, 프로그램, 프로세스)와 객체(파일, 디바이스)에 대해서 국부적으로 허가(granular permissions)해 줄 수 있다. 응용프로그램에서 불필요한 부분은 제외하고 오직 필요한 기능에 대해서만 사용 권한을 안전하게 부여하는것이 가능하다.
SELinux는 모든 주체 (사용자, 프로그램, 프로세스) 및 객체 (파일과 장치)에 각각 다른 권한을 부여할 수 있게 해줍니다. 따라서 사용자는 한 응용 프로그램에게 그 프로그램이 제대로 작동하는데 필요한 권한만 안전하게 부여할 수 있다.
2. SELinux 정책이란 무엇인가?
SELinux 정책은 사용자, 프로그램, 프로세스 그리고 이들의 동작 대상인 파일과 디바이스를 포함한 시스템 전체, 즉, 모든 주체와 객체에 대한 접근 허가(access permissions)를 포함한 패키지를 이야기한다. 페도라에서 사용가능한 정책 패키지는 strict , targeted 두가지가 있다.
페도라코어에서 SELinux 정책으로 strict policy 를 적용함으로 인해서 다양한 사용자들이 많은 문제점을 일으킴으로 인해서(일반사용자들이 SELinux를 사용하기 위해서는 수준높은 전문기술이 필요하다) 현재 RHEL4 에서는 보다 완화된 정책패키지 targeted poicy 가 설치시 기본으로 제공된다.
targeted policy는 자주 문제시되는 부분들만 우선적으로 적용시키고, 나머지는 표준 리눅스 보안과 동일하게 운영되도록 적용한 정책이다.
현재, targeted policy 에서는 dhcpd, httpd(apache.te), named, nscd, ntpd, portmap, snmpd, squid 그리고 syslogd 데몬에 대해서 관리한다. 이 데몬들에 대한 정책 파일은 /etc/selinux/targeted/src/policy/domains/program에서 찾을 수 있다.
3. SELinux 설치여부 확인
SELinux 를 사용하고 있는지를 확인하는 방법은 보안문맥을 확인하는 방법으로 알 수 있다.
파일, 사용자, 프로세스등의 문맥을 확인할 때는 -Z 라는 새 옵션을 이용해서 확인할 수 있다.
-Z옵션을 이용해서 보안문맥을 보여주는데 이 결과를 통해서 "system_u" 사용자, "object_r" 역할, "selinux_config_t" 타입을 확인할수 있다. 이런 문맥으로 SELinux의 정책에 비교해서 허용하거나 거부하게 되므로 문맥이 확인가능하다면 SELinux 를 사용중인 것이다.
배포판마다 서비스 설정방법은 차이가 있다. 필자가 테스트한 레드햇과 페도라 배포판에서는 /etc/sysconfig/selinux 파일에서 SELinux 의 사용가능한 모드를 설정한다.
/etc/sysconfig/selinux 파일의 내용
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
이 파일에는 두부분의 설정이 있는데 SELINUX 의 상태(enforcing, permissive, disabled)를 설정하는 부분과 활성화시킬 보안정책(strict 또는 targeted 중 하나)을 결정하는 SELINUXTYPE 이라는 부분이 있다.
disabled - SELinux 보안 제어를 사용하지 않으려면 disalbed 옵션을 선택한다. disalbed 설정은 보안 제어 기능을 끄고 시스템이 보안 정책을 사용하지 않도록 설정한다.
permissive - 이것을 선택하면 서비스 거부 메시지를 통보받을 수 있다. permissive 상태로 설정하면 자료와 프로그램에 이름을 할당한 후 로그를 기록하지만 보안 정책을 사용하지는 않는다. permissive 상태는 SELinux를 처음 접하는 경우 처음부터 이 기능을 완전히 활성화하지 않고 우선 이 정책을 사용해서 일반 시스템 작업시 어떠한 영향을 미치는지 알아보려는 경우 좋은 시작점이 될 수 있다. 그러나 경고 옵션을 선택시 가끔씩 보안경고 대상이 아닌 것을 경고 대상으로 탐지하는 오류(false positive)나 경고 대상인 것을 탐지하지 않는 오류(false negative)가 발생할 가능성도 있으니 주의가 필요하다.
enforcing - SELinux를 완전히 활성화하시려면 enforcing 옵션을 선택하자. enforcing 옵션을 선택하면 추가 시스템 보안을 위해 모든 보안 정책 (예, 허가가 없는 사용자가 특정한 파일이나 프로그램에 접근하는 것을 거부하기)을 사용한다. SELinux가 완전히 실행되어도 아무런 지장을 받지않고 일반적인 시스템 작업을 수행할 수 있다고 자신하시경우 이 옵션을 선택한다.
5. SELinux 서비스 설정 - setenforce
SELinux의 서비스 상태를 변경해야 하는 필요가 있을때는 직접 /etc/sysconfig/selinux 파일에서 SELINUX=enforcing , 또는 SELINUX=permissive 처럼 수정해서 변경하는 방법도 있지만 setenforce 라는 명령어를 이용할수 있다.
"setenforce 0" 이라고 명령을 내리는것은 SELINUX=permissive 와 동일한 결과이며, "setenforce 1" 은 enforcing 모드를 의미한다. 시스템에서 SELinux 를 완전히 사용하지 않으려면 /etc/sysconfig/selinux 파일에서 SELINUX=disabled 처럼 설정하거나 시스템 부팅시에 부트로더의 파라미터로 selinux=0 이라고 주고 부팅하면 된다. (grub 을 사용하는 경우라면 grub 화면에서 e 를 누르고 편집모드로 들어간뒤에 kernel 줄의 맨 뒤에 selinux=0 을 적어주고 ESC, 그리고 b 를 눌러서 부팅하면 된다.)
sentenforce 명령은 sysadm_r 권한을 갖고 수행해야 한다; 그러기 위해, newrole 명령을 사용하거나, 아니면, su -를 사용하여 root 로 사용자 전환을 하면, 자동으로 sysadm_r 권한을 얻을 수 있다.
6. SELinux 서비스 설정 - chcon
SELinux 의 보안문맥을 변경해야 하는 경우에는 chcon 이라는 명령을 사용할수 있다.
아파치를 사용중에 분명히 디렉토리를 생성했는데도 에러가 난다면 아래처럼 http_user_content_t 를 해당 DocumentRoot 에 적용해줌으로 해결해 줄수있다.
RHEL4의 경우 전환가능한 시스템의 SELinux 설정값들을 나타내는 파일은 /etc/selinux/targeted/booleans 파일이다. 파일안의 각 항목은 system-config-securitylevel 이라는 어플리케이션이나 setsebool 이라는 명령을 이용해서 변경시킬수 있으며 setsebools 을 이용하는 경우 -P 옵션을 사용하지 않으면 설정파일은 변경되지 않고 현재의 설정만 바뀌지만 -P 옵션을 같이 사용하면 /etc/selinux/targeted/booleans 파일의 내용까지 같이 변경되어 시스템 리부팅후에도 적용된다.
8. 사용중인 정책을 교체하는 방법은?
배정책 교체는 가볍게 취할 사안이 아니다.
연구 목적으로 시험 장비(test machine)에서 새 정책을 시도하는 이외, 생산 시스템(production system)에서는 다른 정책으로 교체하기 전에 현황을 심각하게 고려해야 한다.
교체 작업은 간단하다. 이는 매우 안전한 방법이지만, 우선 시험 시스템에서 일차 시도해 보는 것이 바람직하다.
한 가지 방법은 system-config-securitylevel을 사용하여 정책을 바꾸고 재명명(relabel)하도록 파일 시스템을 설정하는 것이다.
수작업 절차는 다음과 같다:
1. /etc/selinux/config을 편집하고 SELINUXTYPE=policyname으로 정책 유형을 바꾼다.
2. 재부팅하여 돌아올 수 있는 지 확인하기위해, SELINUX=permissive모드로 설정한다. 이렇게 하면, SELinux는 정확한 정책하에서 가동될 것이지만, 만일 부정확한 파일 문맥 명명(labeling)과 같은 문제가 있으면 로그인하도록 할 것이다.
3. sysadm_r 역할을 갖춘 root로 파일 시스템을 재명명한다(relabel):
id -Z
root:sysadm_r:sysadm_t
fixfiles relabel
옵션 -l /path/to/logfile을 사용하여 표준 출력으로 로그를 볼 수 있고, 옵션 -o /path/to/file을 사용하여 검토(checked)되거나 재명명(relabel ed)된 모든 파일 리스트를 저장할 수 있다.
4. 시스템을 재부팅한다. 새 정책하에서의 재시작은 모든 시스템 프로세스가 적절한 문맥에서 시작되고 정책 변경으로 인한 모든 문제가 드러나게 한다.
5. sestatus -v 명령으로 발효된 변경사항을 확인한다. Permissive 모드로 가동된 새 시스템에서, avc: denied 메시지를 /var/log/messages에서 확인한다. 이들은 새 정책하에 문제없이 시스템이 가동되도록 해결해야 할 문제들을 표시해 준다.
6. 새 정책하에서 시스템이 만족스럽게 돌아갈 때, SELINUX=enforcing 으로 바꿔 실행 권한을 부여한다. 실시간에 enforcing을 활성화 시키기 위해 재부팅하거나 setenforce 1 을 실행한다.
9. SELinux LOG
SSELinux 의 로그는 /var/log/messages 파일에 아래처럼 나타난다.
kernel: audit(1114070701.193:0): avc: denied { read } for pid=24216
- tcontext=root:object_r:var_lib_t : 이파일이 읽기를 시도하는 파일은 var_lib_t 타입의 root 소유파일이다.
SELinux LOG 각 항목의 의미
audit(timestamp) - This field states that it's an audit message from SELinux and that it was logged at timestamp time (in seconds since Jan. 1st, 1970).
avc - This message was from the SELinux access vector cache. Pretty much every message you are likely to see is from this cache.
denied | accepted - This field indicates whether the action was denied or accepted. You may see logs of accepted messages in some cases (like reloading the policy).
{ read | write | unlink | ... } - This field shows the type of action that was attempted, such as reading a file, writing, unlinking, loading policy, etc.
for pid=<pid> - This is the process ID that attempted the action.
exe=<executable>- This is the path to the executable that started the process.
name=<name> - This is the name of the target on which the action was attempted.
dev=<device> - This is the device on which the target file is located.
ino=<inode-number> - This is the inode of the target of the action.
scontext=<security context> - This is the process's security context. This contains user, role, and type.
tcontext=<target context> - This is the security context of the target of this action, for example, the file, directory, etc.
tclass=<target class> - This is the class of the target object, such as directory, file, device node, or something else.
10. Audit2allow
정책 작성자에게 유용한 도구는 /usr/bin/audit2allow 인데 이것은 /var/log/messages의 avc 메시지를 SELinux에 의해 사용될 수 있는 규칙으로 번역해준다. 사용이 불가능하다면 policycoreutils 패키지에 속해있으므로 yum install policycoreutils 처럼 설치 가능하다.
audit2allow명령은 세가지 방법으로 입력을 받을 수 있다. 기본은 표준입력 (stdin)이다. -i 옵션을 사용하면 /var/log/messages 로부터 입력을 읽을 수 있고 -d옵션을 사용하면 dmesg 출력으로부터 입력을 읽을 수 있다.
11. avc: denied
이 메시지는 현재 실행된 SELinux 정책이 그 응용프로그램의 동작을 허락하지 않기 때문이다. 이러한 일에는 여러 가지 사유가 존재한다.
첫째, 응용프로그램이 접근하려는 파일중 하나가 잘못 명명되어있을 수 있다. 만일 AVC 메시지가 특정 파일을 참조한다면, ls -alZ /path/to/file 을 수행하여 현재 참조하는 파일명(current label)을 조사해 보라. 만일 그것이 잘못되어 보이면, restorecon -v /path/to/file 을 시도해보라. 만일 파일과 관련된 매우 많 은 거부(denials) 상황이 존재하면, fixfiles relabel 을 수행하거나, 반복적으로 디렉토리 경로를 재명명하기 위해서 -R옵션과 함께 restorecon 을 수행하고 싶을 수 있다.
다른 때에는, 거부(denials) 현상은 정책에 의해 거부되도록 프로그램에 설정을 바꿔서 발생될 수 있다. 예를 들면, 만일 Apache를 8800포트로 바꾸면, 보안 정책, apache.te,도 관련하여 바꿔야 할 필요가 생긴다. 정책 작성에 관한 상세한 정보가 필요하면, 외부연결 리스트(External Link List)를 보라.
12. 참고문헌 또는 URL
Home of the SELinux project - http://www.nsa.gov/selinux/
The Un-Official SELinux FAQ - http://www.crypt.gen.nz/selinux/faq.html
SELinux link zoo - http://www.crypt.gen.nz/selinux/links.html
Ubuntu Linux SELinux pages - https://www.ubuntulinux.org/wiki/SELinux
나중에 수행하려고 등록한 작업을 실행한다. 즉 command들을 정해진 시간에 실행되게 예약하고 load average가 충분히 낮을 때 수행한다.
autofs
amd 보다 더 발전적인 automount 시스템. 커널의 파일 시스템 코드가 automount의 mount point가 다른 보통의 기본적인 파일 시스템 상의 어디에 있는지를 알고 autofs는 그곳에서 mount point를 가져온다. http://kldp.org/HOWTO/mini/html/Automount/
레드햇 계열 리눅스는 패키지의 설치와 관리에 있어서 rpm를 사용 합니다. ( 한컴리눅스 / 와우리눅스 모두 레드햇 계열 입니다.)
일단 리눅스를 설치해 놨는데, 보안이나 기타 이유로 패키지를 안쓰거나, 제거 하거나, 또 새로운 패키지를 설치하거나 버젼업된 패키지를 설치 해야 할때 싶은데 어떻게 해야하는지 모른다면 레드햇계열 리눅스의 사용은 미궁에 빠져 버리게 됩니다. 따라서 패키지의 설치와 관리를 하는 rpm 명령어의 숙지와 사용은 레드햇 계열에서는 필수라고 할수 있습니다.
rpm 명령어는 어떤 패키지를 설치하고, 어떤 패키지에 어떤 프로그램들이 들어있나 확인을 하고, 시스템 프로램들이 어떤 구조로 되어 있는가 추적하고 최적화 하는 방법을 알 수 있게 해 줍니다.
# rpm 명령어와 함께 # find 명령어, # ps -aux | grep , # file 명령어를 이용해서 시스템 전체의 설치된 패키지를 조회하고 관리를 할 수 있습니다. ( # 은 리눅스 쉘(root) 프롬프트 입니다. // **. 은 주석처리로 설명 부분 입니다. ) ========================================================================================= 1. rpm 설치하기 1) 설치하기 -U 옵션 : 기존의 것을 삭제하고 업그레이드하며 아무 메시지도 보여주지 않습니다. -Uv 옵션 : 기존의 것을 삭제하고 업그레이드하며 패키지 이름을 보여 줍니다. -Uvh 옵션 : 기존의 것을 삭제하고 업그레이드하며 그 설치 진행과 과정 # 표시로 자세히 보여줍니다. // **. 보통 (ivh 보다) -Uvh 옵션을 쓰면 됩니다. // **. 설치할경우 패키지파일전체 이름을 주고, 삭제/조회는 rpm 버젼 번호까지만 주면 됩니다. mrtg 패키지전체 이름 : mrtg-2.9.17.i386.rpm // **. i386 은 386 CPU 호환 버젼을 말합니다. mrtg 패키지 버젼 : mrtg-2.9.17
부가 옵션들 --nodeps : 의존성관계에 있는 다른 패키지가 설치되어 있지 않다해도 강제 설치 합니다. --force : 버전을 무시하고 강제로 설치 합니다. ( rpm 버전을 강제로 다운 그레이드 할때 사용합니다. ) 예) # rpm -Uvh mrtg-2.9.17.i386.rpm --nodeps
-- force --nodeps 사용시 다른 패키지에 문제가 없는가를 주의 해야 합니다. # rpm -Uvh mrtg-2.9.17.i386.rpm --force --nodeps
2) -i 옵션 : 기존의 것을 삭제하고 처음 설치합니다. 예) # rpm -i mrtg-2.9.17.i386.rpm
========================================================================================= 2. rpm 지우기 -evv 옵션 : 아래와 같이 삭제를 하는 동안에 상세한 설명을 보여줍니다. 예) # rpm -evv mrtg-2.9.17
부가 옵션들 --test : 실제로 삭제를 하지 않고 잘지워지는가 테스트만 해보는 옵션 입니다. --nodeps : 의존성에 관여하지 않고 지우는 옵션입니다. // **. 의존성 있는 패키지가 안돌아 갈 수 있습니다. 주의를 요하는 옵션 입니다. -- allmatches 옵션 : rpm 이 아래와 같이 중복으로 설치 되어 있을 경우 해결 방법 # rpm -qa | grep tux // **. 중복으로 설치 되었 습니다. tux-2.1.0-2 tux-2.1.0-2
--noscript 옵션 : rpm 이 스크립트 에러 인하여 지워지지 않을 경우조 지웁니다. # rpm -e canna --noscripts // **. --noscripts 옵션으로 지웁니다.
========================================================================================= rpm 조회하기 부분은 옵션이 가장 많고, 가장 많이 사용 하는 부분 입니다.
3. rpm 조회하기 1) -qa 옵션 조회 -qa : 설치 되어 있는 모든 패키지를 알아 봅니다. // **. 좌악 올라 갑니다. -qa | grep : 질의한 패키지가 설치 되어 있는지 알아본다 // **. 가장 많이 사용 합니다. -qa | grep -i : 질의한 패키지를 찾을 때 대소문자를 구분하지 않고 물어 봅니다. // **. 대소문자 구별 안하고 찾아주므로 이 옵션 사용이 편합니다. 대부분 패키지는 소문자 이기는 하지만 가끔은 대문자가 있습니다. -qa | wc -l : 현재 설치 되어 있는 총패키지 수
예 ) # rpm -qa // **. 시스템에 설치된 모든 패키지를 보여 줍니다. # rpm -qa | grep canna // **.canna란 이름의 패키지가 설치 되어 있는지 알아 봅니다. # rpm -qa | grep -i canna // **. 대 소문자를 구별하지 않고 알아 봅니다. # rpm -qa | wc -l // **. 시스템에 설치된 총 패키지 수를 알아 봅니다. 보통 몇백 단위 입니다.
2) rpm에 대한 다른 조회 -qf : 화일로 패키지 알아내기. 설치 되어 있는 화일이 어느 패키지에 속해 있는지 알아봅니다. -qi : 패키지 정보 알아보기. 패키지에 대한 설명을 보여줍니다. -ql : 패키지 목록 알아 봅니다. -qc : /etc/ 밑에 설치 되는 설정 화일만 알아 본니다.
예) # rpm -qf /bin/ls // **. ls 란 명령어가 어느 패키지에 속해 있는지 알아 봅니다. # rpm -qf $(which 특정프로그램이름) // **. 경로를 잘 모를 경우 사용 합니다. ex) rpm -qf $(which ls) # rpm -qi setup // **. setup 이란 패키지가 어떤 패키지 인가 알아 봅니다. # rpm -ql setup # rpm -qc setup
========================================================================================= 4. -q 의 부가 옵션들 1) -q --requires : 패키지가 필요한 모듈 (의존성) 예) # rpm -q --requires setup // **. dump 라는 패키지가 설치되기전에 먼저 설치가 선행되어야 하는 패키지들 입니다. 없으면 설치가 안됩니다.
2) -q --whatrequires : 의존성 걸린 패키지 알아내기 예) # rpm -q --whatrequires xmms // **. xmms에 의존하는 패키지를 보여 줍니다. 함부로 지우면 의존설 걸린 패키지들은 안돌가는 사태가 발생할 수 있습니다.
3) -q --whatprovides module-info : 모듈이 설치 되어 있는 패키지 알아 봅니다. 예) # rpm -q --whatprovides module-info
4) -q --scripts : 패키지가 설치 되기전 또는 설치 된후에 실행되는 스크립트를 알아 봅니다. 5) -q --queryformat : 패키지의 정보를 알아볼때 문자열을 출력해준다.
5. 기타 확장 옵션들 1) -qlv : 패키지 목록 자세한 정보를 알아 봅니다. 예 ) # rpm -qlv setup
2) -ql --dump : 패키지 덤프 화일을 봅니다. 3) -qcf : 화일과 관련된 설정 화일을 알아봅니다. . 4) -qdf : 패키지와 관련된 문서 화일을 보는 옵션 입니다. // **. 패키지 괸련한 문서는 대부분 /usr/share/doc 아래에 있습니다. 예) # rpm -qdf /sbin/dump
5) -qpil : 원하는 패키지로 부터 패키지 정보와 설치되는 곳의 정보를 알아 봅니다. // **. qi옵션과 ql 옵션의 합침형 입니다. 예) # rpm -qpil mrtg-2.9.17.i386.rpm
6) --querytags : 문자열 출력시에 사용되는 태그 값을 알아 본다. 예) # rpm --querytags HEADERIMAGE HEADERSIGNATURES HEADERIMMUTABLE . 7) # rpm -qlp // **. RPM 으로 설치 안되었을때 검색 합니다.
#user, group, other 4:읽기방지, 2:쓰기방지, 1:실행방지
#새로 만들어지는 파일은 -rwxr-xr-x 로 만들어지게 됩니다.
stty erase ^H #erase 키를 mapping 합니다. ( ctrl + v h)
stty cs8 -istrip -parenb #한글입력설정
set host=`hostname` # '' 는 문자열이고, ` ` 는 안의 명령어를 실행시킨다. hostname 이라는 명령을 실행시켜서 host 에 값을 입력했다.
set history=40 # history 를 볼때, 40 건씩 보겠다.
set noclobber # 덮어쓰기 방지
set filec # ESC 를 누르면, 파일명 자동완성기능
set autolist # 파일명 자동완성기능
set prompt="[`whoami`@`hostname -s`:${cwd}]"
unset autologout #자동로그아웃을 방지합니다.
set -o vi # 명령라인에서 vi 처럼 기존 사용했던 명령어를 j, k 키를 사용해서 위 아래로 이동한다.
alias setprompt 'set prompt="[`whoami`@`hostname -s`:${cwd}]"'
alias cd 'chdir \!* && setprompt'
alias ls '/bin/ls -aF' # file, directory를 구분 표기
alias cd.. 'cd ..'
alias cp 'cp -i'
alias l 'ls -al | more'
alias dir 'ls -alCF \!* |more'
alias rm 'rm -i' # 삭제여부를 질문한다
alias h history
Windows 등에서 리눅스 시스템으로 원격 접속이 가능한 프로그램 중 대표적인 것으로 Xmanager가 있다. 이 Xmanager는 Windows를 사용하다가 리눅스를 접하는 사용자라면 누구나 한번쯤은 사용해 보았을 법한 프로그램이기도 하다.
그러나 이 Xmanager를 사용하기 위해서는, 접속하고자 하는 리눅스 시스템에서 일부 설정을 수정해야 한다. 리눅스에서는 기본적으로 Xmanager와 같은 XDMCP 기능을 사용하는 프로그램의 접속을 막도록 설정이 되어 있기 때문인데, 리눅스의 X윈도우 환경이 Gnome 인지, KDE 인지에 따라서도 설정하는 부분이 약간씩은 다르다.
오늘은 이 Xmanager 접속을 허용하기 위한 설정법에 대해 Gnome과 KDE로 구분하여 알아보도록 하자.
Gnome에서의 설정
1. 리눅스 시스템의 런레벨(Run-Level)이 "5"인지 확인한다.
여기서 런레벨이라는 것은 부팅시 어떠한 모드로 부팅될 것인가를 말하는 것으로, 그래픽 모드는 "5"번, 텍스트 모드는 "3"번이다.
Xmanager는 GUI(그래픽 유저 인터페이스)를 지원하므로 접속하고자 하는 리눅스 시스템의 사용모드도 그래픽모드(Run-Level 5)로 되어 있어야 한다.
리눅스 설치시 대부분 그래픽 모드로 설치를 하므로 크게 문제될 부분은 아니지만, 서버로 사용하는 시스템에 있어 텍스트 모드로 설치하는 경우도 있으므로 이 부분에 대해 간단히 확인하고 넘어가도록 하자.
런레벨은 /etc/inittab 파일에서 쉽게 확인이 가능하다.
# # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified for RHS Linux by Marc Ewing and Donnie Barnes #
# Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault:
# System initialization. si::sysinit:/etc/rc.d/rc.sysinit
위에서 보듯이 "id" 뒷 부분의 값이 "3"인지 "5"인지에 따라 모드가 바뀌므로, 그래픽모드로 사용하고자 한다면 이 숫자를 "5"로 변경하자.
2. XDMCP 접속 허용 (custom.conf)
앞에서도 말했듯이 Xmanager는 XDMCP 방식을 사용하여 리눅스 시스템에 접속을 하게 된다. 그러므로 리눅스 시스템에서는 이 XDMCP 기능이 접속할 수 있도록 허용하는 설정을 해주어야 하는데, Gnome에서는 gdm (Gnome Display Manager)을 사용하므로 아래의 경로에 있는 gdm 설정파일에서 수정한다.
# vi /etc/gdm/custom.conf # 한글과컴퓨터 리눅스 데스크톱 3.0 (오픈에디션 3.0)의 경우
# vi /etc/X11/gdm/custom.conf # 한글과컴퓨터 리눅스 데스크톱 2.0 (오픈에디션 2.0)의 경우
※ 타 리눅스를 사용하는 경우, 설정 파일의 경로가 다를 수 있으므로 이럴땐 하단에 명시한 Xmanager 제작사에 가서 확인해 보도록 한다.
...
[security]
DisallowTCP=false
AllowRemoteRoot=true
[xdmcp]
Enable=1
...
custom.conf 파일의 [security] 섹션 아래에 DisallowTCP 값을 false로 선언하고, [xdmcp] 섹션 아래에 Enable 값을 1로 설정한다.
만약 root 관리자로의 원격 접속을 희망한다면, AllowRemoteRoot의 값을 true로 선언하는 것을 추가하면 된다.
3. X윈도우 재시작
위 와 같이 설정을 마쳤다면, X윈도우를 재시작해야 한다. 변경된 설정으로 X윈도우가 가동되어야 외부에서의 접속이 가능하므로 반드시 X윈도우를 재시작하기 바란다. 로그아웃만 해서는 안된다. init 3 명령과 init 5 명령으로 런레벨 자체를 변경하는 것이 좋다.
(또는 이런 과정들이 복잡하다 생각되면 그냥 재부팅을 해도 된다. ^^)
그리고 Windows에 설치된 Xmanager를 사용하여 접속을 시도해보자. 잘 되는가?
KDE에서의 설정
KDE 에서도 Gnome의 경우와 같이 XDMCP 관련 설정파일을 수정함으로써 해결할 수 있지만, Gnome 보다 수정해야할 항목이 조금 더 많다고 볼 수 있다. 그리고 한글과컴퓨터 리눅스의 기본 로그인 매니저가 gdm (Gnome Display Manager)으로 되어 있기 때문에, 이를 kdm (KDE Display Manager)으로 바꾸거나, 또는 Gnome과 KDE 양쪽에서의 XDMCP 수정을 모두 해주어야 하는 불편함이 있다.
일단 하나하나 알아보도록 하자.
1. 리눅스 시스템의 런레벨(Run-Level)이 "5"인지 확인한다.
이는 앞에서 본 내용과 동일하다. 런레벨 확인이 우선이겠다.
2. XDMCP 접속 허용 (1) (xdm-config)
KDE의 기본 로그인 매니저인 kdm (KDE Display Manager)의 설정파일은 아래에 있다.
# vi /etc/X11/xdm/xdm-config
...
!DisplayManager.requestPort: 0
설정파일의 제일 하단을 보면,
DisplayManager.requestPort: 0
이라고 설정되어 있는데 이 라인의 앞쪽에 느낌표(!)을 넣어 주석처리를 한다.
3. XDMCP 접속 허용 (2) (Xaccess)
다음으로 아래 경로에 있는 Xaccess 파일을 열어...
#* #any host can get a login window
위와 같이 되어있는 라인 앞쪽의 주석(#)을 해제한다.
# vi /etc/X11/xdm/Xaccess
...
* #any host can get a login window
...
4. XDMCP 접속 허용 (3) (kdmrc)
다음으로 kdmrc 파일을 열어 [Xdmcp] 섹션의 Enable 값을 true로 변경한다. # vi /etc/X11/xdm/kdmrc
...
[Xdmcp] Enable=true
...
5. 로그인 매니저 변경 (또는 gdm 설정)
이 것으로 설정파일들은 수정이 완료되었다. 하지만 앞에서 언급하였듯이 한글과컴퓨터 리눅스 데스크톱(또는 오픈에디션)은 기본 로그인 매니저가 gdm (Gnome Display Manager)로 되어 있으므로 아래의 2가지 방법중 한가지 방법을 더 처리해 주어야 한다.
① 앞서 다룬 gdm 설정도 같이 수행한다.
② 로그인 매니저를 gdm에서 kdm으로 변경한다. (변경 방법은 아래 Tip 참조)
6. X윈도우 재시작
위와 같이 설정을 마쳤다면, X윈도우를 재시작해야 한다. 변경된 설정으로 X윈도우가 가동되어야 외부에서의 접속이 가능하므로 반드시 X윈도우를 재시작하기 바란다. 로그아웃만 해서는 안된다. init 3 명령과 init 5 명령으로 런레벨 자체를 변경하는 것이 좋다.
(또는 이런 과정들이 복잡하다 생각되면 그냥 재부팅을 해도 된다. ^^)
그리고 Windows에 설치된 Xmanager를 사용하여 접속을 시도해보자. 잘 되는가?
Tip! Tip! Tip!
로그인 매니저 변경방법 (gdm --> kdm)
# vi /etc/sysconfig/desktop
DESKTOP="GNOME" # 기본 로그인 세션 DISPLAYMANAGER="KDE" # 기본 로그인 매니저
/etc/sysconfig/desktop 파일을 열어서 ...
DISPLAYMANAGER의 값을 KDE로 수정한다. (해당 항목이 없다면 위의 예를 보고 직접 추가하자.)
※ 참고로, DESKTOP 항목은 기본으로 구동되는 세션을 말하는 것으로 ID와 패스워드를 넣었을때 어느 X윈도우로 로그인할 것인지를 설정하는 것이다.
※ 이상의 설명은 "한글과컴퓨터 리눅스 데스크톱" (또는 오픈에디션)을 기준으로 설명하였다. 다른 리눅스를 사용하거나 Xmanager 프로그램에 대한 좀 더 자세한 설명을 원한다면 Xmanager 홈페이지를 방문해보기 바란다.
설명 crontab 명령은 cron 작업을 제출, 편집, 나열 또는 제거합니다. cron 작업은 cron 디먼이 정기적으로 계획된 간격으로 수행하는 명령입니다. cron 작업을 제출하려면, crontab 명령을 -e 플래그와 함께 지정하십시오. crontab 명령은 편집 세션을 호출하여 crontab 파일을 작성할 수 있게 합니다. 이 파일에 각 cron 작업에 대한 항목을 작성합니다. 각 항목은 cron 디먼에 맞는 양식이어야 합니다. 항목 작성에 대한 내용은 crontab 파일 항목 형식을 .
사용자가 항목 작성을 마치고 파일을 종료할 때, crontab 명령이 그것을 /var/spool/cron/crontabs 디렉토리에 복사한 후, 사용자의 현재 사용자 이름에 대해 명명된 파일에 배치합니다. 사용자 이름을 갖는 파일이 crontabs 디렉토리에 이미 존재하는 경우, crontab 명령은 기존 파일위에 겹쳐씁니다.
다른 방법으로, File 매개변수를 지정하여 crontab 파일을 작성할 수 있습니다. 파일이 존재할 경우, 그 파일은 cron 디먼이 예상하는 형식이어야 합니다. 파일이 없을 경우, crontab 명령이 편집기를 호출합니다. EDITOR 환경 변수가 있을 경우, 명령은 지정하는 편집기를 호출합니다. 그 외에는 crontab 명령이 vi 편집기를 사용합니다.
crontab 파일의 내용을 나열하려면, crontab 명령에 -l 명령을 지정하십시오. 기존 파일을 제거하려면, -r 플래그를 사용하십시오.
cron 디먼 cron 디먼은 crontab 파일 항목에 따라 명령을 수행합니다. 사용자가 cron 작업의 출력을 표준 출력 또는 오류로 재지정하지 않는 한, cron 디먼은 사용자에게 모든 명령 출력 또는 오류를 메일로 전송합니다. crontab 파일에서 cron 작업을 잘못 지정하면, cron 디먼은 작업을 수행하지 않습니다.
cron 디먼은 cron 디먼이 초기설정될 때만 crontab 파일을 시험합니다. crontab 명령을 사용하여 crontab 파일에 변경을 수행할 때, 변경을 나타내는 메세지가 cron 디먼으로 전송됩니다. 이것으로 새로운 또는 변경된 파일에 대해 정기적으로 계획된 간격으로 오버헤드를 점검하지 않아도 됩니다.
crontab 명령 사용에 대한 제어 /var/adm/cron/cron.allow 및 /var/adm/cron/cron.deny 파일은 crontab 명령을 사용할 수 있는 사용자를 제어합니다. 루트 사용자는 이 파일을 작성, 편집 또는 삭제할 수 있습니다. 이 파일의 항목은 한 행에 이름이 한 개 있는 사용자 로그인 이름입니다. 사용자의 로그인 ID가 둘 이상의 로그인 이름과 연관되는 경우, crontab 명령은 사용자가 실제로 사용 중인 로그인 이름과 상관없이 /etc/passwd 파일에 있는 첫번째 로그인 이름을 사용합니다.
다음은 cron.allow 파일의 한 예입니다.
root nick dee sarah cron.allow 파일이 있을 경우, 로그인 이름이 여기에 나타나는 사용자들만이 crontab 명령을 사용할 수 있습니다. 루트 사용자의 로그 이름이 cron.allow 파일에 반드시 나타나야 합니다. 시스템 관리자는 사용자의 로그인 이름을 cron.deny 파일에 나열하여 그 사용자가 crontab 명령을 사용할 수 없게 할 수 있습니다. cron.deny 파일만이 존재하는 경우, 파일에 나타나지 않는 모든 사용자가 crontab 명령을 사용할 수 있습니다.
다음 중 하나에 해당되는 경우, crontab 명령을 사용할 수 없습니다.
cron.allow 파일과 cron.deny 파일이 존재하지 않습니다(루트 사용자만 허용). cron.allow 파일이 존재하지만 사용자의 로그인 이름이 나열되어 있지 않습니다. cron.deny 파일이 존재하고 사용자의 로그인 이름이 나열되어 있습니다. cron.allow와 cron.deny 파일이 둘다 존재하지 않는 경우, 루트 사용자 권한을 갖는 사람만이 crontab 명령으로 작업을 제출할 수 있습니다.
crontab 파일 항목 형식 crontab 파일은 각 cron에 대한 항목을 포함합니다. 항목들은 개행 문자로 분리됩니다. 각 crontab 파일 항목은 다음 형태로 공백이나 탭으로 분리된 6개 필드를 포함하고 있습니다.
minute(분) hour(시) day_of_month(일) month(월) weekday(요일) command(명령) 이들 필드는 다음 값을 승인합니다.
각 필드에 대해 반드시 값을 지정해야 합니다. command 필드를 제외하고, 필드 다음에 들어갈 수 있습니다.
지정된 범위에 있는 숫자. 5월에 명령을 수행하려면, 월 필드에 5를 지정하십시오. 두 수를 대시로 분리하여 두 수 자체도 포함하는 범위를 나타내는 범위 지정. 화요일부터 금요일까지 cron 작업을 수행하려면, weekday 필드에 2-5를 입력하십시오. 숫자들을 쉼표로 분리하여 나열한 숫자 리스트. 1월의 첫날과 마지막 날에 명령을 수행하려면, 일 필드에 1,31을 입력합니다. *(별표)는 모든 허용되는 값을 의미합니다. 매 시간마다 작업을 수행하려면, hour(시) 필드에 별표를 지정하십시오. 주: 앞에 역슬래시(% 포함)가 오는 모든 문자는 문자 그대로 처리됩니다. 날짜의 지정은 두 필드(날짜와 요일)에 의해 이루어질 수 있습니다. 둘다를 요소로 지정할 경우, 둘다 고수하십시오. 예를 들어 다음과 같이 입력합니다. 0 0 1,15 * 1 command 이 명령은 모든 월요일뿐만 아니라 각 달의 1일과 15일에 command를 수행합니다. 단 하나의 필드로 날짜를 지정하려면, 다른 필드는 *를 포함해야 합니다.
명령 지정 cron 디먼은 선택된 날짜와 시간의 여섯 번째 필드에 지정된 명령을 수행합니다. 여섯 번째 필드에 %(퍼센트 기호)를 포함하면, cron 디먼은 그 앞에 오는 모든 것을 명령 호출로서 취급하고, 퍼센트 기호(\%)를 탈출하지 않는 한 그 뒤에 오는 모든 것을 표준 입력에 사용 가능하게 만듭니다. 공백 행과 첫번째 비공백 문자가 번호 기호(#)인 행을 무시됩니다.
주: 쉘은 명령 필드의 첫번째 행만을 수행합니다. 모든 다른 행은 명령에 표준 입력으로 사용 가능하게 됩니다. cron 디먼은 사용자의 HOME 디렉토리에서 서브쉘을 시작합니다. 사용자가 로그인되지 않았을 때 수행하도록 명령을 계획하고 사용자의 .profile 파일에 있는 명령을 수행하려면, 명령은 반드시 명시적으로 사용자의 .profile 파일을 읽어야 합니다.
cron 디먼은 모든 쉘에 대해 HOME, LOGNAME, SHELL(=/usr/bin/sh) 및 PATH(=/usr/bin)를 정의하는 디폴트 환경을 제공합니다.
플래그 -e 사용자의 crontab 파일의 사본을 편집하거나 또는 아직 crontab 파일이 없으면 편집 세션을 시작합니다. 편집이 완료될 때, 항목이 사용자의 crontab 파일로서 설치됩니다. 편집 세션은 EDITOR 환경 변수에 의해 지정되는 편집기를 사용하여 시작됩니다. 디폴트 편집기는 vi입니다. -l crontab 파일을 나열합니다. -r crontab 디렉토리에서 사용자 crontab 파일을 제거합니다. -v cron 작업의 상태를 나열합니다.
보안 감사(audit) 이벤트: 감사(auditing) 서브시스템이 적절하게 구성설정되고 사용 가능한 경우, crontab 명령은 명령이 실행될 때마다 다음 감사 레코드(이벤트)를 생성합니다.
이벤트 정보 CRON_JobRemove cron 작업을 제거한 사용자와 시기를 나열합니다. CRON_JobAdd cron 작업을 추가한 사용자와 시기를 나열합니다.
감사 이벤트 선택 및 그룹화하는 방법과 감사 이벤트 데이타 수집 구성설정 방법에 대한 자세한 내용은 AIX Version 4.3 System Management Guide: Operating System and Devices에 있는 "감사 기능 설정"을 참조하십시오.
종료 상태 이 명령은 다음과 같은 종료값으로 복귀합니다.
0 성공적으로 완료되었습니다. >0 오류가 발생하였습니다.
예제 mycronjobs이라는 파일을 /var/admn/cron/crontabs 디렉토리에 복사하려면, 다음과 같이 입력하십시오. crontab mycronjobs 매 시간마다 콘솔에 시간을 기록하려면, 다음과 같이 입력하십시오. 0 * * * * echo The hour is `date` . >/dev/console 모든 월요일, 수요일 및 금요일 오전 6시 30분에 calendar 명령을 수행하려면, 다음과 같이 입력하십시오. 30 6 * * 1,3,5 /usr/bin/calendar 일년 내내 매일 6시 30분에 calendar 명령을 수행하려면, 다음과 같이 입력하십시오. 30 6 * * * /usr/bin/calendar 8월 동안 매일 자정에 maintenance라는 스크립트를 수행하려면, 다음과 같이 입력하십시오. 0 0 * 8 * /u/harry/bin/maintenance 명령에 대한 표준 입력에 대해 텍스트를 정의하려면, 다음과 같이 입력하십시오. 0 16 * 12 5 /usr/sbin/wall%HAPPY HOLIDAY!%Remember to turn in your time card. %(퍼센트 기호) 뒤에 오는 텍스트가 다음과 같이 wall 명령에 대한 표준 입력을 정의합니다. HAPPY HOLIDAY!
Remember to turn in your time card. 파일 /var/adm/cron/FIFO crontab 또는 at 명령으로 새 작업이 제출될 때 cron 디먼으로 메세지를 전송하는 명명된 파이프. /var/spool/cron/crontabs crontab 스풀 영역을 지정합니다. /var/adm/cron/cron.allow crontab 명령에 대한 액세스가 허용되는 사용자 리스트를 지정합니다. /var/adm/cron/cron.deny crontab 명령에 대한 액세스가 거부되는 사용자 리스트를 지정합니다.