2008. 4. 23.

유용한 vi명령어

유용한 vi명령어
FAQ 2005/06/27 18:16
o 삽입
I: 줄의 제일 앞에서 입력
A: 줄의 제일 끝에서 입력

o 콤보command
4w: 4단어 skip후 이동
4b: 4단어 skip후 이동
4j,h,k,l: 커서이동시 지정한 수만큼 건너뛰므로
이동을 좀 더 빨리 할 수 있다.

o 줄의 결합(J)
2줄이 있고, 2째줄을 1째줄 끝에 붙이고 싶다면,
1째줄에서 J를 입력하면 된다.

o 커서이동
0: 줄의 처음
^: 줄의 처음(글자가 시작되는 처음)
$: 줄의 끝
w: 단어단위 이동
e: w와 같으나 단어의 끝으로 이동
b: w의 반대방향으로 이동
H, M, L: 커서를 화면 상,중,하로 이동

o 검색(/후 검색할 단어입력)
n: 뒤로 검색
N: 앞으로 검색

o 매크로
ab aa aaaa: aa를 입력하면 aaaa로 자동변환

o 치환
s/pattern/replace: 현재줄의 첫번째 matching pattern치환
s/pattern/replace/g: 현재줄의 모든 matching pattern치환
%s/pattern/replace/g: 모든 줄의 치환
line,lines/pattern/replace: 해당 범위의 치환

o 저장
w>> file: 지정한 파일에 추가

o 윈도 split
vi내에서 위아래로 윈도가 분활되면서 2개의 파일을
동시에 open/편집할 수 있다.
ex-mode(:프롬프트상태)에서 'sp 파일이름'
윈도우가 전환은 Ctrl+ww

o 기타
1. d의 경우 command모드로 계속 남아 있으나 c는 삭제후
insert모드로 변환한다. cc, c$, cw등은 유용하게 사용될 수 있다.
2. .은 마지막 명령을 되풀이한다.

o visual모드
윈도의 텍스트 에디터와 같이 선택부분이 반전되면서 복사,
삭제 등을 할 수 있다.
v로 visual모드로 집입하여 커서키를 사용해 원하는 부분을 선택한다.
복사는 y, 삭제/잘라내기는 d로 할 수 있다.

o vi 설정(vim 설정)
자신의 홈디렉토리에 .vimrc를 생성하고 다음과 같이 할 수 있다.

set ai : auto-indent
set ts=4 : tab stop
set nu : numbering

o 윈도에서 작업중 vi에 붙여넣기시 계단현상발생 방지
:set paste

o 위치기억(UltraEdit의 ALT-F2, F2와 동일한 기능)
m{a-z}: 현재위치를 {a-z}로 북마크함
`{a-z}: 기억해둔 {a-z}로 이동. 보통 한개만 등록했다면
그냥 ``를 사용하면 된다.

o 레코딩
설정파일의 주석추가/삭제시 유용하게 사용할 수 있다.
(이미 vi에 매크로기능이 있지만, 레코딩이 UltraEdit의 매크로기능과 유사하다.)
q{a-z}: {a-z}로 레코딩 시작. {a-z}만 가능한게 아니고 실제 {0-9a-zA-Z"}를
적기 번거로워 이렇게 표시만 한 것이다.
q: 레코딩 종료
@{a-z}: 레코딩 내용 적용(@@를 하면 바로 이전의 레코딩내용을 적용, N@@은
N으로 지정한 숫자만큼 적용)

----------------------
[vi] 치환(substitute)
----------------------
[범위] s [/패턴/대치/] [옵션] [카운트]

- 옵션
c 치환전 확인 유무 물음
g 글로벌 치환
p 치환된 마지막 라인 출력

- 예제
:1,10s/yes/no/g 처음 10행 치환
:%s/[Hh]ello/Hi/gc 치환 확인 물음
:s/Fortran/\U&/ 3 다음 3행의 "Fortran"을 대문자로 치환
:g/^[0-9][0-9]*/s//Line &:/ 숫자가 있는 모든라인에 Line: 추가

----------------------
[vi] 파일 오가며 편집하기
----------------------
:e#

"f4yy → :w → :e other_file → "fp
:f 버퍼에 4라인 복사후 붙이기
"F6yy
:f 버퍼에 6라인 추가

2008. 4. 15.

[아파치] 가상서버 내 아차피 로그설정시 리모트 IP 옵션

[아파치] 가상서버 내 아차피 로그설정시 리모트 IP 옵션
일반적으로 가상호스트의 아파치 로그 설정은

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

이렇습니다. %v 가 가상호스트명이고, %h 가 리모트 ip 입니다.

근데 가상서버내에서는 %h 가 게이트웨이 IP 로 나오기 때문에 조금 수정이 필요합니다.

LogFormat "%v %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

여기서 %h 를 %{X-Forwarded-For}i 로 변경해 주서야 합니다.

HTTP Header 값인 X-Forwarded-For 를 바로 사용하는 것입니다.

가상서버 이용에 참고하시기 바랍니다.




reverse proxy add forward module로 해결하기
가상서버에서 방문자 IP가 잡히지 않는 문제는 아파치로그 뿐만이 아닌 웹솔루션 소스를 뜯어 고쳐야 하는 것과 사이트 관리상에 상당한 문제점이 발생할 수 있습니다. 따라서 이러한 문제를 근본적으로 해결할 수 있는 것이 바로 reverse proxy add forward(RPAF)입니다. 이 모듈을 올려주면 이러한 문제가 해결이 되므로 가상서버, VPS, UML에서는 필수적인 모듈입니다.

1. 설치방법 방법은 http://www.just4fun.co.kr/drupal/?q=node/233 에서 소개한 것처럼 하면 됩니다.
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xzvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/local/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

2. mod_rpaf-2.0라는 공유객체가 생성이 되면 아파치 모듈에 자동 복사되어 넣어집니다. LoadModue에도 자동 추가 됩니다.(httpd.conf)
LoadModule rpaf_module modules/mod_rpaf-2.0.so

3. 다음을 2번 아래에 추가합니다.
RPAFenable On
RPAFsethostname On
RPAFproxy_ips [내부IP]

여기서 내부IP는 자신의 가상서버의 IP가 아닌 또다른 내부IP입니다. 제생각에는 포워딩을 해주는 프록시 IP같은데, 아파치 로그를 보면 계속 어떤 특정한 IP로 찍히는 것을 확인할 수 있을 것입니다. 그것을 기입합니다. (예를들면 10.0.0.177 또는 192.0.0.20)
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 10.0.0.177

4. 이제 아파치를 재가동하면 정상적으로 IP가 기록되는 것을 로그파일로 확인할 수 있습니다.
5. 로그설정에서 IP(X-Forwarded-For)식으로 2개를 활용하면 IP(실제IP)가 잡힙니다.

*** 간혹 프록시를 이용해서 장난치는 경우도 실제IP를 파악할 수 있습니다.

프록시 - Proxy 는 크래커를 지켜주지 못한다.

인터넷 상에서 데이터를 전송할 때 꼭 필요한 것 중에 하나가 IP Address 이다.
네트워크 상에서 IP 는 자신의 고유 주소로써 데이터를 송/수신할 때 꼭 필요한
것 중에 하나이다.

본래 Proxy 는 네트워크의 중간에 설치함으로써 Cache 등의 기능을 활용하여
네트워크 트래픽을 줄이거나 자원의 절약을 위해서 사용되었으나 근래에 들어서
그 용도가 많이 변질되었다.

Proxy 라 함은 주로 Web Proxy 를 많이 뜻하는데, Web Proxy 를 이용하여 인터넷을
사용할 경우 자신의 IP 를 노출시키지 않고 Proxy Server 의 IP 를 이용한다는
점에서, 사용자의 프라이버시를 지킬 수 있다는 것에 많은 사람들이 애용하고 있다.

그러나 특정 부류의 경우 Proxy 를 이용하여 악성 리플을 남기거나, 불법적인
행위를 하는 경우가 있는데, Proxy 의 익명성을 이용하여 이러한 행동을 한다면
이는 잘못된 생각이다. Proxy 는 사용자를 지켜주기 위해 개발된 것이 아니다.

이 글은 Proxy 의 익명성을 이용하여 인터넷에서 악의적인 행동을 하는
사람들을 대상으로 쓸 것이다.

Proxy 서비스를 제공해주는 A 라는 Proxy 서버가 있다고 가정하자. B 라는 사용자는
A Proxy 서버를 이용하여 C 사이트에 연결할 것이다. B 는 인터넷 익스플로어의
Proxy 관련 설정으로 A Proxy 를 지정하였다. 이럴 경우 B 사용자는 C 사이트에 연결
할 때 다음과 같은 경로를 거치게 된다. (중간의 Network 경로는 생략하였다.)

B (사용자) -> A (Proxy Server) -> C (웹 사이트)

보기에, B 사용자는 A Proxy 서버를 거쳐서 C 에 가기 때문에, C 사이트는 B 사용자의
주소를 모를 것처럼 보인다. 이 것이 Proxy 서버가 사용자의 익명성을 지켜준다고
생각한다. 하지만 실제로는 그렇지 않다.

Proxy 서버가 C 사이트에 Web Contents 를 요청할 때, 여러 가지 헤더를 넘기게
되는데, 이 때 Proxy 를 이용하는 원래 사용자의 IP 도 같이 넘겨주기 때문이다.
여기서 A Proxy 서버는 C 사이트에 Web 요청을 보낼 때, B 사용자의 IP 정보도
같이 넘겨주게 되는데, 그 메소드는 "X-Forwarded-For" 이다.

Apache 웹 서버를 대상으로 설명하자면, Apache 웹 서버는 Request 의 헤더 중에
X-Forwarded-For 라는 것이 있다면 이 것을 환경 변수에 저장한다. 즉, C 사이트는
A Proxy 서버를 이용하는 B 사용자의 IP 주소도 알 수 있다는 이야기가 된다.

여기서는 웹 사이트에 접속한 사용자가 Proxy 서버를 이용하여 들어왔는지 알아
내는 방법을 PHP 를 대상으로 설명해보겠다. PHP 에서는 Apache 웹 서버에서 저장한
환경 변수를 상속받아 PHP 의 환경 변수로 다시 저장하는데, Proxy 가 보내온
헤더의 정보 중 "X-Forwarded-For" 는, PHP 에서 $HTTP_X_FORWARDED_FOR 변수에
담기게 된다.

아래는 웹 사이트에 접속한 사용자가 Proxy 를 이용하는지 판별해주는 테스트
소스이다.




위 소스를 테스트해보면 알 수 있지만, Proxy 서버를 이용하여 접근할 경우 원래
사용자의 IP 를 볼 수 있다.

이 글로 우리는 Proxy 서버를 사용하는 것이 사용자의 IP 를 숨겨주는 것이
아니라는 것을 알 수 있다. Proxy 를 이용하여 악의적인 행위를 해서는 안 될
것이다. 자신의 IP 가 노출되기 때문에 해서는 안된다는 것이 아니라, 악의적인
행위는 근절되야한다!!


만약 서버 관리자의 입장으로써, Proxy 서버를 이용하는 사람들을 막고 싶다면
HTTP_X_FORWARDED_FOR 환경 변수를 체크함으로 이용할 수 있을 것이다. 그러나
여기서 한가지 주의해야 할 점은, 회사나 학교 등에서는 내부 IP 를 사용하는
경우가 가끔 존재하는데, 이럴 경우 외부로 나가는 패킷은 집단 내에 존재하는
Proxy 서버를 통해서 나가게 되는 경우가 있다.

이럴 경우에, HTTP_X_FORWARDED_FOR 환경 변수가 존재한다고 무조건 사용자의
접근을 차단하는 방법을 이용해서는 안되고, Original IP 가 가상 IP 에서만
존재할 수 있는 것인지 확인을 한 후 처리를 해야할 것이다. 예를 들어 Original
IP 가 "192.168.0.100" 이라면 가상 IP 이다.

그러나 이 것도 100% 신뢰할 수는 없는데 그 이유에 대해서는 내가 쓴 "CGI
에서 Proxy 환경 변수를 이용할 경우 문제가 되는 점" 에서 참고하도록 하자.


참고사이트: http://hackersnews.org/hn/read.cgi?board=hn_sangsik&y_number=83&nnew=2
그럼 이만..

2008. 4. 7.

Database JDBC 설정

데이타베이스별 JDBC 설정(Oracle, MySQL, MSSQL) JSP
2008/02/06 00:16

http://blog.naver.com/cuckoo03/120047728068
이 포스트를 보낸곳 ()


1. 드라이버설치
해당 DB 드라이버를 JAVA_HOME/jre/lib/ext 와 TOMCAT_HOME/common/lib 아래에 복사


2. URL분석
url 형식의 문자열을 인자로 사용.

jdbc:subprotocol:subname
subprotocol -> 사용할 드라이버 이름 or 특정 데이터베이스와의 연결을 지정하는 방식
subname -> 찾고자 하는 특정 데이터베이스명


3. Database별 Driver 와 connection URL

DATABASE
VALUE


ORACLE
DRIVER
oracle.jdbc.driver.OracleDriver

URL
jdbc:oracle:thin:@hostname:port:SID


MSSQL
DRIVER
com.microsoft.jdbc.sqlserver.SQLServerDriver

URL
jdbc:Microsoft:sqlserver://localhost:1433;databasename=DB명


MYSQL
DRIVER
org.gjt.mm.mysql.Driver

URL
jdbc:mysql://localhost:3306/DB명




4. 드라이버테스트 (도스창)
도스상에서 javap 드라이버명
ex)javap com.mysql.jdbc.Driver


5. DB 접속테스트 (JSP 테스트)
<%@ page contentType="text/html;charset=euc-kr" import!!="java.sql.*" %>
<%
try {
Class.forName("해당JDBC_DRIVER");
String url = "해당CONNECTION URL";
String id = "DB사용자아이디";
String pass = "DB비밀번호";

Connection conn = DriverManager.getConnection(url, id, pass);

Out.print("데이터베이스연결성공")
conn.close();

} catch(SQLException e) {
out.println("데이버베이스연결실패" + e.printStackTrace());
}
%>

6. DB 접속테스트 (java 테스트)
* 클래스패스설정필요 ex)c:\jdk1.4\jdbcmysql-connector-java-3.0.15-ga-bin.jar

import!! java.sql.*;

public class DriverTest{

/* mysql
private static String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static String JDBC_URL = "jdbc:mysql://localhost:3306/dbname?uniCode=true&characterEncoding=euckr";
private static String DBUSER = "root";
private static String DBUSER_PASS = "passwd";
*/


/* mssql
private static String JDBC_DRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
private static String JDBC_URL =

"jdbc:microsoft:sqlserver://localhost:1433;databasename=gmpd";
private static String DBUSER = "sa";
private static String DBUSER_PASS = "passwd";
*/

public static void main(String args[]){
Connection con = null;
try{
Class.forName(JDBC_DRIVER).newInstance();
con=DriverManager.getConnection(JDBC_URL, DBUSER, DBUSER_PASS);
System.out.println("Success");
}catch(SQLException ex){
System.out.println("SQLException" + ex);
ex.printStackTrace();
}catch(Exception ex){
System.out.println("Exception:" + ex);
ex.printStackTrace();
}
}

}





에러 메시지 및 해결

드라이버 로딩 에러 : java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

jdbc드라이버가 클래스패스에 설정되지 않았거나 잘못 설정 된 경우





DB 접속 실패 : java.sql.SQLException: IO 예외 상황: The Network Apater could not establish the connection

네트워크 또는 db서버의 리스너가 구동되고 있지 않거나 db서버가 죽어 있을 경우, db정보 설정이 잘못설정 된 경우





DB접속 실패 : java.sql.SQLException: ORA-01017:invalid username/password; logon denied

디비 연결 정보가 잘못 설정되었을 경우





sql문 수행 오류 : java.sql.SQLException:ORA-00907 우괄호가 없습니다

java.sql.SQLException:ORA-00955 이미 사용된 객체명입니다

2008. 4. 6.

Linux Binary Core

LINUX 운영체제에서 코어 정보 수집 LINUX
GDB는 Linux의 기본 디버거로 사용되며 강력하고 안정적입니다. 다양한 비주얼 디버거를 사용할 수도 있지만 코어에서 스택 트레이스를 가져올 경우 간단한 명령줄 디버거면 충분합니다.


file /core를 실행하여 코어 파일의 출처가 Java VM인지 여부를 확인합니다.
Linux에서 알려진 버그를 방지하려면 최신 버전의 GNU GDB를 사용해야 합니다.

참고: http://ftp.gnu.org/gnu/gdb/
또한 Linux에서 코어 파일에 대해 ulimit가 설정되어 있는지 확인합니다 (예: ulimit -c unlimited).
Linux에서는 기본적으로 코어 덤프가 오프되어 있습니다. RedHat Advanced Server 2.1에서는 코어 파일이 /etc/security에 있고 limits.conf라는 파일이 있어야 합니다. 이 파일에서 설정 사항을 확인할 수 있습니다. "core"라는 단어를 찾아보십시오. 0으로 설정되어 있으면 coredump를 사용할 수 없습니다.
참고 항목: 코어 파일 생성을 위해 검사해야 할 운영 체제 구성
다음과 같이 gdb를 사용하여 스택 트레이스를 가져옵니다(이전 과정과 동일).


$ java -version (need to use right version of jdk)
$ ls /usr/local/bin/gdb (need to know gdb location) or "which gdb"
$ export DEBUG_PROG=/usr/local/bin/gdb (or wherever "gdb" is located)

For JDK 1.3.X do the following:
$ /java corefile
For JDK 1.4.X do the following:
$ gdb /java corefile

Now you will be in the debugger. Execute the following commands:
(gdb) where ("shows a summary of the stack")
(gdb) thr ("switch among threads or show the current thread")
(gdb) info thr ("inquire about existing threads")
(gdb) thread apply 1 bt ("apply a command to a list of threads, specifically the backtrace to thread #1")
(gdb) quit


where 명령을 사용하면 실행된 마지막 스레드의 스택 트레이스가 생성되고, thr 명령을 사용하면 현재 스레드가 표시되고, info thr 명령을 사용하면 모든 스레드의 상태가 표시되고, thread apply 1 bt 명령을 사용하면 코어 파일에 포함된 스레드 1의 스택 트레이스를 다른 방식으로 가져올 수 있습니다. 마지막 명령 thread apply # bt에서 #을 실제 스레드 번호로 바꾸어 개별 스레드의 스택 트레이스를 가져오거나 3을 "all"로 바꾸어 모든 스레드의 스택 트레이스를 가져올 수 있습니다.

Linux expect command example

리눅스 expect 명령 간단한 예제 (2)
작성한 스크립트는 각 원격 시스템들을 로그인 하여 간단하게 프로세스을 죽이고 살리는 스크립트이다.
좀 더 구체적으로 말하자면 7대의 시스템이 A라는 서비스를 하고 있었는데 이를 B라는 서비스로 바꾸고
싶을 때 자동으로 Telnet 원격 로그인을 치고 들어가서 프로세스를 죽이고 살리는 작업을 한다.

switch_mode.sh 스크립트
1) 변수 사용 (앞 부분)

#!/usr/bin/expect
#
# @file : switch_mode.sh
# @description : switch between pac and iux automatically
# @author : Keywon Ryu
# @date : 2008. 01. 18
#
#

set timeout 180 # timeout 값 설정 (send를 하고 expected된 응답이 안 올때의 timeout)
set system [lindex $argv 0] # ./switch_mode $0 (콘솔에서 실행 시의 첫 인자)


2) 함수 정의
4개의 함수를 구현하였다.
- start_pac : 시스템에 PAC 서비스를 구동시킨다.
- stop_pac : 시스템에 PAC 서비스를 종료한다.
- start_iux : 시스템에 IUX 서비스를 구동시킨다.
- stop_iux : 시스템에 IUX 서비스를 종료한다.
함수 예제)

#----------------------------------------------------------------
# Args : host (IP address)
# Desc : 해당 IP 주소 시스템의 IUX 서비스를 구동시킨다.
#----------------------------------------------------------------
proc start_iux host {
# 해당 호스트에 telnet 로그인
spawn telnet -l iux -c $host
expect -re "Password:"
sleep 0.5
send "암호\r"
expect -re "Last login:"
sleep 0.5

# startPFM 명령 실행 (자체적으로 서비스 framework을 실행시키는 실행 파일이다.)
send "startPFM\r"

# 12초간 wait
sleep 12

# startIUX 명령 실행 (자체적으로 IUX 서비스를 실행시키는 실행 파일이다.)
send "startIUX\r"

# 명령이 종료되었음을 알리는 문자열이 올 때까지 대기한다.
expect -re "lucyPAC : Logout from UAS..."

# 로그 아웃
send "exit\r"
interact
}

#----------------------------------------------------------------
# Args : host (IP address)
# Desc : 해당 IP 주소 시스템의 IUX 시스템을 종료시킨다.
#----------------------------------------------------------------
proc stop_iux host {
# 해당 호스트에 telnet 로그인
spawn telnet -l iux -c $host
expect -re "Password:"
sleep 0.5
send "암호\r"
expect -re "Last login:"
sleep 0.5

# stopIUX 명령 실행 (자체적으로 IUX 서비스을 종료시키는 실행 파일이다.)
send "stopIUX -a\r"

# 명령을 실행 시 다음의 문자열이 올 때까지 대기한다
expect -re "Do you really want to stop Process"

# stopIUX 명령에서 Do you really want to stop Process CHT11? (y/n/a/q) 이렇게 물어보며
답을 기다리게 된다. 이 답에 대해 'a'를 자동으로 보낸다.
send "a\r"

# 명령이 종료되었음을 알리는 문자열이 올 때까지 대기한다.
expect -re "lucyPAC : Logout from UAS..."

# stopPFM 명령 실행 (자체적으로 서비스 framework을 종료시키는 실행 파일이다.)
send "stopPFM\r"

# 5 초간 기다린다.
sleep 5
send "exit\r"
interact
}


3) 본문 구성

[변수 사용]
[함수 정의]
..................
if { $system != "pac" && $system != "iux" } {
send "SWTICH> not supported system. between 'pac' and 'iux'\n"
send "SWITCH> example) ./switch_mode pac\n"
send "SWITCH> example) ./switch_mode iux\n"
send "\n"
exit
}
send "SWITCH> $system switch_mode starting.....\n"
send "\n"

if { $system == "pac" } { # PAC 서비스로 변신
# IUX 서비스들을 종료
stop_iux "192.168.1.1"
stop_iux "192.168.1.2"
......................
stop_iux "192.168.1.7"

# PAC 서비스들을 구동
start_pac "192.168.1.1"
start_pac "192.168.1.2"
.......................
start_pac "192.168.1.7"
}
if { $system == "iux" } { #IUX 서비스로 변신
# PAC 서비스들을 종료
stop_pac "192.168.1.1"
stop_pac "192.168.1.2"
......................
stop_pac "192.168.1.7"

# IUX 서비스들을 구동
start_iux "192.168.1.1"
start_iux "192.168.1.2"
.......................
start_iux "192.168.1.7"
}

Telnet 자동 접속 쉘 프로그래밍

#!/usr/bin/expect
spawn telnet aaa.co.kr
expect -re "login: "
sleep 1
send "아이디\r"
expect -re "password: "
sleep 1
send "패스워드\r"
interact


=================================================================
먼저 spawn 이란 넘이 telnet 명령을 실행합니다.
expect -re "login: " 은 login: 이란 단어가 나올때 까지 기다리는 거죠.
telnet 을 실행하면 login 이란 단어가 출력이 됩니다.
이때 아이디를 보내줍니다. (send)
그 다음 또 password 란 단어를 기다립니다. (expect -re "password: ")
그러면 비밀번호를 보줍니다. (send)
그 다음 expect 가 제어를 종료합니다. (interact )
man expect 하시면 더 많은 정보를 얻을 수 있습니다.
그리고 expect가 /usr/bin/expect에 없는경우도 있습니다.
그럴경우 which expect 라고 명령을 실행하면 경로가 나옵니다...
하지만 설치가 안됬을경우는 설치하시면됩니다..^^;

Linux rsync 와 ssh|작성자 뺀쥐리

ssh, rsync를 이용한 백업방법에 대한 웹호스트 연구문서


원격백업을 해결할 열쇠, rsync와 ssh의 결합

(주)웹호스트 구자열과장 danda@nate.com

---

1. 우선, 아래 rsync,ssh에 대한 문서를 읽은 후 본 글을 읽자.

2. 들어가며 정의문서
- 백업대상서버 : 1.1.1.1 ssh포트는 22번
- 백업대상서버(2) : 1.1.1.2 ssh포트는 보안으로 100번사용중
- 백업서버 : 2.2.2.2

우리는 백업서버를 2.2.2.2로 정의하자.
백업대상이 되는 서버는 1.1.1.1로 가정한다.

3. 포트및 접속, 데먼에 대한 이해
- 1.1.1.1은 rsync가 깔리지 않아도 된다.
- 2.2.2.2는 rsync구동프로그램이 반드시 깔려야 한다.
- 1.1.1.1은 873 rsync포트가 열리지 않아도 된다.
- 본 기법은 ssh를 이용한 백업임을 명심하자.
즉, ssh에 대해서만 이해하면 되며, rsync는 백업될때 효율성을 높이는 도구일뿐

4. 1.1.1.1의 백업스크립트작성

#!/usr/bin/expect -f
log_user 0
spawn rsync -avPz --stats -l -t -e ssh 아이디@1.1.1.1:/.backup/ /.backup/start1/
expect "password: "
send "비밀번호\n"
log_user 1
interact

절차숙지
1) expect rpm버전을 설치하라.
2) /usr/bin/expect -f 이파일 <---이렇게 테스트해보라(에러출력됨)
3) expect
> log_user 0
1
....
>exit
이런식으로 expect명령으로 각 줄을 입력 테스트해보라~


5. 1.1.1.2 포트가 다른 경우의 스크립트 핵심

#!/usr/bin/expect -f
log_user 0
spawn rsync -avPz --stats -l -t -e ssh 아이디@1.1.1.2#100:/.backup/ /.backup/www2/
expect "password: "
send "비밀번호\n"
log_user 1
interact

- 포트는 ssh에 따라가므로 #포트로 추가된다.
- 나머지 동일사항

6. crontab의 작성

#remote backup www server 6:00
00 4 * * 5 root /sbin/e2fsck -p /dev/hdb1
01 4 * * 1 root /backupscripts/wwwbk1.sh
01 4 * * 2 root /backupscripts/wwwbk1.sh
01 4 * * 3 root /backupscripts/wwwbk1.sh
01 4 * * 4 root /backupscripts/wwwbk1.sh
01 4 * * 5 root /backupscripts/wwwbk2.sh
01 4 * * 6 root /backupscripts/wwwbk2.sh
01 4 * * 0 root /backupscripts/wwwbk2.sh

위에 작성한 문서를 wwwbk1.sh 와 wwwbk2.sh로 폴더를 다르게한 후,
월-목 : wwwbk1실행하여 /bk/백업1/
금-일 : wwwbk2실행하여 /bk/백업2/
에 놓아서 안정성을 가중시킨다.

Linux expact의 문제점

이번에 cron job으로 일정 시간마다 돌리는 shell을 만들면서 password를 입력해야하는

문제가 발생하였다.

기존에는 bash로 되어있었는데, 이것으로 interactive 한 처리를 하기가 힘들다는 것이었다.



그래서 찾아본결과 알아낸것이 expect



자세한 내용은 man expect하면 명령어 list가 쭈르륵 나온다.



그런데 문제가 생겼다.



대략 job processing시간은 10분정도.

즉 10분정도 job이 돌아야하는데 자꾸 중간에 끊어져버리는것이었다.



--------------------------------------------------------------

#!/usr/bin/expect -f

spwan <10분정도 걸리는 작업>

expect "Password"

send "암호"

expect eof

--------------------------------------------------------------



이렇게 했는데 expect eof 가 실제로 작업이 끝나기도 전에 종료된다는 점이었다.

별의 별 짓을 다해도 해결이 안되었다.

나중에 안 것이지만 expect 에는 timeout이라는 것이 있었다.

default가 timeout 30초

즉 30초만 되면 자동으로 terminate 된 것이었다.



그래서 수정한것이..

--------------------------------------------------------------

#!/usr/bin/expect -f

set timeout -1 #infinite

spwan <10분정도 걸리는 작업>

expect "Password"

send "암호"

expect eof

--------------------------------------------------------------



expect

프로그램 안에서 프로그램을 돌리는 것

그럴려면 ubuntu안에서 expect를 설치해야함

===============================================================================

# !/usr/lacal/bin/expect

# wrapper to make passwd(1) be non-interactive

# username is passed as lst arg, passwd as 2nd

set passwd [lindex $argv 1]

set username [lindex $argv 0]



spawn /usr/bin/passwd -> 프로그램 부르는 것

expect {*passwd:} => 앞에 뭐가 나오던지 마지막에 passwd:라는 메세지가 나올때까지 기다려라

send "$passwd\n" => 거기다 $passwd를 넣어주거라

expect {*passwd:}

send "$passwd\n"

expect eof

===============================================================================

expect login example -> 검색해보시오



expact의 문제점

원래 expect는 한줄한줄 입력을 받고 저장을 하기에는 쉬우나

순서대로가 아닌 입력에 따라 저장위치가 달라진다거나 하는 등 왔다갔다 하는 경우에는 쓰기 힘듬

=> curses -> 화면을 지우고 몇번째 칼럼을 저장하고 하는 라이브러리

2008. 4. 2.

RHCE linux route

- Route 설정
라우팅(Routing) 설정
- 라우팅 : 패킷을 목적지까지 갈 수 있도록 경로를 올바르게 설정해 주는 작업

route 명령이 수행되었을때 보여주는 테이블을 라우팅 테이블 (Routing Table)라 한다.
ifconfig 명령으로 이더넷 인터페이스에 아이피 주소를 할당하게 되면 할당해준 아이피 주소의 네트워크에 대한 라우팅은 자동으로 추가된다.

네트워크 주소가 아닌 단일 호스트에 대해 라우팅을 추가 할때

route add -host [ip] dev [이더넷인터페이스명]

ex) 192.168.1.1 을 라우팅 테이블에 추가하기
=> route add -host 192.168.1.1 dev eth0

라우팅 정보가 잘못되었거나 라우팅을 삭제 하고자 할때

route del [IP] dev [이더넷인터페이스명]

ex) 192.168.1.1 을 라우팅 테이블에서 제거 하기
=> route del 192.1.1 dev eth0

※네트워크 환경에서 이더넷카드만 사용하지 않을경우 ifcfg-이더넷인터페이스명을 비활성화 시켜라.

RHCE linux iptables

31. 기본적인 firewall 정책을 실행하기 위해 iptables 사용하기, Red Hat Linux에서의 User

Private Group scheme 이해

# iptables -A INPUT -p TCP -s xxx.xxx.xxx.0/24 --destination-port 3306 -j ACCEPT

이제 xxx.xxx.xxx.0 ~ 255 까지의 IP 대에서 접근이 가능합니다.
-A : 새로운 rule 을 추가하는 옵션 (INPUT, FORWARD, OUTPUT)
-p : 사용할 프로토콜을 지정 (TCP, UDP)
-s : 사용할 ip 주소를 지정
--destination-port : 사용할 포트를 지정
-j : 패킷처리방법을 지정(ACCEPT, DROP, REJECT)

추가했던 chain rule 을 제거하는 방법
# iptables -D INPUT -p TCP -s xxx.xxx.xxx.0/24 --destination-port 3306 -j ACCEPT

rule delete

- iptables 일부 포트만 열어주는 방법

IPTABLES 현재 상황 보기
# iptables -L

모든것을 DROP 시키는 방법
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP

허용하는 설정
# iptables -A INPUT -p TCP --destination-port 23 -j ACCEPT
# iptables -A OUTPUT -p TCP --source-port 23 -j ACCEPT

허용하는 설정
# iptables -A INPUT -p TCP --destination-port 21 -j ACCEPT
# iptables -A OUTPUT -p TCP --source-port 21 -j ACCEPT

허용하는 설정
# iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
# iptables -A OUTPUT -p ICMP -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -p ICMP --icmp-type 8 -j ACCEPT
# iptables -A INPUT -p ICMP -m state --state ESTABLISHED,RELATED -j ACCEPT

허용하는 설정
# iptables -A OUTPUT -p UDP --destination-port 53 -j ACCEPT
# iptables -A INPUT -p UDP --source-port 53 -j ACCEPT
# iptables -A OUTPUT -p TCP --destination-port 53 -j ACCEPT
# iptables -A INPUT -p TCP --source-port 53 -m state --state ESTABLISHED,RELATED -j

ACCEPT

허용하는 설정
# iptables -A INPUT -p TCP --destination-port 80 -j ACCEPT
# iptables -A OUTPUT -p TCP --source-port 80 -j ACCEPT


ex)
# DNS: Full Server (53)
# Sever/Client to Server query or response
/sbin/iptables -A INPUT --in-interface eth0 -p udp --source-port 1024: --destination $MY_IP --destination-port 53 -j ACCEPT
/sbin/iptables -A O

Linux /proc filesystem tuning

★/proc Filesystem tuning★

1. TCP SYN_Flooding 공격을 차단하기 위해 설정하는 tcp-syncookies값
기본값 "0"

[root@localhost proc]# sysctl -a | grep syncookies
net.ipv4.tcp_syncookies = 1
[root@localhost proc]# sysctl -w net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syncookies = 1
[root@localhost proc]#


2. /proc/sys/kernel/에서 획득할 수 있는 몇가지 커널 정보들[root@localhost proc]# cat /proc/sys/kernel/hostname
localhost.localdomain 호스트네임 확인
[root@localhost proc]# cat /proc/sys/kernel/osrelease
2.6.11-1.1369_FC4 커널버젼 확인 uname -r 과 동일한 결과값을 나타냄
[root@localhost proc]# cat /proc/sys/kernel/ostype
Linux 운영체제명 확인
[root@localhost proc]# cat /proc/sys/kernel/sysrq
0 커널메직키 확인

3. /proc/sys/net/ipv4 에서 설정 가능한 서버보안
외부의ping 테스트 막기
[root@localhost proc]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
기본값은 "0"

4. Smurf 공격방지를 위한 broadcast 패킷 방지하기[root@localhost proc]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
기본값은 "0"

5. 세션 종료시간 조정TCP 세션이 종료된 후 얼마나 오랫동안 세션연결을 유지할 것인가를 정하는 값입니다.
예를 들어 FTP나 텔넷등을 사용하다가 다운이 되었을 경우TCP 세션연결을 계속 유지한다는 것은
무의미하기 때문에 가능한 이값을 낮추어 주는 것이 좋습니다.
[root@localhost proc]#echo 20 > /proc/sys/net/ipv4/tcp_fin_timeout
기본값은 "60"초

6. Tcp keepalive time 설정[root@localhost proc]# echo 1200 > /proc/sys/net/ipv4/tcp_keepalive_time
TCP 연결 상태를 계속 유지하기 위한 시간설정 가능한 20분이나 30분정도로 셋팅하는 것이 바람직.

7. 서버에서 IP포워딩 기능[root@localhost proc]# echo 1 > /proc/sys/net/ipv4/ip_forward
기본값은 "0"이며 서버가 라우팅 기능이 필요하다면 1로 바꾼다.

8. 서버의 날짜 정보 유출막기tcp_timestamps 값이 1로 설정되어 있을 경우에는 외부에서 서버의 날짜 정보를 확인 가능하게 됩니다. 즉 누군가가 서버의 해킹을 위해 날짜정보를 확인하는 것이 가능하다는 의미 입니다.
[root@localhost proc]# echo 0 > /proc/sys/net/ipv4/tcp_timestamps
0으로 설정해놓는 것이 바람직 합니다.

9. SYN_Flooding 공격 막기TCP 세션을 맻기 위해서는 패킷을 보낼 서버와 받을 서버간에 몇 단계 확인 작업을 거치게 되는데 SYN과 ACK 패킷을 이용하여 송수신 준비확인을 하게 됩니다.
[root@localhost proc]# cat /proc/sys/net/ipv4/tcp_syncookies
1
[root@localhost proc]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1024

10. SYN 패킷을 받는 목적지 서버는 SYN과 ACK 패킷을 보낸 후에 소스서버에서 ACK 패킷을 보내기를 기다리게 됩니다. 이때 그냥 기다리는게 아니라 백로그큐(backlogqueue)가 허용하는 공간에 연결정보를 보관하게 됩니다. 이런상태가 수도없이 쌓이게 되면 목적지 서버의 특정 서비스가 정상적으로 이루어 지지않는 서비스 다운 상태가 됩니다.
해결방법은 백로그큐사이즈를 늘려주는 방법과 tcp_syscookies 값을 "1"로 설정하는 것이 그것입니다.

11. ICMP redirect의 변조된 패킷 차단(accept 패킷 차단설정)
[root@localhost proc]# echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirect
기본값은 "1"이며 이를 "0"으로 설정하시면 됩니다.

12. ICMP redirect의 변조된 패킷 차단(send 패킷 차단설정)
서버에서 나가는 ICMP redirect 패킷을 차단 위와 동일
[root@localhost proc]# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects "0"으로 설정 하시면 됩니다.


13. DoS공격 source로 사용차단(IP스푸핑 방지하기)echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
"0"이 기본값이며 "1"로 설정 하도록 한다.
DOS공격시 서버의 IP를 확인해보면 대부분 해킹당한 서버의IP가 사용되고 있음을 알수 있습니다.
IP 스푸핑될 수 있는 가능성을 차단하여 Dos 공격의 Source IP로 사용될 수 있는 가능성을 차단 해야 합니다. 그러나 계층적 라우터가 있는곳이라던지 하는 연결이 계속 유지되어야 하는 곳은 이설정 하지 않는것이 좋다. 단독 서버가 있는곳이라면 추천할 만하다.

14. 스푸핑 패킷에 대한 로그남기기[root@localhost proc]# echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
기본값은 "0"이며 "1"로 설정하면 됩니다.

15. Source Route 패킷 허용막기
소스라우팅을 허용하게 되면 IP Source Routing을 이용하여 해커는 마치 신뢰받는 호스트인것처럼 위장할 수 있습니다. 이를 막기 위하여 값을 0 으로 설정하면 됩니다.
[root@localhost proc]# echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route

이와 같은 설정들을 스크립트로 만들어서 for문으로 돌릴 수 있다.

#!/bin/sh
for ii in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo "0" > $ii
done;


- Source Route 패킷 허용막기
/proc/sys/net/ipv4/conf/all/accept_source_route
/proc/sys/net/ipv4/conf/bond0/accept_source_route
/proc/sys/net/ipv4/conf/default/accept_source_route
/proc/sys/net/ipv4/conf/eth0/accept_source_route
/proc/sys/net/ipv4/conf/eth1/accept_source_route
/proc/sys/net/ipv4/conf/eth2/accept_source_route
/proc/sys/net/ipv4/conf/eth3/accept_source_route
/proc/sys/net/ipv4/conf/lo/accept_source_route


# ii = 변수이다.








★보안을 위한 리눅스 커널값 설정하기★

Linux scanning sniffing network tuning

<스캐닝, 스니핑, 네트워크 관련 커널 튜닝>
---------------------------------------
~scanning
-개념
공격자가 목표 사이트를 공격하기전 해당사이트의 특징을 확인하는 작업으로 목표사이트내 존재하는 시스템의 통신가능여부, 제공하는
서비스등을 식별하기 위함
-목적
타겟 시스템에서 어떤 서비스가 동작하는지를 파악
방화벽설치 여부를 확인
시스템 기종 (linux,sparc,window) 파악
접속 가능한 ip 확인
운영체제의 정보를 파악
-nmap 은 스캐닝 도구로 자주 사용되는데 그 이유는 가장 많은 스캐닝 기법을 적용할 수 있는 도구 이기 때문이다.




~홈페이지
http://www.insecure.org


~다운로드 위치
http://download.insecure.org/nmap/dist/nmap-4.20-1.i386.rpm


~설치방법
rpm -Uvh 또는 ivh nmap-4.20-1.i386.rpm


---------------------------------------

[fedora]
#rpm -qa | grep nmap
#nmap
옵션 출력

#nmap -V
버전 출력


Q)ftp 서버에서 nmap-4.20-1.i386.rpm 을 다운받아
프로그램을 업그레이드 하시오







#ftp 121.160.70.177
myhat1 login
>dir
>mget nmap*
>by
#ls
#rpm -Uvh nmap-4.20-1.i386.rpm
#nmap -V








#nmap -v -sS -O(영문 O) 192.168.50.20

-v verbose 자세히 출력
-sS TCP SYN stealth port scan
-O 운영체제 예측





#nmap -v -sS -O -sV 192.168.50.20

-sV 서비스 버전 스캔








~스캐닝 원리

A syn(->) B
syn+ack(<-)
ack(->)




#nmap






#nmap localhost
자신의 컴퓨터 포트 스캔



#netstat -atn





~참조사이트
http://comefeel.com/tt/comefeel/69
http://saylon.egloos.com/74972







Q)
localhost를 대상으로 포트 10 ~ 60000 까지 스캐닝 하시오
(#nmap 한 다음 옵션 확인)









[fedora]
#netstat -atn

#nmap localhost
리눅스는 기본적으로 1-1024 포트만 스캔

#nmap -p10-60000 localhost
(또는 nmap -p 10-60000 localhost)


#nmap -v -sS -O -p1-65535 192.168.50.20


#nmap -O 192.168.50.1





Q)
cent 에서 nmap-4.20 버전을 wget 이용하여 설치하고 fedora 를 대상으로 운영체제 추측 및 stealth scan 하기








[cent]
#wget http://download.insecure.org/nmap/dist/nmap-4.20-1.i386.rpm

#ls
#rpm -Uvh nmap-4.20-1.i386.rpm

#nmap
#nmap -V

#nmap -sS -O 192.168.50.10
#nmap -p 10-25 localhost
#nmap -sR 192.168.50.10
RPC 스캔
#nmap -sF 192.168.50.10
FIN 스캔
#nmap -O 192.168.50.1 -o scan.txt
-o(소문자) 파일로 저장
#ls
#cat scan.txt



~참조사이트
http://insecure.org/nmap/man/man-os-detection.html
http://www.nwlab.net/tutorials/portscanner/nmap-tutorial.html

































































































































~tcpdump 를 이용한 sniffing
-sniffing : 같은 네트워크 상(LAN 환경)에 지나가는 모든 패킷을 capture


[fedora]
vsftpd 이용하여 ftp 서버 구축

#service vsftpd start
#nmap localhost
#netstat -ntlp
21


telnet접속
[xp] -----------------> [fedora]
[cent]
tcpdump로 스니핑








[cent]
#tcpdump port 23 and host 192.168.50.10 -w telnet.sniff


[xp]
도스창 실행
c:\>telnet 192.168.50.10
apple 로그인
$id
$w
$exit

[cent]
ctrl + c
스니핑 중지







#ls
#cat telnet.sniff
#tcpdump -r telnet.sniff
-r 파일로 저장된 tcpdump 파일 읽기
#tcpdump -r telnet.sniff | more

---> 이더리얼을 이용하면 쉽게 분석 할 수 있다.








~tcpdump 플래그(flags)

TCP플래그 TCPDUMP플래그 플래그의 의미

SYN S
SYN패킷, 접속요청을 할 때 보내는 패킷을
말한다. TCP접속시에 가장먼저 보내는 패킷이다.

ACK ack
ACK패킷, 상대방으로부터 패킷을 받은 뒤에 알려주는
패킷을 말한다. 다른 플래그와 같이 출력되는 경우도 있다.

FIN F
접속종료를 위한 플래그로 이 패킷을 보내는 곳이 현재
접속하고 있는 곳과 접속을 끊고자 할 때 사용한다.

RESET R
이 패킷을 보내는 곳이 현재 접속하고 있는 곳과
즉시 연결을 끊고자 할 때 사용한다.

PUSH P
데이터를 즉시 목적지로 보내라는 의미이다. 텔넷과 같이
상호작용이 중요한 프로그램의 경우 빠른 응답이 중요하다.
이때 사용하는 플래그이다.

URGENT URG
긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다.
예를 들어 ftp로 자료를 받고 있는 도중
CTRL+C 를 받으면 즉시 자료받기를 중단해야 하는 것처럼
이 때 사용하는 플래그이다.

Placeholder .
패킷이 SYN, FINISH, RESET, PUSH등의 플래그가
없는경우이 플래그가 세팅된다.
이 플래그는 ACK플래그와 함께 사용되는 경우도 있다.

----------------------------------------


~스니퍼 2(이더리얼)
홈페이지 : http://www.ethereal.com

-2003 부팅
바탕화면의 이더리얼 설치 프로그램 실행
Next
I Agree
Next
Next
Next
Install

Winpcap도 설치
Next
I agree
finish

next
finish



바탕화면의 이더리얼 아이콘 더블클릭
위쪽 메뉴표시줄-capture-interfaces
192.168.50.30 옆의 capture 버튼 클릭



xp 에서 fedora 로 ftp 익명연결 로그인
c:\>ftp 192.168.50.10
User : anonymous
Password : aa@aa.com(임의의 이메일 입력)
>dir
>by



이더리얼 스니핑 stop





캡처된 화면에서 4번째 라인 클릭
Analyze-Follow tcp stream 클릭
---> 아이디와 패스워드까지 알 수 있다.







[2003]
이더리얼 3번재 메뉴 표시줄 [clear] 버튼 클릭
다시 스니핑 시작



cent 에서 fedora 로 ssh 로그인 시도
[cent]
#ssh 192.168.50.10
root login test
#w
#exit

[2003]
이더리얼 스니핑 stop

결과분석 ---> 암호화된 데이타라서 아이디와 패스워드를 알 수 없다.










Q)
2003 에서 cent 에 있는 telnet.sniff 를 ftp 서비스 이용하여
다운받은 후 이더리얼로 분석하시오
(계정은 apple 을 이용하기)

















[cent]
(apple 계정없으면 추가하고 암호 설정하기)
#cd
#pwd
(/root)
#ls
#cp telnet.sniff ~apple
#cd ~apple
#pwd
(/home/apple)
#ls
#yum -y install vsftpd
#service vsftpd start

[2003]
웹브라우저 실행하고 주소창에 다음 입력
ftp://apple@192.168.50.20
telnet.sniff 를 바탕화면에 다운


---------------------------------------







































































































































~네트워크 관련 커널 튜닝
참조사이트
http://ipsysctl-tutorial.frozentux.net/chunkyhtml/index.html
http://www.haansoftlinux.com/service/technical/sw_ServerControl.php?&page=2&category=SServerControl
(7번 글 선택)



-커널에 설정된 값을 확인하기 위한 방법
/proc/sys/net/ipv4/*
sysctl -a


-ip_default_ttl
TTL(time to live)은 ip 패킷의 생존시간을 의미하며 하나의 라우터를
지날 때마다 1씩 감소
TTL 값은 1~255 사이의 값을 사용하는데 리눅스는 기본값으로 64를 이용


-net.ipv4.tcp_syncookies
유명한 DoS 공격의 한 형태로 syn attack 이라고 하는데 시스템에서 client 를
위해 설정된 자원을 무의미한 연결로 채워 시스템을 마비시키는 공격의 일종




Syncookies('신쿠키'라고 발음한다)는 'Three-wayhandshake' 진행과정을 다소 변경하는 것으로 Alex Yuriev와 Avi Freedman에
의해 제안되었는데, TCP 헤더의 특정한 부분을 뽑아내어 암호화
알고리즘을 이용하는 방식으로 Three-way Handshake가 성공적으로
이루어지지 않으면 더 이상 소스 경로를
거슬러 올라가지 않는다.
따라서 적절한 연경 요청에 대해서만 연결을 맺기 위해 리소스를
소비하게 되는 것이다.









[fedora]
#sysctl -a
시스템 설정값 모두 출력
#cat /etc/sysctl.conf
커널 설정파일


#sysctl -a | grep default_ttl
64

#echo 123 > /proc/sys/net/ipv4/ip_default_ttl
---> (1번)

#sysctl -a | grep default_ttl
123

(1번) 은 일회성이고
/etc/sysctl.conf에 적어 주어야 리부팅해도 적용된다.








[xp]
c:\>ping localhost
c:\>ping 192.168.50.20
c:\>ping 192.168.50.10

[cent]
#nmap -O 192.168.50.10



---> /etc/sysctl.conf 파일을 직접 다 적어주는 것보다
리다이렉션을 이용해서 값만 변경해주는
방법이 안전하다.







[fedora]
#sysctl -a | grep default_ttl
#sysctl -a | grep default_ttl >> /etc/sysctl.conf

#vi /etc/sysctl.conf
:set nu
:24
ttl 값 120 으로 수정

#reboot




[xp]
ping 192.168.50.10
ping 192.168.50.20




~다시 원래대로 설정(sysctl.conf 에서 ttl 라인 삭제)




~외부 ping에 응답안하도록 설정하기
[xp]
c:\>ping 192.168.50.10
---> O


[fedora]
#cat /proc/sys/net/ipv4/icmp_echo_ignore_all
#echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#cat /proc/sys/net/ipv4/icmp_echo_ignore_all






[xp]
c:\>ping 192.168.50.10
---> X






icmp_echo_ignore_all
--->값이 1이면 핑에 응답안함, 값이 0이면 핑에 응답
ping 명령에 대한 반응을 하지 않도록 설정한다면 서버가 서비스 중인지 판단하지 못하도록 할수 있다



Q)다시 ping 에 응답하도록 설정하기










~Attribute 설정하기

-리눅스에는 기본 퍼미션과 별도로 속성이라는 개념이 있다.
-attribute(속성)은 퍼미션(r,w,x)과는 다르다

lsattr(속성확인), chattr(변경)

[fedora]
#man chattr
a 추가허용
i 읽기전용

#seq 10
1부터 10까지 숫자 생성

#seq 10 > mytest.txt
#cat mytest.txt





#ll
속성은 ls -l, ll 로 알 수 없다.

#lsattr



#chattr +i mytest.txt
+는 속성추가, -는 제거

#lsattr
#rm mytest.txt
---> X
#echo 22 >> mytest.txt
---> X


#cat mytest.txt
#chattr -i mytest.txt
#lsattr





#rm mytest.txt
y enter
---> O
#ls






#seq 5 > mytest.txt
#chattr +a mytest.txt

#lsattr

#rm mytest.txt
---> X

#echo good >> mytest.txt
---> O , vi 로는 추가안됨
( > 는 덮어쓰기, >> 는 기존의 내용에 추가하기)

#cat mytest.txt

정보보안전문가분야의 필요성

☞ 인터넷이 발달함에 따라 각 개인 및 단체, 국가 등등

인터넷을 사용량이 급격히 늘어나고 있습니다. 단순히 정보보안쪽을 PC를 보호한다는 개념을 넘어 개인의 사생활이나 개인 정보유출방지 , 기업정보 유출방지는 점점 더

보안에 대한 인식 및 필요성이 부각되고 있습니다.



이에 유망직종 1위로 선정된 이유는 그만큼 인터넷과

개인정보에 대한 보안부분이 미약하고 관리자들이

부족하다는 의미도 있습니다.

인터넷이 발단한지도 10여년정도 된 만큼 향후에는

더욱 더 정보보안분야가 활성화되고 전문기업들도

많이 생겨나게될것입니다.



정보보안분야가 상당히 많기때문에 자신이 원하는분야

잘 맞추어서 준비를 하신다면 분명히 성공할수있는

기반을 만드실수 있을것입니다. ==>more



대부분의 사람들이 보안이라하면 단순 해킹을 한다고

생각하지만 보안도 하나의 서비스입니다. 개인이나 기업에서도 전문보안기업에 보안컨설팅 의뢰를 하고 보안 점검을 합니다. 이에 법적으로도 안전진단을 받도록 제도적 장치를 마련해 두고 있습니다.



정보보호 안전진단 컨설팅 업체가 현재 8개업체가 활동을 하고 있습니다. 8개업체에서 보안 장보보호안전진단 컨설팅을 진행하고 있습니다. 기업은 하나의 국가 경쟁력이 될수 있기때문에 그만큼 기업에서 점점 중요성을 인식하고 보안팀이나 보안 인트라를 구축하고 있습니다.



그리고 매스컴에서 정보보안전문가에 대해서 알리고 있기 때문에 요즘 인터넷상에서 가장 부각이되어 가고 있습니다. 이에 많은 사람들이 공부를 하고 진출하려 많은 노력을 하고 있습니다. 보안공부는 한마디로 컴퓨터에 대한 전반적인 지식과 더불어 프로그램, 서버, 네트워크, 정보보안기술 등등 많은 부분을 섭렵해야합니다.



이에 어릴때부터 준비를 할수록 투자하는 분야에 대한 이해를 빠르게 진행할수 있습니다.



우선 공부를 해야하는 내용적인 부분에 대해서 알려드리겠습니다.



◈ 정보보안전문가에게 필요한 지식

1. C언어 및 UNIX , OS운영체제 => 윈도우 , 리눅스, 유닉스

2. 침입탐지 시스템(Firewall)의 설계능력 배양

3. 보안 정책, 시스템 운영 및 관리기술 습득

4. 내부 네트워크 보호 및 외부망과 안전한 정보전송 기술 습득

: TCP/IP, 네트워크 보안 수립, NAT, VPN

5. 암호 및 보안 프로토콜 : 인증, 서명, 전자상거래 보안

6. 해킹방식과 해킹Tool 구사능력 습득

7. 인터넷 보안 Tool : 인터넷 보안 도구, 해킹탐지 및 대책



이외에 알아야 하는 부분은 상당히 많습니다. 하지만 현실적으로 무든 부분을 마스터하기는 힘들기때문에 가장 필요하고 알아야하는 부분 먼저 진행하고 공부해나가시면 됩니다. ==>more



▒ 정보보안전문가분야의 취업방향



☞ 정보보안전문가는 IT분야 전반적인 분야로 진출을 할수있습니다. 보안쪽으로 큰틀을 잡고 공부를 하면 네트워크, 시스템, 프로그램, 하드웨어, 소프트웨어 등등 많은 분야와 기업, 국가기관으로 진출할 수 있습니다.



-암호전문가, DB전문가, 네트워크아키텍처, 시스템아키텍처, 보안솔루션개발자,보안서버관리자, 악성코드 분석전문가, 보안아키텍처 Etc...



-주요 취업기업: 웹에이전시, 웹호스팅기업, 인터넷 쇼핑몰 업체, 온라인게임 및 모바일게임, 전문보안업체(컨설팅 및 관제업무업체), 대형 포털사이트업체, 외국IT기업(Ex. 소니,후지쯔,시만텍 등등) , 대기업의 CERT 및 스나이퍼Team) 기타등등.

2008. 4. 1.

linux chattr, lsattr

chattr, lsattr

루트도 지우지 못하는 파일을 설정한다.

chattr [옵션] [+=-속성] [파일명]

[옵션]
-R : 하위 디렉토리까지 재귀적으로 바꿈
-V : 파일속성을 바꾼 다음에 보여줌
-v version : 지정된 파일에 버전을 설정할 수 있습니다.

[설정모드]
+ : 속성을 추가한다.
- : 속성을 제거한다.
= : 원래 파일이 가지고 있던 그 속성만을 유지하게 합니다.

[속성]
a : 파일을 추가모드로만 열수 있다. 단, vi 편집기로는 내욜을 추가 할 수 없습니다.
c : 압축되어 있는 상태로 저장함.
d : dump 명령을 통하여 백업받을 경우 백업받지 않습니다.
i : 파일을 read-only로만 열 수 있게 설정합니다. 링크로 허용하지 않고 루트만이 이 속성을 제거 할 수 있습니

다.
s : 파일 삭제가 될 경우에 디스크 동기화가 일어나는 효과가 발생합니다.
S : 파일이 변경 될 경우에 디스크동기화가 일어나는 효과가 발생합니다.
u : 파일이 삭제가 되었을 경우에는 그 내용이 저장이 되며 삭제되기 전의 데이터로 복구가 가능해 집니다.


※ lsattr 이라는 명령으로 파일의 chattr 속성을 확일 할 수 있다.

ex)

1. 파일의 삭제, 변경, 추가 등을 불가능하게 하는 속성 설정하기
[root@imsi root]# touch test
[root@imsi root]# lsattr test
------------test
[root@imsi root]# chattr +i test
[root@imsi root]# lsattr test
----i-------test
[root@imsi root]# rm -rf test
rm: cannot remove 'test': 명령이 허용되지 않음


2. 파일의 삭제는 불가능하지만 내용추가는 가능하도록 하는 속성설정하기
[root@imsi root]# chattr +a /var/log/messages
----a-------/var/log/messages
[root@imsi root]# tail -f /var/log/messages

3. 특정 디렉토리내의 모든 파일과 디렉토리에 대하여 한번에 속성부여하고 확인하기
[root@imsi root]# ls -lR Shell
[root@imsi root]# ls -R -i Shell
[root@imsi root]# lsattr -R Shell | more

4. 속성 제거하기
[root@imsi root]# lsattr test
------------test
[root@imsi root]# chattr -i test
[root@imsi root]# lasttr test
----i--------test
[root@imsi root]# rm -rf test


5. 특정 디렉토리내의 모든 파일과 디렉토리에 대하여 한번에 속성 제거하기
[root@imsi root]# tail -f /var/log/messages

6. 여러가지 속성을 한번에 설정하기

[root@imsi root]# lsattr test
-------------test
[root@imsi root]# chattr +aisSu test
[root@imsi root]# lsattr test
suS-ia-------test
[root@imsi root]# rm -rf test
rm: cannot remove 'test': 명령이 허용되지 않음

Hacking work style

해킹을 통해 리눅스 서버를 침입한 해커는 일련의 다음과 같은 작업을 통해 시스템을 장악하게 된다. 리눅스 서버 관리자는 현재 시스템에서 이같은 작업을 한 흔적이 있는지 지속적으로 점검해야 한다.
 
▲ rootkit을 설치한다
 
rootkit은 해킹에 성공한 후 해커들이 설치하는 트로이목마 프로그램들을 통칭하는 단어이다. rootkit에 포함되어 있는 프로그램으로는 login, ps, pstree, top, ls, dir, vdir, chfn, chsh, du, ifconfig, in.rshd, netstat, syslogd, tcpd 등과 같은 시스템 프로그램들이 있다. 해커들은 이들 프로그램들을 원래 있던 프로그램과 바꿔치기 해서 관리자가 시스템을 점검해도 별 이상이나 변화가 없는 것처럼 위장한다. 일례로 ls를 바꿔치기 해서 ls를 실행시켜도 해커가 만든 파일이 보이지 않도록 하며, netstat를 바꿔치기 해 외부에서 네트워크로 연결한 해커의 모습을 보이지 않게 할 수 있다. 또한 login 프로그램도 바꿔치기 해서 패스워드 파일(/etc/passwd)에는 없지만 root 권한을 가진 아이디로 로그인할 수 있도록 해놓을 수 있다.
  ==>more
▲ 보안버그를 모두 패치한다
 
침입에 성공한 해커는 다른 해커가 자신과 같은 방법으로 해당 리눅스 서버에 칩입하는 것을 막기 위해 자신이 사용한 보안버그를 즉시 패치하며, 다른 버그도 모두 패치해 다른 해커의 침입을 최대한 방지한다.
 
▲ chattr 명령어로 파일변경을 막는다
 
리눅스에는 ext2 파일 시스템을 직접 건드리는 chattr라는 명령어가 있다. 이 명령어를 사용하면 특정 파일에 대해 관리자라 할지라도 지우거나 변경하지 못하게 만들 수 있다. 이 프로그램을 사용해 자신이 설치한 프로그램들을 관리자가 건드리지 못하게 만든 다음 chattr 명령어를 삭제한다. 이 경우 리눅스 서버 관리자는 root 계정으로도 해당 파일을 변경할 수 없게 된다.
 
▲ 서비스 거부 공격 프로그램을 설치한다
 
칩입한 리눅스 서버에 서비스 거부(Denial of Service) 공격 프로그램을 설치해 놓고 필요할 때 사용한다. 서비스 거부 공격 기법은 상대 서버에 순간적으로 패킷을 엄청나게 많이 보내서 네트워크 사용이 불가능하게 만들기도 하고, 서버 운영체제의 구조적인 버그를 이용해 서버를 다운시키기도 하는 등 다양하다.
  ==>more
▲ 스캔 프로그램을 설치한다
 
스캔(Scan, 대상 서버에서 어떠한 보안 버그가 있는지 분석해서 정리해 주는 행위) 프로그램을 설치한 후, 이를 이용해 불특정 다수의 서버를 점검한다. 이 경우 침입을 당한 리눅스 서버 담당자는 스캔을 당한 서버 관리자로부터 엄청난 항의를 받게 된다. 스캔 프로그램으로는 mscan이나 sscan이 대중적으로 사용되며, 최근 국내의 많은 대학 서버들이 이 같은 방법으로 피해를 당했다.

리눅스 설치후 초기 보안셋팅

1. 서버구축시에는 반드시 별도의 파티션과, 별도의 백업디스크를 둔다.

이 백업디스크에 일백업및 실시간 백업이 이루어 지도록 구성한다.



backup.sh 파일작성및 crontab에 설정적용함.



### crontab 파일내용(기본)

00 00 * * * su - root /usr/bin/rdate -s time.bora.net && /sbin/clock -w

00 01 * * * su - root -c '/home/papa/backup.sh' >& /dev/null

00 08 * * * su - root -c '/home/papa/system_check' > /home/papa/www/system_check/system_check_logs



### backup.sh 내용(기본)

#!/bin/bash

cd /backup

rm -f *.tar.gz

tar cvfpz /backup/usr.local.tar.gz /usr/local/

tar cvfpz /backup/home.tar.gz /home

tar cvfpz /backup/etc.tar.gz /etc

tar cvfpz /backup/var.tar.gz /var



2. 시스템디스크와 데이터디스크를 구분하여 구축한다.



예 sda : / 시스템(운영체제가 설치되는)디스크

sdb : /home : 데이터디스크

sdc : /usr : Mysql, Apache등의 Applications 저장 디스크

sdd : /backup : 백업 디스크



3. /etc/xinetd.d/ 불필요한 파일들 제거



4. /etc/rc.d/init.d/ 불필요한 초기화 스크립트 제거



5. /etc/services 파일의 사용하지 않는 포트정보 주석처리



6. tcp_wrapper의 효율적인 활용을 위한 /etc/hosts.allow, /etc/hosts.deny 파일 설정



/etc/hosts.allow의 권장내용



popper : ALL

sendmail : ALL



7. proftpd 설치시에 Anonymous로그인 불허설정.(주석처리)

** RPM시에는 /etc/proftpd/conf/proftpd.conf 파일에 설정

** 컴파일시에는 /usr/local/proftpd/etc/proftpd.conf 파일에 설정



관리자 ID외의 상위 디렉토리 이동제한설정



예1)

DefaultRoot ~ !papa



예2)

DefaultRoot ~ !ds5ezp,!papa



8. ssh의 root원격로그인 설정제거

sshd가 설치되어 있지않을 경우나 망가져있을 경우에는 ssh관련 파일들을 rpm으로 설치하거나 compile하여 설치한다.

rpm으로 설치하였을 경우에는 /etc/rc.d/init.d/sshd start를 해줘야만 local key파일들이 /etc/sshd에 생성된다.



/etc/ssh/sshd_config파일내의 (redhat 7.3에서는 기본설정되어 있음(주석처리되어 있다는 의미)

PermitRootLogin no



9. su 명령어의 사용제한설정



chmod 4750 /bin/su

/etc/group내의 wheel그룹에 관리자계정 등록(예 : wheel:x:10:root,papa)

chown root:wheel /bin/su



10. logserver 설정 : 필요할 경우에.....

/etc/hosts 에는 logserver의 호스트정보 등록

/etc/syslog.conf 에는 로그를 원격로그서버에 저장할 대상 설정



작업서버에서의 syslog 재시작(/etc/rc.d/init.d/syslog restart)

로그서버(su21)에서의 syslogd재시작(/sbin/syslogd -h -r)



11. secu_script로 파일보안을 위한 파일퍼미션 설정



12. /etc/rc.d/rc.local내에 시스템 시작시 실행할 초기화 스크립트 설정



/usr/local/apache/bin/apachectl start

/usr/local/mysql/bin/safe_mysqld&

/usr/local/proftpd/sbin/proftpd



### Time Server Setting

/usr/bin/rdate -s time.bora.net

/sbin/clock -w



13. timeserver 설정



방법#1 cron에 설정 (매일 한번씩 맞춤)

00 01 * * * su - root /usr/bin/rdate -s time.bora.net && /sbin/clock -w



time server 설정시 크론의 내용을 확인하여 작동이 되지않을 경우에는 /etc/services 내의 time관련 서비스 항목의 주석제거할것....



방법#2 부팅시마다 적용하기 위해 /etc/rc.d/rc.local에 설정



### Time Server Setting

/usr/bin/rdate -s time.bora.net

/sbin/clock -w



14. cron에 local 백업설정 (가능한 새벽 04:00)



15. cron에 시스템 점검 실행 설정 system_check (가능한 아침 08:00)



16. 불필요한 process 제거



17. ntsysv 에서 초기 실행할 서비스데몬 내리기



18. 로그인정보수정 및 리눅스버전정보 숨기기



/etc/motd

/etc/issue

/etc/issue.net

/etc/redhat-release



############################ 경고 ################################



지금 접속하신 귀하의 정보들은 이미 다른 서버로 원격저장 되었습니다.



불필요한 접속을 하셨다면 지금 로그아웃 하십시요.



허용되지않은 불법적인 접속으로 인한 모든 법적인 책임은 접속자에게



있습니다.



------------------------- for login user -------------------------



It will be punished for illegal login to this system.



It is saved for login information in another system.



####################################################################





19. root소유의 SetUID, SetGID 명령어 퍼미션수정및 불피요한 것일 경우에 삭제

찾는 방법 : find / -user root -perm -4000 -print



20. systemfiles들 로컬복구를 위한 별도저장

저장위치 : /backup/systemfiles/



21. chkrootkit 설치및 실행결과 확인



22. 시스템 performance및 hacking보안을 위한 kernel option값 설정

(리스트 작성하여 적어둘것....)



23. 마지막에는 tripwire 설치 및 초기화 설정



24. 커널옵션값 설정 (/etc/sysctl.conf 수정)



/etc/sysctl.conf 파일에 아래 설정들을 복사하여 넣어두면



########## 커널옵션 튜닝값들 ################

net.ipv4.icmp_echo_ignore_broadcasts = 1

net.ipv4.icmp_ignore_bogus_error_responses = 1

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 180

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_syn_backlog = 1280

net.ipv4.tcp_sack = 0

net.ipv4.tcp_window_scaling = 0

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.all.rp_filter = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.all.log_martians = 1

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.ip_local_port_range = 32768 61000

net.ipv4.ip_forward = 0

vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

vm.buffermem = 80 10 60

kernel.sysrq = 1



##선택사항

net.ipv4.icmp_echo_ignore_all = 0

fs.file-max = 32768

### RAM 256M :8192

########## 커널옵션 튜닝값들 ################







직접명령어를 사용할 경우에 다음과 같은 명령어로 커널값설정한다.

주의) 오른쪽의 값이 두개이상되는 것들은 입력이 안됨.(방법찾아볼것)



#!/bin/bash



sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1

sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1

sysctl -w net.ipv4.tcp_fin_timeout=30

sysctl -w net.ipv4.tcp_keepalive_time=180

sysctl -w net.ipv4.tcp_timestamps=0

sysctl -w net.ipv4.tcp_syncookies=1

sysctl -w net.ipv4.tcp_max_syn_backlog=1280

sysctl -w net.ipv4.tcp_sack=0

sysctl -w net.ipv4.tcp_window_scaling=0

sysctl -w net.ipv4.conf.all.accept_redirects=0

sysctl -w net.ipv4.conf.all.send_redirects=0

sysctl -w net.ipv4.conf.all.rp_filter=1

sysctl -w net.ipv4.conf.default.rp_filter=1

sysctl -w net.ipv4.conf.all.log_martians=1

sysctl -w net.ipv4.conf.all.accept_source_route=0

sysctl -w net.ipv4.ip_forward=0

sysctl -w kernel.sysrq=1

sysctl -w net.ipv4.icmp_echo_ignore_all=0

sysctl -w fs.file-max=16384

########################################################



25. httpd.conf 파일 수정



-- Options 항목에 Indexes 모두 제거



--- 아래행 추가

## *.inc 파일을 웹에서 불러들이지 못하는 설정

## 수퍼유저코리아 박성수(papa@superuser.co.kr)

## 2003년 5월 30일



Order allow,deny

Deny from all





--- 아래행 추가

## *.log 파일을 웹에서 불러들이지 못하는 설정

## 수퍼유저코리아 박성수(papa@superuser.co.kr)

## 2003년 5월 30일



Order allow,deny

Deny from all





26. 아파치 cgi 실행옵션제거



Options 부분에서 ExecCGI 제거 고려할 것.

AddHandler cgi-script .cgi 주석제거



27. 서버설치 직후에 모든 파일시스템의 badblock을 점검한다.



- mount 를 해서 파티션의 정보를 확인한다.

- badblocks -v -o 파티션명.txt 파티션명

(예 badblocks -v -o sda1.txt /dev/sda1

- 시간이 많이 걸리므로 shell 파일을 만들어서 작업한다.

(예 badblocks.sh)

#!/bin/bash

badblocks -v -o sda1.txt /dev/sda1

badblocks -v -o sda2.txt /dev/sda2

badblocks -v -o sda3.txt /dev/sda3



작업이 끝난 후에 배드블럭이 존재하는 디스크는 반드시 교체한다.



28. httpd.conf파일을 이용하여 기본적인 아파치웹서버보안을 설정한다.



- Options 지시자중 Indexes를 제거한다.



- Options 지시자중 FollowSymLinks를 제거한다. : 심블릭링크파일의 설정을 허용하지 않는다. 예)/home/sspark09/www/linkfile 이라는 파일이 ln -s /home/sspark/09/www/linkfile /etc/passwd라는 링크파일일 경우에 웹에서 linkfile을 로딩했을 경우에 /etc/passwd의 파일내용을 볼 수 있다. SymFollowLinks라는 지시자가 없을 경우에는 이런 링크파일의 사용을 웹에서는 허용하지 않는다.



- Options 지시자중 IncludesNoExec옵션을 추가한다. 이는 SSI의실행 태그중 exec나 cmd를 실행하지 못하게 한다.



- CGI는 특정 디렉토리에서만 실행가능하도록 설정한다. 게시판등에서 cgi실행파일을 웹서버에 올려두고서 이를 실행하게 되면 시스템의 정보가 쉽게 유출이 될 수 있다. 이를 막기 위하여 다음 예와 같은 설정으로 특정 디렉토리에서만 cgi가 실행가능하도록 한다.

ScriptAlias /cgi-bin/ "//usr/local/apache/cgi-bin/"



- ServerTokens는 Apache서버에 접속했을 경우에 응답메시지의 헤더에 웹서버 버전, 설치된 응용프로그램등과 같은 정보를 전달한다. 이 정보들은 공격자들에게는 웹서버의 버전정보등을 유출함으로서 서버해킹을 용이하게 하는 문제를 야기할 수 있다. ServerTokens Full 이라고 되어 있다면 제거하고 ServerTokens Prod로 추가또는 수정한다. 기본적으로 ServerTokens키워드는 Apache 1.3이상에서 사용가능하며 일반적으로는 httpd.conf에 설정이 되어있지않다. 설정되어 있지 않을 경우에는 Full의 적용을 받게 되므로 전달가능한 모든 정보를 전달한다. 이를 ServerTokens Prod를 추가또는 수정함으로서 정보유출을 막을 수 있다.



- 웹서버 구동중에 문제나 에러발생시(401, 403, 404등)에 보여줄 에러페이지를 redirect하여 원하는 페이지를 보여줄 수 있도록 한다. (광고나 홍보들을 위한 수단으로 사용한다.)

linux /var/log information

/var/log/xferlog : FTP 접속 관련 작업을 기록하고 있다. 외부에서 파일을 다운로드 하거나 업로드한 경우, 누가 어떤 파일을 올리고 받아갔는지 그 자세한 내역을 알수 있다.

/var/log/netconf : 파일은 바로 netconf 유틸리티를 이용해서 작업한 결과를 저장하는 로그 파일이다.
/var/log/secure : 모든 접속과 관련하여 언제 어디서 어떤 서비스를 사용했는지 기록하고 있다.
/var/log/maillog : sendmail의 메일 관련 작업을 기록 하고 있다.
/var/log/dmesg : 시스템 부팅시 나왔던 메시지들을 기록하고 있는 로그 파일이다.
/var/log/lastlog : 가장 최근에 telnet을 이용하여 접근 혹은 접속한 흔적을 기록하고 있다.
(단, 이 파일은 바이너리 이미지 파일로서 사용자들이 이 파일을 열어서 확인 할 수 없고, 명령 프롬프트에서 lastlog 라는 명령어로 확인할 수 있다.)

/var/log/boot.log : boot messages 를 /var/log/boot.log 파일에 기록한다.
/var/log/spooler : uucp, news의 crit 정보를 파일에 기록한다.
/var/log/cron : cron 관련 모든 로그는 기록한다.
/var/log/emerg : 현재 로그인한 모든 사용자에게 알린다.
/var/log/maillog : 메일 관련 모든 로그 기록한다.
/var/log/messages : mail



http://www.itbankac.com


리눅스 로그 파일에 대한 정리



1 로그 파일 정의
System이 booting할 때부터 종료할 때까지 작동중인 모든 상황을 별도의 파일로 만드는 것을 로그라 하고 이러한 기록이 저장되는 파일이 로그 파일이다.
이러한 다양한 로그 파일들은 주로 시스템 감시에 사용되는데, 시스템의 로그파일을 분석하거나 관련 로그 파일을 확인해서 현재 시스템의 상태를 체크할 수 있다.
또한 로그 파일은 각종 service, 주로 네트워크 서비스에 대한 접속 정보를 간직하고 있는데,이러한 접속 정보를 이용해서 시스템 관리자들은 자신이 관리하는 시스템의 각종 환경과 작동 상태 등을 확인하고 검사할 수 있다.
이러한 로그 파일은 특히 보안에 중요한데, 현재 시스템에 접속중인 사용자가 허가된 사용자인지 아니면 허가되지 않은 사용자인지 확인할 수 있고 동시에 시스템에 계정을 가진 사용자가 시스템에서 무슨 일을 하는지도 확인이 가능한 것이 바로 로그 파일이다.
30. 2 로그파일 기본 위치 : /var/log/*
[root @edu /var/log]# ls
XFree86.0.log cron.1 maillog netconf.log secure statistics
XFree86.9.log cron.2 maillog.1 netconf.log.1 secure.1 vbox
boot.log dmesg maillog.2 netconf.log.2 secure.2 wtmp
boot.log.1 htmlaccess.log messages news spooler wtmp.1 …..
명령행 프롬프트에서 ls라는 명령을 실행하면 해당 디렉토리안의 파일들의 목록을 보여준다.
/var/log 디렉토리에는 다양한 유형의 로그 파일들이 있는데 먼저 Xfree86.log는 Xfree86관련 로그를 기록하고 있으며 로그를 0부터 기록하고 있다.
다음 boot.log는 부팅 관련 로그를 저장하는 파일이며 cron은 서버의 주기적인 작업을 처리하는 cron 데몬의 로그를 기록하는 파일이다.
dmesg 파일은 시스템의 부팅 메시지를 저장하고 있는 파일이며 시스템 사용자는 부팅 후에 명령 프롬프트에서 dmesg라는 명령을 이용해서 시스템의 부팅 메시지를 볼 수 있다.
==>more


maillog는 메일 관련 로그를 저장하고 있는 파일이며 netconf는 리눅스 통합 설정 툴인 linuxconf라는 유틸리티의 모듈로 존재하는 netconf라는 유틸리티가 남긴 로그를 간직하고 있는 파일이다.
그리고 messages라는 파일은 시스템의 전반적인 기록이라고 보면 되는데, 시스템 작동 중에 발생하는 여러 유형의 기록을 저장하는 파일이며 일반적으로 tail 명령어에 옵션 ?f를 인자로 주어 실행을 하는데, 이 명령을 실행하면 시스템의 각종 기록들을 실시간으로 볼 수 있는 기능을 제공한다.
다음 secrue라는 파일은 기본적으로 접속관련 기록을 남기는 파일이며 이때 인증이 필요하다.
시스템 사용자가 외부에서 접속을 했을 때 모든 기록이 바로 이 파일에 기록이 된다.
그 외 news, statistics, wtmp 등 다양한 로그를 저장하는 파일들이 있는데, 사용자들은 이러한 로그 파일들이 어떤 정보를 저장하는지 알아 둘 필요가 있다.

3. 로그파일 관리 - logrotate
일반적으로 로그란 메시지를 말하는 것으로 시스템에 로그가 쌓이는 것을 막기 위해 시스템에서 일정 조각씩 숫자로 나누어 저장을 하는데 이것을 담당하는 유틸리티가 바로 logrotate라는 유틸리티이다.
즉, logrotate라는 유틸리티를 이용해서 시스템의 다양한 로그를 관리하고 로그를 관리하는 설정을 할 수 있다.
또한 시스템을 좀더 쉽고 편하게 관리하며 크고 많은 로그파일을 순환시키고, 압축하고, 지정 위치로 옮기는 등의 작업을 지원 기능을 제공하는 유틸리티가 바로 logrotate이다.
.
1) 관련 파일
logrotate유틸리티 관련 파일이 무엇이 있는지 그리고 그러한 파일들이 어떤 역할을 하는지 알고 있어야 logrotate 유틸리티 설정을 쉽게 할 수 있을 것이다.
실제로 logrotate 유틸리티는 rpm 패키지로 제공되고 있으며 시스템 사용자는 이러한 패키지를 이용하여 logrotate 유틸리티에 대한 세부적인 사항을 알 수 있을 것이다.
먼저 rpm 명령의 사용법을 알고 있어야 이러한 패키지를 구성하는 파일들을 쉽게 추출할 수 있을 것이다.






[root @edu /var/log]# rpm -ql | grep logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/man/man8/logrotate.8
/usr/sbin/logrotate
명령행 프롬프트에서 rpm 명령을 이용하는데 특정 패키지에 포함된 파일을 보기 위한 옵션이 ?ql이다.
q는 querry의 의미로 질의를 던진다는 의미이며 l은 리스트의 의미로 옵션 ?ql은 특정 패키지를 구성하고 있는 파일을 모두 볼 수 있게 하는데, 화면에서 보는 것처럼 환경 설정 파일들은 /etc 디렉토리 아래에 존재하고 있다는 것을 알 수 있다.
먼저 /etc/cron.daily 디렉토리는 서버의 주기적인 작업을 처리하는 cron 데몬이 매일 처리할 작업을 저장하는 디렉토리이며 사용자가 매일 수행하고 싶은 작업이 있다면 바로 이 디렉토리 아래 설정을 해주면 매일 작업을 처리하게 된다.
사용자에 따라서는 cron 데몬을 달리 시스템 자동화 유틸리티라고 하기도 한다.
/etc 디렉토리에는 cron 작업을 주기적으로 처리하기 위한 기본 디렉토리가 있는데, cron.daily, cron.hourly, cron.monthly, cron.weekly 등이 바로 그것이다.
그리고 logrotate를 주기적으로 처리하기 위해 /etc/cron.daily라는 디렉토리에 logrotate 파일을 만들어 설정을 하고 있다.
내용을 보면 /usr/sbin/logrotate /etc/logrotate.conf라고 되어 있는데, 이는 /usr/sbin/logrotate를 실행을 하되 설정 파일인 /etc/logrotate.conf라는 파일을 참조하라는 의미이다.
다음의 /etc/logrotate.conf 파일은 파일이 의미하는 것처럼 logrotate 유틸리티의 설정 파일이다.
로그를 관리하기 위한 기본 설정을 하는 파일로 로그를 lotate하기 위한 시간 간격이나 backlog를 유지하는 기간을 설정하고 error를 어떤 계정 사용자에게 보내야 하며 특정 디렉토리인 /etc/logrotate.d를 포함하고 특정 파일에 대한 설정을 할 수 있는 기능을 제공한다.
다음의 /etc/logrotate.d 디렉토리에는 시스템 및 네트워크 서비스에서의 로그를 관리하기 위한 설정이 들어있다.
==>more



예를 들어 apache, linuxconf, mgetty, mysqld, named, samba, syslog 등의 파일들이 있으며 파일 이름이 의미하는 것처럼 각 서비스에 대한 로그 설정을 담고 있다.
다음 /usr/man/man8/logrotate.8은 logrotate 유틸리티에 대한 man page를 정의하고 있는 파일이며 파일의 경로를 보면 /usr/man/man8/logrotate.8에 있다는 것을 알 수 있으며 명령 프롬프트에서 man logrotate라고 입력을 하여 실행하면 logrotate에 대한 manual page의 도움을 받을 수 있고 여기에는 각 서비스에 대한 로그를 설정하는 내용이 자세히 해설되어 있다.
그리고 마지막으로 /usr/sbin/logrotate는 logrotate를 실행하는 경로를 지정하는 것인데
일반적으로 logrotate 유틸리티가 rpm으로 제공되고 있기 때문에 /usr 디렉토리에 설치가 되고 실행을 할 수 있는 실행 명령어도 이 디렉토리에 위치하고 있다.
2) /etc/cron.daily/logrotate기본적으로 crontab에 의해서 매일 정기적으로 실행하도록 지정되어 있는데 앞에서 설명을 했지만 cron은 서버의 주기적인 작업을 처리하기 위한 데몬이고 사용자들은 분, 시, 일, 월, 요일 단위로 작업을 지정하여 실행을 시킬 수 있다.
일종의 시스템 자동화 유틸리티로 시스템에서 기본적으로 제공되는 디렉토리는 /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly, /etc/cron.weekly 등의 디렉토리와 기타 cron 관련 디렉토리가 있는데 여기에서 사용자들은 각 해당 디렉토리에 처리할 작업을 처리하고 싶은 주기에 맞추어 파일로 생성하여 작업을 지정하면 된다.
실제로 /etc/cron.daily에는 여러 가지 설정이 되어있는데, 여기에서 logrotate 파일의 내용을 보면 /usr/sbin/logrotate /etc/logrotate.conf라고 되어있다.
즉, logrotate 실행 파일을 실행을 시키되 참조할 파일은 /etc/logrotate.conf라는 파일의 설정을 참조하라는 의미이다.
즉, /etc/cron.daily 디렉토리에 logroate가 지정되어 주기적으로 작업을 처리하도록 설정되어 있다.
일반적으로 시스템의 로그파일이 클 때 시스템에 계속 쌓이게 되는데, 이러한 로그 파일들은 /etc/logrotate.conf.와 /etc/logrotate.d에서 설정을 변경하거나 또는 로그의 크기, 즉 size를 변경하여 관리할 수 있다.






3) /etc/logrotate.conf#see “man logrotate” for details
#rotate log files weekly
weekly
1주일 단위로 log rotate, weekly 뿐만 아니라 monthly나 hourly 등의 주기적인 시간 단위를 지정하여 로그를 관리하고 rotate하도록 할 수 있다.
#keep 4 weeks worth of backlogs
rotate 4
최대 4개까지 로그 순환하고 새로 생성한 로그 외에 이전의 로그를 3개까지 기록하도록 지정할 수 있다.
# send errors to root
errors root
에러가 있을 경우 root 계정으로 시스템의 에러 로그를 남기도록 설정한다.
# create new (empty) log files after rotating old ones
create
예전 로그를 순환한 후 새로운 로그 파일을 생성하도록 지정한다.
#compress
#압축여부를 결정하는데, 주석으로 처리되어 있으면 압축을 하지 않도록 지정되어 있는 것이다. 일반적으로 로그가 너무 크지 않으면 압축하지 않도록 지정한다.
#RPM packages drop log rotation information into this directory
include /etc/logrotate.d
#이 디렉토리에 설정되어 있는 log rotate 설정 파일도 같이 포함되어 실행되도록 지정한다.
일반적으로 이 디렉토리에는 apache, linuxconf, mgetty, mysqld, named, samba, squid, syslog, uucp, vgetty 등에 대해서 로그를 설정하도록 되어있으며 현재는 기본적으로 설정되어 있다.
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
/var/log/wtmp 로그 파일에 대한 설정인데 먼저 monthly는 매월마다 로그를 순환하도록 지정하고 파일을 생성할 때 664 모드의 퍼미션을 주도록 지정하고



있으며 root 소유로 해서 utmp라는 그룹 소유로 순환 후 즉시 생성하도록 지정하고 있다.
최대 1번까지 rotate를 허용하는데 이는 이전의 로그파일이 1개만 남도록 지정하는 것이다.
==>more
4) logrotate 설정 예
1> /var/log/messages 파일에 대한 설정
/var/log/messages {
rotate 5
weekly
postrotate // rotate 후 명령부분 실행
/sbin/killall -HUP syslogd
endscript
}
weekly 라고 지정하여 일주일 단위로 최대 5번까지 log rotate를 허용하고 있다.
rotate가 끝난 후 postrotate 명령부분을 실행하는데, /sbin/killall ?HUP syslogd를 실행한다.
이는 syslogd의 설정 파일을 수정했을 경우 바로 적용시키도록 하는 명령어이며
여기에서 killall은 시스템에 signal을 보내는 명령어이며 ?HUP는 설정된 내용을
적용시키라는 옵션으로 일종의 시그널 유형이다.2> /var/log/httpd/access.log 파일에 대한 설정
/var/log/httpd/access.log {
rotate 5
mail www@my.org
errors www@my.org
size=100k
sharedscripts
postrotate
/sbin/killall -HUP httpd
endscript
}




/var/log/httpd/access.log 파일에 대한 로그 설정이다.
/var/log/httpd 디렉토리에는 아파치 관련 로그들이 저장되는데 여기에서는 access.log에 대한 설정을 하고 있다.
rotate 5의 의미는 5번까지 로그를 순환시키라는 의미이고 5번째 rotate 되었을 때 4번째 로그를 www@my.org로 메일로 보내고 만약 에러가 있을 경우에도 같은 메일 계정으로 메일을 보내도록 지정하고 있다.
그리고 로그파일의 사이즈가 100K가 넘으면 rotate를 하고 rotate가 끝난 후 postrotate 부분의 /sbin/killall ?HUP httpd를 실행하라는 의미이다.

3> /var/log/news/*에 대한 설정
/var/log/news/* {
monthly
rotate 2
missingok
errors newsadmin@my.org
postrotate
kill -HUP `cat /var/run/inn.pid`
endscript
nocompress
}
/var/log/news/ 디렉토리 아래에 있는 모든 파일에 대해서 rotate를 설정한다.
매월을 단위로 log를 rotate하는데, 만약 log파일이 없어도 에러를 발생하지 않도록 지정한다.
rotate 끝난 후에는 postrotate 부분의 kill ?HUP `cat /var/run/inn.pid` 명령어를
실행한다..
그리고 로그는 압축을 시키지 않는다.

4. syslogd로 로그 관리
syslogd의 환경설정 파일은 /etc/syslog.conf이다.
이 파일의 일반적인 형식은 facility.level 실행할 action의 순서로 설정을 지정한다.
1) facility
facility는 메세지를 보내는 프로그램의 유형을 말하는데, 여러 개의 facility를 지정할




경우는 ,로 구분하여 사용한다.
facility 뒤에 .none를 사용하는 경우가 있는데, 이는 해당 facility를 제외하겠다는
의미이다.
예를 들어 mail.none은 메일 관련 메시지를 제외하겠다는 의미이다.
==>more
일반적으로 facility의 종류에는 다음과 같은 것들이 있다.
auth ? 로그인 등의 인증 프로그램 유형이 발생한 메시지
authpriv - 개인인증을 요구하는 프로그램 유형이 발생한 메시지
cron - cron이나 at과 같은 프로그램이 발생하는 메시지
daemon - telnetd, ftpd등과 같은 데몬이 발생한 메시지
kern ? 커널이 발생한 메시지
lpr ? 프린터 유형의 프로그램이 발생한 메시지
mail ? 메일시스템에서 발생한 메시지
news - 유즈넷 뉴스 프로그램 유형이 발새?ㄴ 메시지
syslog - syslog 프로그램 유형이 발생한 메시지
user - 사용자 프로세스
uucp - uucp 시스템이 발생한 메시지
local0 - local7 - 여분으로 남겨둔 유형
2) level
다음은 level의 종류들이며 일반적으로 위험 레벨이 낮은 것부터 순서대로 나열되어있다.
debug ? 프로그램을 디버깅할 때 발생하는 메시지
info ? 통계나 기본 정보 메시지
notice - 에러는 아니지만 특별한 주의가 필요한 메시지
warning - 주의를 요하는 경고 메시지
err, error - 에러가 발생하는 경우 메시지
crit - 크게 급하지는 않지만 시스템에 문제가 생기는 단계의 메시지
alert!!!! - 즉각적인 조치가 필요한 상황
emerg - 모든 사용자에게 전달되어야 하는 위험한 상황




3) 로그관리(syslogd) 설정
1> 모든 facility나 priority를 지정하려면 * 를 사용한다.
2> 여러 개를 지정하려면 , 를 사용하여 나열한다.
3> priority를 지정하면 그와 같은 priority부터 그 위의 priority에 관련된 로그를 기록한다.
4> info를 지정하면 emerg부터 info사이의 모든 로그를 기록한다.

4) syslog의 action 설정
file : 파일에 내용을 추가한다.
@host : 지정된 호스트로 보낸다.
user : 지정된 사용자의 스크린으로 메시지를 보낸다.
공백 : 현재 로그인된 모든 사용자의 스크린으로 보낸다.
5. syslog 설정 파일의 실제 예
# 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;news.none;authpriv.none /var/log/messages
모든 info를 /var/log/messages 파일에 기록한다.
단 여기서 mail, news, authpriv 관련 기록은 제외한다.
# The authpriv file has restricted access.
authpriv.* /var/log/secure
모든 로그인 인증 관련 기록은 /var/log/secure 파일에 저장한다.
특히 su나 login등을 모두 여기 기록하여 log 파일 분석시 활용한다.
# Log all the mail messages in one place.
mail.* /var/log/maillog
메일 관련 모든 로그는 /var/log/maillog 파일에 기록한다.
# Log cron stuff

리눅스 관리자가 알아두어야 할 50가지

리눅스 관리자가 알아두어야 할 50가지


리눅스 시스템 관리자가 되기 위해서는 많은 것을 알아두어야 한다. 시스템 관리자의
관리 여하에 따라 많은 사람들의 시스템 장애를 초래할 수 있기 때문이다. 물론 시스
템 관리자가 모든 것을 미리 예방할 수 없다. 하지만 불가피한 상황을 제외하고는 시
스템이 정상적으로 작동되도록 해야한다.

이번호에는 시스템, 네트워크, APM, 메일, 보안, 장애발생시 복구등에서 일어날 수 있
는 시스템 관리자의 행동요령에 대해 알아볼 것이다. 시스템 관리자는 항상 모니터와
키보드아 함께 한다는 사실을 기억해야 한다.


[ 막강한 시스템 길들이기 ]



1. 바이오스 타이머 조정

시스템이 네트워크에 연결되어 있다면, 다음과 같이 한국 표준시간 서버에서 표준시간
을 받아서 설정할 수 있다.

# rdate -s time.kriss.co.kr

시스템이 온라인 상태가 아니라면 아래와 같이 수동으로 설정할 수도 있다.

# date -s "1999-12-30 22:22:40"

위와 같이 실행하면 실행할 때만 적용되므로 이후 시간이 늦어지는 것을 막기 위해서
는 주기적으로 변경 가능하게 크론(/etc/crontab)에 설정하는 것이 좋다.



2. .profile과 rc.local의 차이

.profile은 로그인시 적용되는 내용들이고, rc.local은 시스템 부팅시 실행해야 할 것
들을 적어 놓은 것이다. 사용자 홈디렉토리의 .profile이 /etc에 있는 설정 파일보다
우선하기 때문에 홈 디렉토리에 .profile에 패스를 설정해주거나 쉘환경 파일 등을 설
정해주면 계정 내에서 적용이 된다. rc.local에는 부팅시 가장 마지막에 실행되므로
일반적으로 부팅시 실행되어야 할 데몬 등을 적어준다.



3. 커널 컴파일시 시스템 자원 확인법

리눅스 시스템의 자원정보는 proc 파일시스템 구조를 통해서 알 수 있다. 이는 실제로
디스크 용량을 차지하는 파일들이 아닌 가상의 디렉토리 구조이며 리눅스 커널에 의
해 사용되는 시스템의 정보를 담는 곳으로 사용된다. 다음의 위치에서 하드웨어에 대
한 정보 및 시스템 관련 정보들을 확인할 수 있다.

-------------------------------------------------------------------------------
/proc/cpuinfo | CPU의 정보
-------------------------------------------------------------------------------
/proc/interrupts | interrupt 할당 정보
-------------------------------------------------------------------------------
/proc/ioports | I/O 포트 할당 정보
-------------------------------------------------------------------------------
/proc/devices | Character, Block 장치명
-------------------------------------------------------------------------------
/proc/swaps | 활성화된 스왑영역 정보
-------------------------------------------------------------------------------
/proc/meminfo | 물리적인 램용량, 램 사용량, 스왑 사용량 등
-------------------------------------------------------------------------------
표 1. proc 파일 시스템 구조를 통한 시스템 자원 정보

위와 같이 관련된 정보에 해당하는 파일 이름이 존재한다. 이 파일들은 텍스트 포맷이
므로 cat 명령을 통해서 확인할 수 있다.



4. vi 에디터로 유닉스에서 도스상의 ^M 문자 없애기

^M 문자를 공백으로 치환하면 된다.

:1,$s/^M//g



5. 특정 rpm 패키지의 설치 여부 확인

# rpm -qa | grep 패키지 명으로 확인할 수 있다.



6. RPM(Redhat Package Manager)에서 특정 패키지 복원시키기

rpm2cpio filename.rpm | cpio -I -make-deretories -E filename



7. TCP Syn Flooding 공격 대처방법 ==>관련정보사이트

Tcp Syn Flooding은 웹으로의 공격이 대부분이므로 syn_recv 프로세스가 일정 개수가
넘게 되면 아파치를 재시작한다. 지속적인 공격일 경우 대처 방안으로 두 가지 방법이
있다. 첫째, sysctl -a | grep syn_backlog으로 확인 후 backlog를 늘려주거나 둘째,
sysctl -a | grep syncookies로 확인 후 syncookies의 값을 1로 바꾸어준다. syn_bac
klog의 값을 조정해주는 방법은 다음과 같다.

# 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



8. TCP Syn Flooding 공격 대처방법

Umount시 위와 같은 메시지가 나는 것은 unmount하려는 디렉토리에서 실행되고 있는
프로세스가 있기 때문이다. 예로 /tmp 디렉토리를 umount 시키려 할때 위의 메시지가
뜨는 경우 mysql.socket파일이 /tmp에 있는 경우를 들 수 있다. 이 경우에는 해당 파
일시스템에서 실행중인 프로세스를 제거해야 하나 일일이 제거가 번거로우므로 Fuser
에서 -k 옵션을 사용하면 간단히 해결할 수 있다.

Fuser -k 장치명



9. setuserid

디렉토리나 파일 퍼미션 중 setuid는 소유자의 권한을 잠시 빌려 실행 후 권한을 돌려
주고 실행을 마치게 되는데 실행도중 인터럽트가 발생한다면 정상적으로 권한을 반환
하지 못하게 되어 소유자의 권한을 그대로 가지고 있게 된다. 이때 파일의 소유자가
루트였다면 이것은 보안에문제가 될수 있으며 이런 점을 이용해 해킹에 많이 사용된
다. Setuid가 걸여 잇는 파일 중에 실행권하이 있으며 루트권한일 경우에는 위험하다.
특정 디렉토리에서 setuid가 걸려있는 파일을 찾으려면 find /usr -perm 4775와 같이
perm 옵션으로 찾을 수 있다.



10. bash_profile 변경 후 변경된 내용을 유효하게 만들기

다음과 같이 ~/.bash_profile를 실행해서 변경이 적용되도록 한다.

# source ~/.bash_profile



11. root 패스워드를 잊어 버렸을때 다시 세팅하는 방법

리눅스 시스템을 재부팅하고 lilo가 뜨면 ''linux single''로 부팅한다. Tab 키를 누르
면 등록되어 있는 라벨이 모두 보이므로, 여기에서 선택하도록 한다. 부팅 후 쉘 명령
어 화면에서 /etc/passwd 파일에서 암호 부분을 삭제하거나 passwd를 실행하여 루트의
패스워드를 새로 설정해 준다.

# passwd root

위의 명령을 입력한 후 변경할 패스워드를 입력하면 된다.



12. 파티션을 나누는 이유와 기준

보통 파티션을 나누는 것에 대해서 별다른 고려없이 /로 모든 것을 잡아서 설치하는
경우가 종종 있다. 이럴 경우 설치시 편리하지만, 나중에 파일시스템에 문제가 생기거
나 효율적으로파티션을 관리하기에는 많은 어려움이 있다. 파티션을 나눌때는 어떤
용도로 쓸것인지에 대해서 충분히 생각한 후 파티션을 해야 한다. 다음은 9.1GB 스카
시 하드디스크를 기준으로 웹 서버에서 이용될 서버에 대해 파티션한 경우의 예다.

-------------------------------------------------------------------------------
/boot | 30M | boot에 필요한 booting 지원 파일들이 있다.
| | 커널 컴파일시 1MB 씩 늘어난다는 것을 염두해 둔다.
-------------------------------------------------------------------------------
/ | 1000M |
-------------------------------------------------------------------------------
/usr | 2000M | 리눅스에서 사용되는 모든 application 및 시스템 파일들이 위치
| | 하고 있으며, library 파일과 실행파일이 존재한다.
-------------------------------------------------------------------------------
/var | 1000M |
-------------------------------------------------------------------------------
/tmp | 200M |
-------------------------------------------------------------------------------
/home | | 나머지 모두 웹 서버 용도로 사용한다면 home 부분에 자료가
| | 많아질 것이므로 home에 용량을 더 많이 배분했다. 이렇게 파티션
| | 을 나눠주면 서비스 거부 공격 방어, SUID 프로그램에 대한 보호,
| | 빠른 부팅속도, 백업과 업그레이드 등 관리의 편리성, 마운팅된
| | 파일 시스템에 대한 제어 가능성의 증대, 각 파일 시스템에 대한
| | 효율적인 제한이 가능하다는 이점이 있다.
-------------------------------------------------------------------------------
표 2. 9.1GB 스카시 하드디스크를 기준으로 한 웹 서버 파티션의 예

==>관련정보사이트

13. 기존의 ext2파일시스템과 저널링 파일시스템인 ext3, Reiser의 비교

-------------------------------------------------------------------------------
최대 파일사이즈 | ext2 | Journalling filesystem
| |---------------------------------------------
| | ext3 | Reiser FS
-------------------------------------------------------------------------------
최대저장용량 | 2TB (지원으로 | 4TB | 4GB of blocks, 16Tb
| 4TB까지 가능) | |
-------------------------------------------------------------------------------
블럭사이즈 | 1KB | 1KB - 4KB | Up to 64KB Currently
| | | Fixed 4KB 필요할 때마다
| | | 정확한 사이즈 할당가능
-------------------------------------------------------------------------------
최대 파일사이즈 | 2GB | 2GB | 4GB, 2^10 Petabytes in
| | | ReiserFS(3.6.XX)
-------------------------------------------------------------------------------
장점 및 단점 | 성능위주, 20KB | 파일복구 능력 | 공간저약 효과,
| 저장에 유리, | 뛰어남, 항상 로그 | 속도향상
| access 속도저하| 남기므로 속도 저하|
-------------------------------------------------------------------------------
표 3. ext2, ext3, Resiser의 특징 및 장담점

/var 디렉토리와 같이 항상 새로운 자료가 쌓이는 곳은 안정성이 우선시 되므로, ext3
파일시스템이 유리하며, /usr와 같이 내용 변화 없이 빠르게 액세스하여 쓸 수 있어야
하는 부분은 ext2 시스템을 이용하여 성능에 초점을 두면 좋을 것이다.
==>관련정보사이트


14. 기본 데이터 블럭 사이즈 1024KB와 4096KB의 차이

1024KB인 경우에는 블럭이 작은 만큼 4096KB보다 하드의 낭비가 적다. 1023KB의 데이
터를 저장하는 경우, 기본 블럭사이즈가 1024KB일 때는 1K 공간이 사용되지만, 4096KB
가 기본 블럭이라면 4K를 차지하게 된다. 하지만 아주 작은 파일들이 많은 경우 해당
데이터를 액세스하는 데는 1024KB가 4096KB보다 더 걸리게 되므로 퍼포먼스가 급격히
떨어지게 된다. 따라서 자신이 이용하는 시스템의 특성과 용도에 맞게 블럭 사이즈를
지정해서 사용하면 된다.



15. RAID

RAID는 ''Redundant Array of Inexpensive (or Independant) Disks''의 약어다. RAID 시
스템은 여러 드라이브의 집합을 하나의 저장장치처럼 다룰 수 있게 하고, 장애가 발생
했을 때 데이터를 잃어버리지 않게 하며 각각에 대해 독립적으로 동작할 수 있도록 한
다.



16. RAID 레벨 1과 레벨 5의 특성

시스템의 다운, 데이터 손실에 대비하여 보통 여러가지 RAID 레벨 중에서 1과 5번 방
법을 많이 사용한다.

RAID 1(mirroring)의 특징은 빠른 기록 속도와 함께 장애복구능력이 있다는 것이다. 2
대의 드라이브만으로 구성할 수 있기 때문에 작은 시스템에 적합하다. 읽을 똑같은 하
드가 복제되고 있으므로, 시스템에 문제 발생시 서비스 지연시간이 매우 짧아서 웹 서
비스를 하는 곳에서 유용하게 쓸 수 있다. 하지만 한 하드의 내용이 또 다른 하드에
똑같이 복사되므로 하드용량의 낭비가 심하다.

RAID 5(distributed parity)는 작고 랜덤한 입출력이 많은 경우 더 나은 성능을 제공
한다. 빠른 기록 속도가 필수적이지 않다면, 일반적인 다중사용자 환경을 위해 가장
좋은 선택이다. 그러나 최소한 3대, 일반적으로는 5대 이상의 드라이브가 필요하다.
변경된 내용이 있을 경우 그것만 기록한다. 일반적으로 RAID 1은 ECC 계산을 하지 않
으므로 RAID 5보단 빠르고, RAID 5는 하드 공간을 좀 더 여유있게 쓸 수 있다는 장점
을 지닌다. ==>관련정보사이트



17. 백업 계획 및 정책 수립의 요소와 Full 백업과 Incremental 백업

먼저 시스템의 전체 용량이 어떻게 되고, 그 중에서 백업할 가치가 있는 것은 어떤 부
분인지를 결정한다. 사용할 백업 장비와 종류를 알아보고, 총 백업 시간과 어느 정도
부하가 걸리는지 예상해보고 테스트해 본 후 마지막으로 백업 스케줄을 정한다. Full
백업은 백업할 자료를 처음부터 끝까지 다 기록하는 것이고, Incremental 백업은 이전
의 데이터와 비교해서 새로 추가된 내용만 백업하는 방법이다. 따라서 Full 백업시 완
전히 데이터를 백업할 수 있지만 시간이 많이 걸리고, 시스템에 부하를 초래할 수 있
는 반면에 Incremental 백업은 빠른 시간내에 백업을 할 수 있지만, 백업하는 시간에
따라 데이터가 완전히 백업되지 못할 경우도 있을 수 있다.



18. SNMP의 의미와 구성요소

SNMP는 ''Simple Network Management Protocol''의 약자다. 네트워크에 연결되어 있는
장치에서 네트워크에 관련된 정보를 모으고 문제점 등을 보고할 수 있는 기능을 제공
하는 프로토콜이다. 구성요소는 에이전트와 매니저가 있다. 이것은 서버/클라이언트
구조로서 에이전트가 서버에 해당되고, 매니저가 클라이언트에 해당한다. 에러가 발생
하는 경우는 선택한 장비에 SNMP가 Enable이 안되었거나, 네트워크에 문제가 있어서
모니터링 하려는 장비까지 프로토콜이 전송되지 않는 경우, community 값이 잘못 사용
된 경우 등이 있다.



19. 데몬을 실행하고 정지하기

/etc/rc.d/init.d이 디렉토리에 있는 서비스를 ''서비스명'' stop 또는 start 시키거나
재시작시킨다.



20. 사용자별로 하드디스크 사용 용량 설정하기

quota를 이용하면 된다. df 명령으로 사용자의 홈디렉토리가 있는 디바이스를 확인한다.

-------------------------------------------------------------------------------
filesystem 1k-blocks Used Available Use% Mounted on
/dev/sda5 3028080 878480 1995780 31% /
/dev/sda1 62217 7713 51291 13% /boot
/dev/sda6 2759260 2088820 530276 80% /home2
/dev/sdb1 8744304 6496724 1803388 78% /home3
/dev/sdc1 3529628 25597928 7905940 76% /home4
/dev/sda10 202220 6 191774 0% /tmp
/dev/sda7 1517920 1280648 160164 89% /usr
/dev/sda8 608724 426992 150812 74% /var

# edquota username

Quotas for user jhk1:
/dev/sda6: blocks in use: 47584, limits (soft = 0, hard = 0) /* 이부분에 설정*/
inodes in use: 4590, limits (soft = 0, hard = 0)
/dev/sda8: blocks in user: 4, limits (soft = 0, hard = 0)
inodes in use: 1, limits (soft = 0, hard = 0)
-------------------------------------------------------------------------------

Soft는 용량에 설정되어 있는 용량은 넘어도 어느 정도 여유가 있지만, hard 용량에
설정된 크기는 절대적이다. 따라서 hard 용량을 사용자는 넘을 수 없다. 일반적으로 s
oft 용량을 hard 용량보다 조금 더 적게 설정해 놓는다. 쿼터 조정후 quotacheck /dev
/sda6를 해줘서 체크를 해 주도록 한다. ==>관련정보사이트



21. -(하이픈)으로 시작하는 파일 지우기

파일명이 하이픈(-)으로 시작하는 파일

-------------------------------------------------------------------------------
rm ./-filename 상대경로를 이용하여 파일명을 지정해줌
rm -- -filename --를 이용 그 이후에는 오는 ''-filename''이라는 파일이 옵션이
아닌 파일명이라는 것을 밝힘
-------------------------------------------------------------------------------

22. 사용하지 않은 가상 콘솔의 메모리 절약법

/etc/inittab에서 사용하지 않은 가상콘솔레벨을 주석처리 해주면 된다.

-------------------------------------------------------------------------------
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
-------------------------------------------------------------------------------



23. 시스템 지원 모니터링 툴

-------------------------------------------------------------------------------
시스템 자원 | 모니터링 툴
-------------------------------------------------------------------------------
CPU | top, ps, uptime, vmstat, pstree
-------------------------------------------------------------------------------
메모리 문제 점검 | free, vmstat 등
-------------------------------------------------------------------------------
메모리에 문제가 없다면 디스트 I/O 점검 | df, du 등
-------------------------------------------------------------------------------
표 4. 시스템 자원과 모니터링 툴

[ 주 의 ]
디스크와 메모리에 문제가 없는데도 시스템에 문제가 생기면 CPU의 오버 헤드에 문제
가 있을 가능성이 크다.



24. 사용자들이 사용한 명령어 알아내기

먼저 psacct라는 패키지가 필요하다. 설치되지 않은 경우 rpm이나 소스 등을 직접 설
치한다(대부분 배포본에 기본적으로 포함되어 있으므로 그대로 사용하면 된다). 다음
과 같이 명령하면 사용한 명령어를 확인할 수 있다.

-------------------------------------------------------------------------------
더미 로그 파일 생성(데이타를 기록할 파일 생성)
# touch /var/log/pacct
# /sbin/accton /var/log/pacct 체크를 시작하게 하는 명령어 실행
# lastcomm 사용자계정 사용자가 수행한 명령어 체크
-------------------------------------------------------------------------------



25. tar로 특정 경로에 특정 파일 압축 해제하기

tar xvfpz 압축파일 또는 .tgz -C 특정경로 특정파일의 절대경로(또는 파일명)로 입력
하면 된다. test.tgz 파일에서 /home/test/test.txt 파일을 /tmp 디렉토리에 압축해제
를 한다면, tar xvfpz test.tgz -C /tmp /home/test/test.txt와 같이 하면 된다.
==>관련정보사이트


26. ping 명령어 실행시 ttl정보

TTL이란 Time To Live의 약자다. 이것은 라우팅 에러로 인하여 데이터그램이 네트워크
를 영원히 떠돌아다니는 것을 방지한다. 라우터는 네트워크 간을 이동하는 데이터그램
의 TTL 필드를 감소시키며 TTL 필드가 0이 되는 데이터그램은 버린다(drop). IPv4 멀
티캐스트에서 TTL은 문턱값(threshold)의 의미를 지닌다.

다음 예를 보면 그 용도가 분명해진다. 회사에서 모든 호스트가 속하는 아주 길고 대
역폭에 한 부서가 대역폭을 많이 차지하는 인터넷 방송을 한다면, 랜에는 엄청난 용량
의 트래픽이 발생할 것이다. 인터넷 방송도 하길 원하지만, 멀티캐스트 트래픽 때문에
인터넷 전체가 마비되어서는 안된다. 멀티캐스트 트래픽이 라우터간을 얼마나 멀리까
지 이동할 것인지 제한할 필요가 있다. 이것이 TTL의 용도다.



27. 특정 IP에서 서버 접속 방지법

TCP Wrapper를 사용하는 방법과 ipchains를 사용할 수 있는데 커널 2.4버전부터는 ipt
ables을 사용한다. hosts.allow와 hosts.deny를 사용한다면, hosts.deny 파일에서 다
음과 같이 모두 제한을 한다.

-------------------------------------------------------------------------------
all : ALL
-------------------------------------------------------------------------------

hosts.allow 파일에서 허용할 IP를 여러 개 설정할 경우 다음과 같이 스페이스로 구분
하여 준다.

-------------------------------------------------------------------------------
all : xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx. xxx.xxx.xxx.xxx ...
-------------------------------------------------------------------------------

ipchains나 iptables의 경우에는 다음과 같이 설정하여 주면 된다.

-------------------------------------------------------------------------------
# ipchains ?A input ?s xxx.xxx.xxx.xxx ?j DENY
# ipchains ?A INPUT ?s xxx.xxx.xxx.xxx ?j DROP
-------------------------------------------------------------------------------


[ 안전한 네트워크 다지기 ]



28. 네트워크 설정법

시스템에 기본적으로 설치된 아래의 명령들을 사용하여 네트워크가 정상적으로 작동하
지 않은 경우 여러 가지 테스트를 해볼수 있다.

-------------------------------------------------------------------------------
ifconfig | 네트워크 인터페이스의 기본 설정에 관한 정보를 제공한다. 잘못된
| IP나, 서브넷 마스크 및 브로드 캐스트 주소를 확인하는데 효과적이다.
-------------------------------------------------------------------------------
arp | 이더넷/IP 주소의 변환에 관한 정보를 제공한다. 로컬 네트워크 내에
| IP 주소가 잘못 지정되었는지를 확인하는데 효과적이다.
-------------------------------------------------------------------------------
netstat | 네트워크 인터페이스, 네트워크 소켓, 네트워크 라우팅 테이블등에
| 대한 정보를 확인할 수 있다.
-------------------------------------------------------------------------------
ping | 원격 호스트가 도달 가능한지를 판단할 수 있다. 또한 패킷의 유실율과
| 전송 시간 등을 확인할 수 있다.
-------------------------------------------------------------------------------
nslookup | DNS 네임 서비스 관련 정보들을 확인할 수 있다.
-------------------------------------------------------------------------------
dig | 역시 네임 서비스와 관련된 정보를 제공하면, nslookup과 유사하다.
| BIND 버전의 확인 방법 및 각 도메인의 네임 서버를 확인하려면 다음과
| 같이 하면 된다.
|
| dig @네임서버이름 txt chaos version.bin. | grep VERSION
| dig @ns.도메인명 www.도메인명 위의 방법과 도메인을 등록 관리하는
| 업체에서 whois 검색을 도메인의 소유자 및 네임 서버 정보를 알아볼
| 수도 있다.
-------------------------------------------------------------------------------
traceroute | 원격 시스템까지 패킷이 진행되는 동안의 라우팅 홉(hop) 정보를 확인
| 할 수 있다.
-------------------------------------------------------------------------------
tcpdump | 네트워크를 통해 전달되는 각각의 패킷들을 분석할 수 있으며, 각 패킷
| 의 내용과 헤더 등을 분석하는 TCP/IP 프로토콜 분석 소프트웨어다.
-------------------------------------------------------------------------------
표 5. 명령어와 설정 내용 ==>관련정보사이트



29. 네트워크 정보로 이더넷 카드 IP 정보 재조정하기

/etc/sysconfig 디렉토리 밑에 하드웨어에 대한 정보가 나오는데 이더넷 카드가 여러
개 꽂혀 있다면 ifcfg-eth1, ifcfg-eth2 식으로 확인할 수 있다.

-------------------------------------------------------------------------------
/etc/sysconfig/network-scripts/ifcfg-eth0


# cat ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static /* 정적 아이피 */
BROADCAST=211.47.64.255
IPADDR=211.47.64.80
NETMASK=255.255.255.0
NETWORK=211.47.64.0
ONBOOT=yes /* 부팅시 자동인식 */
-------------------------------------------------------------------------------

사용하는 IP를 변경하거나, 새로운 네트워크 카드 추가시에는 ifcfg-eth0 파일을 수정
한 후에 반드시 ifdown ifcfg-eth0, ifup ifcfg-eth0 명령을 실행해 주어야 변경된 IP
가 적용된다. 또는 /etc/rc.d/init.d/network restart를 실행해주어도 된다.



30. 스위치와 라우터의 비교

-------------------------------------------------------------------------------
| 스위치 | 라우터
-------------------------------------------------------------------------------
사용용도 | 두개 이상의 동일 네트워크를 연결 | 동종 또는 이종 네트워크 미디어를
| 하는 LAN/WAN에 적합 | 사용하는 LAN/WAN에 적합
-------------------------------------------------------------------------------
OSI 모델 | 2계층(Data Link), 3계층(Network) | 3계층(Network)
-------------------------------------------------------------------------------
목 적 | 특수한 목적의 장비 | 일반 목적의 장비
| - 대역폭 확장을 위하여 LAN seg- | - 다른 수많은 어플리케이션의
| mentation 함 | 주소를 유연하게 디자인
| - 거대한 트래픽을 해결하기 위함 | Limit broadcast traffic
| - 낮은 지연율과 고성능의 출력 | Redundant active paths
| - 과업을 최적화 하기 위함 | WAN 액세스
| | - 일반적으로 거대한 트래픽을
| | 전송할 때 요구되지 않음
-------------------------------------------------------------------------------
동작방식 | MAC 주소를 추적하여 장비의 위치를 | 서로 다른 네트워크 계층 프로토
| 인식 목적지 MAC 주소에 기초하여 | 콜을 구분할 필요가 있고 프로토
| 전송하기 위한 목적의 장비 | 콜 지식은 보다 효과적인 전송
| | 결정을 할 수 있다.
-------------------------------------------------------------------------------
설치시 | 설치가 간단하고, 비용이 낮다. | 노드의 경로 설정에 필요한 초기
| 유지보수가 간단하다. | setup이나 IP 주소 및 네트워크의
| | 수정시 복잡
-------------------------------------------------------------------------------
비고 | 브리지와 비슷하나 훨씬 빠름 | 두개의 기본 기능
| - 더 작은collision domain으로 | - 각 네트웍 계층 프로토콜을 위한
| LAN을 분할 | 라우팅 테이블을 유지
| - 현재 사용되는 cable과 hardware | - 네트워크 계층 어드레스에 기반
| 를 그대로 사용 | 하여 각의각 프레임을 전송
| - Protocol transparent |
| - 쉽게 추가, 이동, 변경 가능 |
| - ASIC technology |
| - 통합된 넓은 bandwidth |
| - 저렴한 포트당 비용으로 고성능 |
| 제공 |



31. httpd.conf에서 ServerType를 standlone으로 설정하는 것과 inetd로 설정하는 것의 차이
==>관련정보사이트
아파치에만 적용되는 내용은 아니지만 standlone으로 설정한 경우에는 /etc/rc.d/rc.l
ocal나 /etc/rc.d/rc3.d/밑에 설정되어 데몬으로 실행되면, inetd로 설정할 경우 /etc
/inetd.conf에 추가되어 실행되어 텔넷이나 FTP와 같이 시스템프로세스로 실행되므로
접속이 많은 httpd인 경우 standalone으로 설정하여야 한다. 그리고 inetd로 설정시에
는 한정된 프로세스만 수용 가능하며 반응속도가 standalone방식에 비해 느리다.



32. 아파치에서 httpd.conf 수정 후 데몬이 뜨지 않은 경우 대처법

httpd -t 옵션으로 우선 syntax error부터 확인한 후 syntax error가 있으면 먼저 수
정을 해주고 Logs 디렉토리에서 에러 로그 파일을 확인하여 수정 후 재실행한다.



33. php 설치 후 버전 및 정상적인 설치 여부 확인법

php3 버전의 경우 index.php3을 php4의 경우 index.php라는 파일을 다음과 같은 내용
으로 작성하여 웹에서 열어보면 버전 및 연동 현황을 확인할 수 있다.

-------------------------------------------------------------------------------
phpinfo();
?>
-------------------------------------------------------------------------------



34. APM 연동 설치시 php를 모듈로 삽입하기

먼저 php설치 후 apache 컴파일시 php모듈 넣어서 재컴파일 해준다.

-------------------------------------------------------------------------------
./configure --prefix=/usr/local/apache --activate-module=sr/modules/php4/libphp4
.a
-------------------------------------------------------------------------------



35. 아파치에서 속도제한하기

아파치에서 bandwidth 모듈이 삽입되어 있는 상태라면 모든 호스트에 대해 1024byte로
속도를 제한하기 위해 아파치에서 설정해 주는 부분은 다음과 같다. Httpd.conf에서
BandWidthModule On라고 설정 후 BandWidth all 1024라고 설정한다.



36. 디렉토리 목록 출력 금지법

아파치에서 index.html 파일이 없을 때 디렉토리 목록 출력을 원하지 않을 경우에는 D
ocumentRoot 디렉토리쪽에 설정되어져 있는 옵션에서 Indexes를 삭제한다. 또한 특정
디렉토리에서만 인덱스를 허용치 않을 경우에는 특정 디렉토리의 .htaccess 파일안에
''Options -Indexes'' 이 부분을 삽입하면 된다.


안전한 메일 관리법



37. 센드메일에서 메일 용량을 제한하기

센드메일에서 한번에 보낼 수 있는 메일용량은 /etc/mail/sendmail.cf 파일에서 MaxMe
ssageSize 부분에서 다음과 같이 주석을 제거하고 바이트 단위로 설정을 해줄 수 있다
. 받는 메일 계정의용량은 Mlocal 부분에서 M=1000000 부분에서 바이트 단위로 제한
량을 적는다.

-------------------------------------------------------------------------------
MaxMessageSize=1000000
-------------------------------------------------------------------------------



38. 센드메일 데몬을 실행시 수신만하기

relay를 막는 방법도 있지만 그건 외부에서 로컬 서버를 SMTP로 사용하지 못하도록 할
수 있으며 iptables를 이용하면 로컬 서버에서 보내는 메일에 대해 제한이 가능하다.

-------------------------------------------------------------------------------
# iptables -A OUTPUT -p tcp --syn --dport 25 -j DROP

-A 기존의 iptables에 추가
-p 프로토콜
-dport 포트 넘버
-------------------------------------------------------------------------------

로컬에서 외부로 보내는 메일이라면 remote의 25번 포트로 접속이 되므로 OUTPUT 패킷
중 목적지 포트가 25번인 패킷만 drop한다. 메일 송수신은 tcp이므로 --syn을 추가하
지 않을 경우에는 3 way-handshaking에 의해 메일을 받을 수도 없게 되므로 반드시 --
syn을 추가해야 한다. 보내는 메일은 일단 메일큐 디렉토리에 저장된 후 발송되므로
메일큐 디렉토리를 삭제하거나 다른 이름으로 변경하면 메일을 발송할 수 없게 된다.
==>관련정보사이트


39. 릴레이 설정과 차단법

/etc/mail/access 파일에서 Relay 여부를 설정한다.

-------------------------------------------------------------------------------
localhost RELAY
-------------------------------------------------------------------------------

변경한 후 적용하려면 다음과 같이 실행해 준다. 또는 인증 기능(SMTP AUTH)이 지원되
는 최신 버전의 센드메일을 사용한다.

-------------------------------------------------------------------------------
# makemap hash /etc/mail/access < /etc/mail/access
-------------------------------------------------------------------------------



40. 특정시스템에 설치되어 있는 센드메일 버전 알아보기

간단한 방법으로 다음과 같이 텔넷으로 센드메일 포트인 25번으로 접속해보면 알 수
있다.

-------------------------------------------------------------------------------
# telnet jimy.tt.co.kr 25
-------------------------------------------------------------------------------



41. 다른 도메인의 웹마스터 계정 사용하기

가상 계정을 이용해서 해결할 수 있다. 아웃룩에서 jhk라는 계정을 설정하면 jhk@jung
heekim.co.kr, webmaster@jungheekim.co.kr로 오는 메일을 모두 받아 볼 수 있다.

-------------------------------------------------------------------------------
# vi /etc/mail/virtusertable

webmaster@jungheekim.co.kr jhk(jhk계정에 webmaster라는 계정이 가상계정으
로 설정)
-------------------------------------------------------------------------------



42. 웹메일 포워딩

해외에 출장이 잦은 사용자가 메일을 자신이 사용하는 웹메일로 포워딩해 달라고 하고
, 회사에 돌아와서도 포워딩된 메일을 아웃룩에서 다시 받아보길 원한다면 다음과 같
이 한다. 해당 사용자의 홈디렉토리 밑에 .forward 파일을 만들어서 이메일 주소를 입
력하고 자신의 계정에는 를 추가해 주어야 루프를 막을 수 있다.

-------------------------------------------------------------------------------
vi ~junghee/.forward

sitsme75@hanmail.net, junghee.kim@tt.co.kr
-------------------------------------------------------------------------------
==>관련정보사이트


43. 자동응답 메일 작성법

메일을 확인할 수 없는 상황일 때, 메일 수신 후 자동으로 미리 작성되어 있는 메시지
를 보낼 수 있는 방법(즉 자동응답 메일 작성 방법)은 자신의 홈디렉토리에 ".procmai
lrc" 파일을 만들고 다음의 내용을 입력한다.

-------------------------------------------------------------------------------
:0 h c
* !^FROM_DAEMON
* !^X-Loop: YOUR@EMAIL
| (formail -r -A"Prededence: junk"
-I"From: YOUR_NAME "
-A"X-Loop: YOUR@EMAIL
cat $HOME/autoreply.txt) | $SENDMAIL -t
-------------------------------------------------------------------------------

그리고 ''autoreply.txt'' 파일에 답변글을 작성햐면 그 내용이 자동 답변된다.



44. POP3 다운시 설정법

아웃록에서 메일을 받아보려고 하는데, POP3가 다운되어 반응하지 않을때 다음과 같이
조정한다. inetd는 기본적으로 1분에 fork 할 수 있는 인스턴스가 40으로 제한되어
있으므로 이 값을 늘려줘야 한다. POP3 부분에서 nowait.200이나 적절한 수만큼 늘려
주면 된다. nowait 뒤에 반드시 .(점)을 찍고 허용할 만큼이 POP 데몬의 수를 입력한
다. 이후 inetd를 재시작하면 적용된다.

-------------------------------------------------------------------------------
A # vi /etc/inetd.conf
# Pop and imap services et al
#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
#imap stream tcp nowait root /usr/sbin/tcpd imapd
-------------------------------------------------------------------------------


철통 보안 관리

45. 일반적인 리눅스 보안법

1) 현재 서버에서 사용하지 않고, 보안상 취약점이 있는 데몬에 대해 서비스를 중지
한다.
2) TCP Wrapper와 ipchains를 이용한다. 커널 2.4에서는 iptables를 이용해 각 서비
스에 대해서 접속을 허락하거나, 제한한다.
3) 새도우 패스워드를 반드시 이용한다.
4) su 권한의 사용을 특정 사용자만 가능하도록 정의한다.
5) 원격에서 루트 권한으로 접속할 수 없도록 한다.
6) 지속적으로 패치한다.

46. Ping 요청 무시하기

-------------------------------------------------------------------------------
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-------------------------------------------------------------------------------

다시 응답하게 하려면 다음과 같이 실행하면 된다.

-------------------------------------------------------------------------------
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-------------------------------------------------------------------------------
==>관련정보사이트


47. 백도어 파일의 삭제

보통 백도어 파일은 rm 명령으로도 삭제되지 않는다. 속성이 있을 경우 다음과 같이
삭제한다.

-------------------------------------------------------------------------------
# lsattr /usr/sbin/in.fingerd

lsattr 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09

-----a-- /usr/sbin/in.fingerd

==> a 속성이 있음을 확인


# chattr -a /usr/sbin/in.fingerd

chattr 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09

==> -a로 속성을 해제

lsattr 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09

-------- /usr/sbin/in.fingerd

==> 해제
-------------------------------------------------------------------------------



48. lpd(line printer daemon)의 취약점

lpd는 내부와 원격 프린트 작업을 수행하는 BSD 라인 프린터 데몬이다. lpd 데몬의 접
근 권한을 가지고 있는 내부 시스템이나 원격 시스템의 사용자가 특별히 변형된 불완
전한 프린트 작업을 요청하고 이어서 프린터 큐의 디스플레이를 요청하게 되면 해당
시스템에 버퍼 오버플로우를 일으킬 수 있다. 결국 관리자 권한으로 내부 시스템에 공
격코드를 실행시킬 수 있게 된다. 따라서 패치를 해주거나 서비스를 하지 않는다면 데
몬을 중지하는 것이 좋다.



49. BIND에서 보안상 문제가 있는 버전

BIND 4.x, 8.x에서 문제가 검출되었다. BIND 8버전에서는 트랜잭션 시그너쳐(TSIG) 핸
들링 코드에 버퍼오버플로우 취약점을 포함하고 있다.

유효한 키를 포함하지 안는 TSIG를발견하는 경우 BIND 8버전에서는 에러응답을 보내
기 위한 코드를 실행하게 되며, 이때 발생하는 변수 초기화 방식의 차이에 의해 해당
취약점이 발생하게 된다. DNS 시스템에 대한 요청 접근만으로 해당 취약점을 발생시킬
수 있으므로 이로 인한 위험성은 크게 된다.

BIND 4버전에서는 nslookupComplain() 내부에 있는 문자 배열(syslog를 위한 에러 메
시지 작성 버퍼)에 대해 입력 검증(input validation) 취약점을 포함하고 있다. 이것
은 특수한 포맷 형태를 가진 쿼리를 전송함으로써 입력 검증 취약점을 발생시킨다.

BIND 4, 8버전에서는 해당 서버가 쿼리를 처리하는 동안 정보가 누출(information lea
k)될 수 있는 취약점을 포함하고 있다. 특수한 포맷형태를 가진 쿼리 전송을 통해 공
격자가 프로그램 스택에 접근할 수 있게 함으로써 해당 취약점을 발생시킨다.

해결책은 BIND 버전은 8.2.3 이상이나 9.1 버전으로 업그레이드하는 것이다. 이것은
해결책이 아니라 시스템 관리자가 반드시 해야 할 일이다. ==>관련정보사이트


장애 발생시 복구

50. 비정상 종료시 하드디스크 체크요구 원인

대부분 정전이 발생한 후에도 시스템은 정상적으로 부팅되며 파일시스템도 자동으로 c
heck하지만 간혹 관리자가 수동으로 해주어야 하는 경우가 발생한다. 리눅스가 다운
되었을때 보통 Power OFF를 하는데, 이때 문제가 발생할 수 있으므로 Magic SysRq라는
것을 이용하여 안전하게 재부팅하는 방법을 이용한다.

Magic SysRq key란 시스템의 제어가 불가능한 상태(일반적으로 ''다운''되었다고 한다)
에서도 제어를 가능하게 해주므로 커널 컴파일시 Kernel hacking ---> [*]Magic SysRq
key를 체크해야 한다. Magic SysRq key를 사용하려면 다음과 같이 /proc/sys/kernel/
sysrq 값을 1로 만들어야 한다.

------------------------------------------------------------------------------
# echo 1 > /proc/sys/kernel/sysrq

lilo: linux init=/bin/sh
------------------------------------------------------------------------------

그러면 커널이 뜨고 바로 shell prompt ''#''가 나타난다. 이때에는 filesystem도 read
only로 마운트 되고, 동작하는 daemon process도 전혀 없는 상태가 된다. 그 상태에서
수동으로 모든 파일시스템을 체크한다.

------------------------------------------------------------------------------
# fsck [-t ext2] 장치명
# e2fsck 장치명
------------------------------------------------------------------------------

위의 명령 사용시 문제가 생긴 블록의 수정여부를 묻게 되는데 ''y''를 선택하고 만약
수정여부를 묻는 질문이 많다면 -y 옵션을 사용하여 자동으로 ''y''를 선택하게 할 수
있다.

------------------------------------------------------------------------------
# e2fsck -y 장치명
------------------------------------------------------------------------------

Ctrl-Alt-Del로 리부팅하면 아주 심하게 깨지거나, 디스트에 이상이 있지 않는 한 복
구가 된다.