Search Results for '프로그래밍/리눅스 & MY-SQL'


206 posts related to '프로그래밍/리눅스 & MY-SQL'

  1. 2010/09/02 iso cdrom 이미지 파일을 마운트해서 사용하기
  2. 2010/09/02 두파일 내용비교 : diff
  3. 2010/09/02 rm - f 로 지운 화일 복구하기 2
  4. 2010/09/02 Find 명령
  5. 2010/09/02 아파치로그보기(url 날리면서)
  6. 2010/09/02 tar와 split를 이용한 분할 압축
  7. 2010/09/02 [스크립트] 리눅스 서버 정보 확인 셀스크립트
  8. 2010/09/02 아파치와 PHP 버전 정보 숨기기
  9. 2010/09/02 cp 명령어 옵션
  10. 2010/09/02 실시간 스팸차단리스트(RBL) 이용방법
  11. 2010/08/18 MY-SQL 유저 생성, 권한 부여
  12. 2010/08/18 startssl 자동실행
  13. 2010/08/18 아파치 보안 팁 [외부에서 아파치정보 못 보게하기]
  14. 2010/08/18 vsftp port 변경
  15. 2010/08/18 euc-kr 을 utf-8 파일로 일괄 변환하는 쉘 스크립트
  16. 2010/08/01 [Linux] 이메일 포워딩 방법 두 가지
  17. 2010/08/01 rsync + ssh 원격백업
  18. 2010/08/01 [리눅스] proftpd.conf 파일 설명
  19. 2010/08/01 리눅스 quota 설정
  20. 2010/08/01 [리눅스] rsync
  21. 2010/08/01 [리눅스] 언어설정
  22. 2010/08/01 FC3 사용자는 설치후 udev-039-10.FC3.1로 경신(update)해야 한다.
  23. 2010/08/01 [리눅스] 데몬리스트
  24. 2010/08/01 RPM사용법
  25. 2010/08/01 Perl에서 한글 인코딩 문제
  26. 2010/08/01 [리눅스] DSO방식 APM, Zend, GD설치
  27. 2010/06/07 my-sql 인젝션 복구쿼리
  28. 2010/06/07 아파치 (apache) 인증 만들기 htaccess
  29. 2010/06/07 1시간 간격으로 apache log를 rotate하기
  30. 2010/06/07 sshd 접속 포트변경
iso cdrom 이미지 파일을 마운트해서 사용하기

커널 컴파일 할때 블럭 디바이스 설정 하는 곳에 보면 loopback device 라는 것이 있습니다.
이것을 선택해서 커널을 컴파일을 하면 재미있는 일을 할수가 있더군요.

ftp에 보면 리눅스 배포본 시디의 iso 파일들이 많이 있습니다.
이걸 그냥 다운 로드 한후 시디를 구운 후에야 그내용들을 확인하거나 사용할수가 있었습니다.

아래와 같은 방법을 사용하면 이 iso파일을 간단하게 마운트 해서 시디를 굽지 않고도 시디처럼 사용할수가 있습니다.

2010/09/02 18:18 2010/09/02 18:18
두파일 내용비교 : diff

두 파일의 내용을 비교할때 diff 를 사용한다.
사용법은 아래와 같다
diff  file1 file2

이것은 두 파일의 각 줄별로 비교해서 그 차이점을 표준 출력으로 보여준다.
두 파일이 완벽히 일치한다면 아무런 내용도 보여주지 않고 다시 프롬프트가나타난다.
출력결과를 보여주는 양식은 먼저 숫자들이 나오고,
a(추가),d(삭제),c(바뀜) 문자들 중 하나가 나오고 다음 또 숫자들이 나오는 한행과 그 다음 줄부터
그 숫자와 문자가 뜻하는 실제 내요을 기호화 |,<,>를 사용해서 보여준다.


두개의 파일을 비교한 예:


이것은 email 파일과 addresses라는 두파일의 내용을 서로 비교한 명령과 그 결과입니다.
분석해보면 2행 다음부터 3,4행이 추가 되었고 ,addresses파일의 3,4행이 추가되었다.
실제 파일의 내용은 아래와 같다
 

공백문자와 대소문자를 구분하지 않을경우


이것은 두파일을 비교해서 단어 사이의 공백 문자가 있는 차이와 대소 문자를 구분하지 않고 서로 비교합니다.

위 두 줄은 같은 줄로 처리한다.

* 디렉토리비교

두 디렉토리의 내용을 비교할때 편리하다.두 디렉토리의 내용이 같을 경우 아무것도 나타내지않고 바로 프롴프트가 떨어진다. 아래는 두 파일을 비교한 예이다


* 파일을 나란히 비교 : sdiff
sdiff는 비교되는 두 파일간의 차이점을 나란히 출력하는 명령이다. diff와 차이점은 두 파일이 옆으로 나란히 출력한다.

형식 : sdiff [옵션] 파일1 파일2


※ 실행을 해보면 우측에 '|'가 나온다. 의미는 그 행이 서로 틀리다는 것을 뜻한다.
2010/09/02 18:17 2010/09/02 18:17
리눅스에서의 파일 삭제는 신중을 기해야 한다. 왜냐면 삭제된 파일은 복구 할 수 없기 때문이다. 이것이 정석이였습니다.

물론 rm 의 소프트링크나 다른 삭제 프로그램으로 대체하는 프로그램들도 있습니다만 rm 자체의 복구는 없다고 알고 있으신 분들이 대부분 일 겁니다.

해답은
debugfs 라는 명령어 입니다. (man page 참조)

실제 사용예를 들어 설명하겠습니다.
가정1) /home/pds/portsentry.tar.gz 라는 파일이 있음.
가정2) /home 파티션은 hda8 입니다. (df -h 로 확인)
가정3) rm -f /home/pds/portsentry.tar.gz 명령으로 지웠음.
가정4) root 로 작업.

복구 절차.

1. #debugfs /dev/hda8
=> 설명 : hda8 파티션에 대해서 검사를 한다.

2. debugfs:
=> 대기상태를 뜻함. 이곳에서 lsdel 을 입력하고 엔터.
계속...
 

위와 같은 상태로 나오고 다시 대기상태로 됩니다. 실제로는 너무 많이 나오더군요.. (내가 그렇게 많이 지웠었나? '.'a)

이제 이 목록중에서 하나를 선택해서 살려야 합니다. 다행히도 살리고자 하는 파일은 가장 최근에 지운 파일이므로 가장 아래쪽에 있는 것이겠죠.


=> Inode 값을 <> 안에 적어줍니다. 뒤에는 복구할 파일 이름을 적어주시면 됩니다.
=> 복구할 파일은 다른 디렉토리로 지정해 주시는게 좋습니다. 별 상관은 없지만...



=> 아주 훌륭하게 복구가 되었더군요. ^^v

임의로 portsentry.tar.gz 를 지워서 테스트를 한 것입니다.

debugfs:  상태에서 사용할 수 있는 명령어는 help 를 쳐보면 알 수 있습니다.
끝내는 것은 q, quit 입니다.

아래는 debugfs: 에서 사용가능한 명령어들 입니다.
2010/09/02 18:17 2010/09/02 18:17
Find 명령

리눅스 쉘상에서 특정파일이나 디렉토리를 찾는것을 알아보자!
의외로 간단하다.
공통된 문법(?)의 시작은
---------------------------------------
find [경로] -name [파일] -print
---------------------------------------



약간의 설명을 붙이자면 경로는 절대경로와 상대경로모두 사용할 수 있다.
그럼 아래 설명을 보자

약간의 설명을 붙이자면 경로는 절대경로와 상대경로모두 사용할 수 있다.
그럼 아래 설명을 보자

* 현재 디렉토리에서 특정파일찾기
==> find . -name rsync -print
==>> 현재 디렉토리에서 rsync파일이름을 출력하라!. 만약 없다면 아무것도 출력하지 않는다.
위에서 "."이 부분을 잘보자

* 홈 디렉토리 안에있는 파일찾기
==> find ~/ -name README -print
==>> 현재 자신의 홈 디렉토리와 그 하위모든디렉토리를 대상으로 README파일을 찾아서 그 결과를 보여준다.
                       
* 현재 디렉토리에서 여러파일 찾기
==> find . -name '*.conf' -print
==>> 현재 디렉토리에서  .conf로 끝나는 파일을 파일을 찾아준다.
       
* 디렉토리 찾기
==>find /usr/local -name gnu -type d -print
==>> /usr/local 디렉토리를 기준으로 그 하위 디렉토리인 gnu디렉토리를 찾는다.
2010/09/02 18:16 2010/09/02 18:16
아파치로그보기(url 날리면서) 

tail -f access.log
한다음.

url 날려보면 trace할 수 있다.
2010/09/02 18:15 2010/09/02 18:15
tar와 split를 이용한 분할 압축

리눅스에서 많이 쓰는 압축방법은 tar 이다.

기본적으로 압축을 하려면 다음과 같은 방법으로 쓴다.
# tar zcvfp test.tar.gz test/

너무큰 압축이 생길경우 분할 압축을 통하면 된다.
# tar zcvfp - test/ | split -b 700m - test.tar.gz

이렇게 하면 700메가씩 분할 되어 test.tar.gzaa 부터 test.tar.gzac 까지의 파일이 생성되면서 압축이 된다.


이 파일을 압축 해제 하는 방법은 다음과 같다.
# cat test.tar.gz* | tar zxvfp -

만일 분할안 파일을 병합 할때는 다음과 같이 하면 된다.
# cat test.tar.gz* | test.tar.gz


만일 tar에서 gzip을 지원하지 않는 경우는 다음과 같이 하면 된다.
# tar cvfp - test/ | gzip - | split -b 700mb - test.tar.gz
# cat test.tar.gz* | gzip -d - | tar xvfp -
2010/09/02 18:06 2010/09/02 18:06
[스크립트] 리눅스 서버 정보 확인 셀스크립트

사용법
chmod 755 system_check.sh
system_check.sh 실행

내용
1)네트워크 정보(IP, Subnet, hostname, gateway)
2)시스템 정보(cpu, memory, disk)
3)프로세스(서비스) 정보
4)서버의 오픈된 포트 정보

system_check.sh
2010/09/02 18:05 2010/09/02 18:05
아파치와 PHP 버전 정보 숨기기

웹 페이지를 볼때 헤더부분에 서버종류와 php정보 같은것이 전송됩니다.
이것을 막기 위해서 몇가지 설정이 필요합니다.

설정전..
HTTP/1.1 200 OK
Date: Fri, 22 Sep 2007 11:22:22 GMT
Server: Apache/1.3.37 (Unix) PHP/4.4.4
X-Powered-By: PHP/4.4.4

1. 아파치 버전 정보 숨기기
httpd.conf 파일에 ServerTokens 옵션 수정

이 옵션의 문법은 다음과 같습니다.
ServerTokens Prod[uctOnly] ([] 안은 생략 가능함)

이 문법에서 사용할 수 있는 옵션은 다음과 같습니다.
ServerTokens Prod[uctOnly] : Apache 라는 것만 보여줌
ServerTokens Min[imal] : Apache 버전만 보여줌
ServerTokens OS : 아파치 버전과 운영체제를 보여줌
ServerTokens Full (또는 지시하지 않았을 때) : 모두 보여줌

ServerTokens 옵션은 아파치 버전 1.3 이후에서 사용할수 있으며, ProductOnly 키워드는 아파치 버전 1.3.12 이후에 추가되었습니다.

2. PHP 버전 정보 숨기기
php.ini 파일 수정

expose_php = Off


설정후..
HTTP/1.1 200 OK
Date: Fri, 22 Sep 2007 11:22:22 GMT
Server: Apache
2010/09/02 18:05 2010/09/02 18:05
cp 명령어 옵션

* SYNOPSIS
cp [options] source dest
cp [options] source... directory
Options:
[-abdfilprsuvxPR] [-S backup-suffix] [-V {numbered,existing,simple}] [--backup] [--no-dereference] [--force] [--interactive] [--one-file-system] [--preserve] [--recursive] [--update] [--verbose] [--suffix=backup-suffix] [--version-control={numbered,existing,simple}] [--archive] [--parents] [--link] [--symbolic-link] [--help] [--version]


* DESCRIPTION
 이 문서는 더이상 최신 정보를 담고 있지않다. 그래서, 몇몇 틀릴 경우도 있고, 부족한 경우도 있을 것이다. 완전한 메뉴얼을 원하면, Texinfo 문서를 참조하기 바란다.
이 메뉴얼 페이지는 cp 명령의 GNU 버전에 대한 것이다. 마지막 명령행 인자로 경로가 지정되면, cp 명령은 지정한 source 파일들을 그 경로 안으로 복사한다. 한편 명령행 인자로 두개의 파일 이름이 사용되면, 첫번째 파일을 두번째 파일로 복사한다. 마지막 명령행 인자가 경로가 아니고, 두개 이상의 파일이 지정되면, 오류 메시지를 보여준다. 초기값으로 경로는 복사하지 않는다.

* OPTIONS
-a, --archive : 데이터 백업시 중요
원본 파일의 속성, 링크 정보들을 그대로 유지하면서 복사한다. 이 옵션은 -dpR 옵션과 같은 역활을 한다.

-b, --backup
복사할 대상이 이미 있어, 이것을 덮어쓰거나 지울경우에 대비해 백업본을 만든다.

-d, --no-dereference
만약 복사할 원본이 심볼릭 파일이면, cp 명령은 그 심볼릭 대상이 되는 파일을 복사한다. 이렇게 하지 않고, 단지 그 심볼릭 파일 자체를 심볼릭 정보와 함께 복사하고 할 때, 이 옵션을 사용한다.

-f, --force
만약 복사 대상 파일이 이미 있으면 강제로 지우고 복사한다.

-i, --interactive
만약 복사 대상 파일 이미 있으면 사용자에게 어떻게 처리 할 것인지 물어보는 프롬프트를 나타나게 한다.

-l, --link
하드링크 형식으로 복사한다. 물론 하드 링크형식이기에 경로는 복사할 수 없다.

-P, --parents
원본 파일에 지정을 경로와 같이 했을 경우, 그 경로 그대로 복사 된다. 이때는 대상으로 사용될 수 있는 것은 경로 이름이어야만 한다. 예를 들어, `cp --parents a/b/c existing_dir' 명령이 사용된다면, 이것의 결과는 existing_dir/a/b/c 이런 식이 된다.

-p, --preserve : 데이터 백업시 중요
원본 파일의 소유주, 그룹, 권한, 시간정보들이 그대로 보존되어 복사된다.

-r
일반 파일이면, 그냥 복사되고, 만약 원본이 경로면, 그 경로와 함께 경로 안에 있는 모든 하위경로, 파일들이 복사된다.

-R, --recursive : 데이터 백업시 중요
경로를 복사할 경우에는 그 안에 포함된 모든 하위경로와 파일들을 모두 복사한다.

-s, --symbolic-link
경로가 아닌 일반 파일을 심블릭 링크 형식으로 복사한다. 이때는 복사할 원본 파일 이름은 절대경로(`/'로 시작하는 경로)로 지정된 파일이름이어야 한다. 심블릭 링크를 지원하지 않는 시스템에서 이옵션을 사용할 경우에는 오류 메시지를 보여준다.

-u, --update
복사할 대상이 이미 있는데, 이 파일의 변경 날짜가 같거나, 더 최근의 것이면 복사하지 않는다.

-v, --verbose
각 파일의 복사 상태를 자세히 보여준다.

-x, --one-file-system
원본과 대상 파일의 파일 시스템이 다를 경우에는 복사하지 않는다.

--help
도움말을 보여주고 마친다.

--version
버전 정보를 보여주고 마친다.

-S, --suffix backup-suffix
만약에 복사 대상이 이미 있어, 백업을 해야할 경우에 그 백업 파일에서 사용할 파일 이름의 꼬리 문자를 지정한다. 이것은 이미 지정되어 있는 SIMPLE_BACKUP_SUFFIX 환경 변수를 무시하게 된다. 만약 이 환경변수도 지정되어 있지 않고, 이 옵션도 사용하지 않는다면, 초기값으로 Emacs과 같이 `~' 문자를 사용한다.

-V, --version-control {numbered,existing,simple}
백업하는 방법을 지정하는데, 이 옵션은 이미 지정되어 있는 VERSION_CONTROL 환경 변수를 무시한다. 만약 이 환경 변수도 지정되어 있지 않고, 이 옵션도 사용하지 않는다면, 초기값으로 `existing'을 사용한다. 여기서 사용하는 백업방법은 GNU Emacs의 `version-control' 값과 같다. 아래와 같이 보다 짧은 지시어들도 사용될 수 있다. 여기서 사용될 수 있는 백업 방법은 아래와 같다.
`t' 또는 `numbered'
항상 번호 있는 백업본을 만든다.
`nil' or `existing'
대상 파일이 이미 있을 경우에만 백업본을 만든다.
`never' or `simple'
간단한 백업을 만듬.
2010/09/02 18:05 2010/09/02 18:05
스팸메일 수신을 차단하기 위하여 실시간 스팸차단리스트(KISA-RBL)를 활용하는 방법입니다.

KISA-RBL 서버에서 스팸리스트를 다운로드하는 방법과
메일 서버(Sendmail, qmail, Postfix, Exchange Server)에서 참조할 수 있는 방법이 설명되어 있습니다.

첨부파일을 참고해 주세요.

출처 : kisarbl.or.kr (한국인터넷진흥원 스팸대응팀)
2010/09/02 17:31 2010/09/02 17:31
1. 사용자 생성
 
    GRANT USAGE ON *.* TO root@'111.222.333.444' IDENTIFIED BY "password"
 
2. 권한 부여
   
    GRANT ALL PRIVILEGES ON *.* TO root@'111.222.333.444'
 
3. 권한 로드
 
    FLUSH PRIVILEGES
2010/08/18 21:10 2010/08/18 21:10
 
아파치 설정파일인 httpd.conf 파일을 열어서 SSLPassPharaseDialog를
찾아보면 기본값은 SSLPassPhraseDialog builtin으로 설정되어있을겁니다.
builtin은 상호대화방식으로 startssl로 시작시 패스워드 어구를
물어보게되어있습니다.
그부분을 exec:실행파일명 형식으로 적어주시고
(SSLPassPhraseDialog exec:/usr/sbin/ssl_pass)
그 실행파일을 다음과 같이 만들고
-------------------
#!/bin/sh
echo password
-------------------
password부분에 패스워드를 적고 루트만 읽고 실행권한을 가지게 설정후
아파치를 시작하면 됩니다.
 
/etc/init.d/httpd startssl(또는 설치디렉토리의 아파치 실행스크립트)
하면 패스워드 어구를 물어보지 않고 아파치가 실행됩니다.
좀더 자세한 설정은 관련링크를 참고하시기 바랍니다.
http://www.modssl.org/docs/2.8/ssl_reference.html#ToC2
 
set ok 에서는 head include
2010/08/18 21:06 2010/08/18 21:06
주의사항: 본 팁 은 선의에 입각하여 제공합니다. 아래의 작업중 발생하는 어떠한 책임도 지지 않습니다.

#개요:
아파치는 리눅스에서 가장 많이 사용하는 웹서버 입니다. 또한 버전마다 보안등 특징들이 공개되어 누구나 보안상황을 볼 수 있습니다.

# 문제점:
상당수 웹서버는 제때 업데이트를 하지 않고 있습니다. 따라서 외부에서 특정 서버의 아파치 서버 정보 (버전정보등 포함...) 를 볼 수 있다는것은 보안상에 문제가 됩니다. 따라서 이것을 막아야 합니다.

# 막는 방법 :
1) /etc/httpd/conf/httpd.conf   혹 /usr/local/httpd/conf/httpd.conf  파일을 열어서 ServerSignature 및 ServerTokens를 아래처럼 변경하여 줍니다. 첫번째는 서버버전 정보를 숨기고 2번째는 서버정보는 단지 "Apache" 만 표시되게 하는것입니다.
ServerSignature Off
ServerTokens Prod
2) 다음에 아파치를 재 시작하여 줍니다.

[root@mbkang ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[root@mbkang ~]#

2010/08/18 21:06 2010/08/18 21:06
 

ftp를 이용한 해킹을 막기 위해서 해외 접속 ftp에 대한 ip를 모두 차단할 수도 있지만

(GeoIP라는 거를 쓰면 됨) 간단하게 ftp port만 바꿔버릴 수도 있습니다.


vsftp의 경우 /etc/vsftpd/vsftpd.conf 에서 아래 라인을 추가 합니다.

그리고 가끔씩 ftp port를 바꿔서 해킹을 헷갈리게 하는거죠.

이거는 공용서버에서는 할 수 없겠죠? ㅎㅎ


# vsftp access port
listen=YES
listen_port=15231

2010/08/18 21:03 2010/08/18 21:03
이 파일을 e2u.sh 라는 파일로 만든 후 퍼미션에 실행권한을 준다.

#!/bin/bash
iconv -c -f euc-kr -t utf-8 $1 > $1.tmp && mv $1.tmp $1



$>  for i in `find . \( -name '*.php' -o -name '*.htm' -o -name '*.html' -o -name '*.css' -o -name '*.js' -o -name '*.sql' -o -name '*.txt' \) -print` ; do ./e2u.sh $i ; done

쉘에서 이 명령을 실행하면 하위 폴더까지 전부 charset 을 변환한다.
2010/08/18 21:03 2010/08/18 21:03
문제는 메일 포워딩입니다.
가령 info@aaa.co.kr이란 계정이 있습니다.
이 계정으로 오는 메일을 방사장@aaa.co.kr과 퇴직녀@aaa.co.kr이 받고 있었습니다.
그런데 퇴직녀의 계정으로 왔던 info메일을 삭제하고
방사장@aaa.co.kr과 관리녀@aaa.co.kr로 포워딩을 하고 싶은데요.

책을 찾아보니까 root\info)vi. forward에서
방사장@aaa.co.kr
관리녀@aaa.co.kr
이렇게 편집을 하고 저장을 하고 나온 후 재부팅을 하면 된다고 합니다.

맞습니까? ㅜ.ㅜ

또한 그렇게 했을 경우 관리녀의 아웃룩에서 전자메일계정을 (- info 계정이겠죠) 추가해야 하나요?
추가 안하면 root모드에서 포워딩을 했어도 멜이 안오는겁니까?

정말 하나도 모르겠씸미다.

도와주셔요. ㅠㅠ


[질문자 채택답변] 참고하세요
비공개 님이 2003-12-16 10:59 작성
안녕하세요 sendmail을 쓰신다면 메일포워딩 기능을 쓰지마시고 aliases 기능을 쓰십시오.

info@test.co.kr 라는 계정이 없어도 aliases 에서 가능합니다.

우선 vi /etc/aliases 라는 파일을 여신후

====================================
newsadm: news
newsadmin: news
usenet: news
ftpadm: ftp
ftpadmin: ftp
ftp-adm: ftp
ftp-admin: ftp

# trap decode to catch security attacks
decode: root

# Person who should get root's mail
root: jkkim, kim@hanmail.net
webmaster: biz
info: 방사장@aaa.co.kr, 관리녀@aaa.co.kr
================================================
메일링 리스트(info@aaa.co.kr)로 오는 메일을 [최종 목적지]에 설정된 사용자 또는 메일 주소로 포워

딩 합니다.
info을 추가 하신후 aliases 파일을 저장하시고 newaliases 라는 명령을 쳐주시기 바랍니다.

[root@test /home]# newaliases

다시 설명하자면,
info계정으로 오는 메일은 방사장 or 관리녀 메일로 들어갑니다.
아웃룩에서는 방사장으로 배달을 누르시면 info메일도 들어옵니다.
2010/08/01 23:43 2010/08/01 23:43
- 데이터가 있는곳은 ssh 서버 및 rsync 설치.
- 데이터를 백업할 곳은 ssh 클라이언트 및 rsync 설치.
- rsyn가 설치되어 있고, ssh 클라이언트가 설치되어 있으면,
원격백업 가능함.
- 호스트1은 백업할서버, 호스트 2는 데이터 서버 라고 가정할 경우.
rsync -avPz --delete --stats -l -t -e ssh root@호스트2의 서버 아피:/백업할 디렉토리/ /데이터를 저장할 호스트2 서버의 디렉토리.

예제) 호스트1의 home디렉토리 전체를 호스트2의 backup 디렉토리로
백업을 할 경우. (호스트2에서 호스트1의 ssh서버를 접근해야 함)

rsync -avPz --delete --stats -l -t -e ssh root@호스트1의아피:/home/ /backup
- 저렇게 할 경우 압축을 하고, 퍼미션 및 소유권은 그대로 유지하며, 심벌릭 링크는 심벌릭 링크 그대로 백업하고, 전송 속도 및 시간을 출력해주고, 마지막에 전송된 상태를 출력 해줌.
--delete는 옵션은 원본에는 없지만 그 전에 받은 백업본에 있을 경우 삭제해줌.
그래서, 원본과 항상 똑같이 백업이 되도록 함.

주의사항)
백업 할 곳의 디렉토리를 적을땐,
항상 /home/ 식으로 끝에 슬래쉬를 적어 줘야 함.
만약 /home이라고 할 경우 디렉토리 생성만 되고, 그 안에 있는 데이터는
백업이 되지 않음.

그리고, 위의 같이 명령어를 입력할 경우 그냥 ssh접속할때 처럼
루트의 비밀번호를 물어봄.
루트의 비번을 입력해주면, 바로 백업을 해준다.
루트의 비번을 입력하기가 귀찮을 경우는
두가지 방법이 있음.
첫번째는 인증키를 생성해서 해당 서버에 저장하면,
비밀번호를 물어보지 않음.
인증키 생성하는 방법은
ssh-keygen -d
이라고 할 경우
~/.ssh/id_dsa.pub 라는 파일이 생성됨.
이걸 원본 데이터가 있는 서버에 저장해줌.
방법은
scp -p .ssh/id_dsa.pub root@호스트명:~/.ssh/authorized_keys2
라고 하면 됨.

두번째 방법은 스크립트로 돌리는 방법이 있음.
#!/usr/bin/expect -f
log_user 0
spawn rsync -avPz --delete --stats -l -t -e ssh root@호스트1의 아피:/home /backup
expect "password: "
send "루트의 비번\n"
log_user 1
interact

저렇게 할경우 루트의 비번을 입력하지 않아도 루트의 비번을 전송해줌.

이상 rsync+ssh에 의한 미러 백업에 대한 방법론이었습니다...^^
2010/08/01 23:42 2010/08/01 23:42
proftpd.conf 파일 설명
----------------------------------------------------------------

ServerName                      "ProFTPD Default Installation"

FTP 에 접속 했을때 보여주는 문자열 입니다.


ServerType                       inetd

proftpd 를 작동하는 서버 모드는 두가지가 있는데 하나는 standalone 이고 하나는 inetd 방식입니다.  
Standalone 방식은 proftpd 데몬이 프로세스상에 항상 떠 있으면서 접속을 대기 하고 있어 빠른 속도를 보이는 반면에 시스템자원을 차지하는 단점이 있으며
inetd 방식은 접속 요청이 있을때만 반응하므로 시스템자원을 차지하지 않지만 속도가 Standalone 방식보다 떨어질 수 있습니다.


DefaultServer                   on

한개의 FTP 서버에 여러개의 아이피 주소가 존재할 경우 이들 주소에 대해 접속요청이 있을때 기본 서버로 작동할 것인가를 결정해 줍니다.


Port                            21

FTP 데몬의 포트번호를 지정해 줍니다.


Umask                           022

주어진 콘텍스트에서 새로 만들어진 파일과 디렉토리 퍼미션에 적용될 마스크를 지정해 주는 지시자입니다.


MaxInstances                    30

Standalone 방식으로 작동할때 생성될 수 있는 자식 프로세스 (child process) 의 최대 갯수를  설정해 줍니다. inetd 모드로 작동될 경우 이 옵션은 필요가 없습니다.


User                            nobody
Group                           nobody

데몬을 실행하는 사용자와 그룹의 소유권을 지정해 줍니다.


#DefaultRoot ~

유저들이 로그인 했을때 자신의 홈디렉토리 상위로 이동하지 못하도록 설정하는 옵션입니다. 틸드(~) 표시 뒤에는 그룹이름이 들어가도록 되어 있습니다.


사용예 )

#DefaultRoot                 ~        !root

위와같이 설정 하면 일반 유저들은 자신의 홈디렉토리의 상위 디렉토리로 이동하지 못합니다. 웹호스팅 서버에서 사용자들끼리 서로 다른 디렉토리에 옮겨다니지 않도록 하는 필수 설정 사항입니다.


<Directory />
  AllowOverwrite                on  
</Directory>

<Directory /> </Directory> 지시자를 이용해서 디렉토리의 설정을 할 수 있습니다.
AllowOverwrite                on  
이것은 기존 파일에 똑같은 이름의 파일을 덮어 쓸 수 있게 하는 옵션이며 off 로 설정 하면 덮어쓰기가 금지됩니다.


<Anonymous ~ftp>
  User                          ftp
  Group                         ftp
  UserAlias                     anonymous      ftp
  MaxClients                    10
  DisplayLogin                  welcome.msg
  DisplayFirstChdir             .message
  <Limit WRITE>
    DenyAll
  </Limit>
</Anonymous>

anonymous FTP 를 운영하는 옵션입니다. 기본 디렉토리가 ~ftp 로 되어 있는것을 볼 수 있는데 기본적으로 ftp 계정은 /etc/passwd 파일을 보면
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
이렇게 설정 되어 있으므로 기본적으로 anonymous FTP 는 작동하지 않는것이 기본값입니다.

UserAlias                     anonymous      ftp

유저들이 anonymous 외에 ftp 로도 로그인 할 수 있게 하는 옵션입니다.


MaxClients                    10

FTP 서버에 접속할 수 있는 최대 클라이언트 수를 지정합니다.
뒤에 메시지를 붙여 주면 클라이언트 수가 초과 될때 접속 차단 메시지를 보여주게 됩니다. %m 으로 최대 접속자 수를 출력할 수 있습니다.


MaxClients                    10  “ %m 명까지 접속 할 수 있습니다 “

만일 접속자 수를 제한하지 않으려면 이 값을 none 으로 해 주면 됩니다.


DisplayLogin                  welcome.msg

클라이언트가 서버에 로그인 하였을때 보여주는 메시지를 설정해 줍니다.
메시지 파일 경로는 절대경로,상대경로 모두 설정 할 수 있으며  
상대 경로로 사용하는 경우에는 anonymous FTP 의 기본 디렉토리가 기준이 됩니다.

DisplayFirstChdir             .message

클라이언트들이 디렉토리를 이동할때에 보여지게 될 메시지 파일 명을 설정합니다.
다시말해 클라이언트들이 디렉토리를 이동할때에 디렉토리에 .message 파일을 넣어 놓으면 그 내용이 클라이언트들에게 보여지게 됩니다.  
메시지 파일에는 특정한 변수를 사용해서 메시지 화면에 여러가지 정보를 보여줄 수 있습니다



%C        현재 작업 디렉토리
%E        서버 관리자의 이메일 주소
%F        사용 가능한 디스크 공간
%L        로컬 호스트 이름
%M        접속 가능한 최대 클라이언트 수
%N        현재 접속 되어 있는 클라이언트 수
%R        원격 호스트 이름
%u        ident 프로토콜에 의해 확인된 사용자명
%U        로그인에 사용된 사용자 명
%T        현재시간

                
        
<Limit WRITE>    DenyAll  </Limit>

클라이언트가 명령어를 사용하는데 제한을 두는 옵션이 <LIMIT> 옵션입니다.
위의 설정은 WRITE 를 하지 못하도록 하는 옵션입니다.



이외의 지시자들  

AnonRequirePassword         on

익명 FTP 접근시 패스워드를 이메일로 넣도록 하는 설정입니다.


TimeoutIdle                     900

클라이언트가 900 초간 아무런 명령을 입력하지 않는 경우 접속이 끊어지는 옵션입니다.


TimeoutNoTransfer               900

클라이언트가 900 초간 아무런 전송이 없으면 접속이 끊어지는 옵션입니다.


TimeoutLogin                    300

로긴할때 로그인 입력 대시 시간으로 300 초내에 입력하지 않으면 접속이 해제됩니다.


ServerAdmin                     root@localhost

서버의 관리자 이메일을 설정하는 옵션입니다.


RootLogin                       off

FTP 로 root 가 로그인 할 수 있는지 여부를 설정하는 옵션입니다.


RateReadBPS                    256

클라이언트의 속도를 제한하는 옵션입니다.
다운로드,업로드를 할때 전송 대역폭을 제한하는 지시자입니다.


RateReadFreeBytes              5120  

대역폭의 제한없이 전송할 수 있는 바이트 양을 지정합니다.


MaxClientsPerHost             3 "Sorry, %m connection allow per one host"

하나의 호스트 컴퓨터로 부터 동시에 접근할 수 있는 수를 지정합니다.


MaxHostsPerUser               1 "Sorry, %m hosts allow per one user"

하나의 계정 아이디로 동시에 접속 할 수 있는 호스트 컴퓨터 숫자를 설정합니다.


LsDefaultOptions              "-a"

ls 명령어의 –a 옵션으로 hidden 파일도 볼 수 있도록 하는 옵션입니다.


  UpTime      12  DownTime    18

서버를 시간대 별로 운영하는것을 지정합니다.
위의 예는 오후 12시부터 6시까지 운영하는 설정입니다.
2010/08/01 23:42 2010/08/01 23:42
환경
uname -a
Linux home.kuc.or.kr 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux

[root@ns home]# cat /var/log/dmesg | grep quota
VFS: Disk quotas vdquot_6.5.1

1) /etc/fstab 파일을 수정한다.
vi /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
none                    /dev/pts                devpts  gid=5,mode=620  0 0
LABEL=/home             /home                   ext3    defaults       1 2

우선 home 을 쿼터를 걸려고 했으니 그 부분을 이렇게 수정함

LABEL=/home             /home                   ext3    defaults,usrquota        1 2

usrquota 가 추가되었음 ^^;

/etc/fstab 파일을 수정한 후, 설정을 반영하기 위해서 시스템을 다시 부팅시키거나 파일 시스템을 다시 마운트(remount) 시킨다.

[root@ns home]# mount -o remount /home
[root@ns home]# mount
/dev/cciss/c0d0p5 on / type ext3 (rw)
none on /proc type proc (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/cciss/c0d0p1 on /boot type ext3 (rw)
/dev/cciss/c0d0p7 on /home type ext3 (rw,usrquota)
none on /dev/shm type tmpfs (rw)
/dev/cciss/c0d0p3 on /usr type ext3 (rw)
/dev/cciss/c0d0p2 on /var type ext3 (rw)

2) Quota 기록파일인 quota.user(또는 quota.group) 파일을 만든다.

[root@ns home]# touch /home/quota.user
[root@ns home]# chmod 600 quota.user

[root@ns home]# convertquota -u /home/
위 명령어 쳤는데 에러 뜨면 리붓 하번 해주면 됨 안되면 말고

그리고 ls -al 로 해서 대충 보면
aquota.user 이란 파일 하나 더 생김~

3) 디스크 사용 상태를 체크한다. 실행하여 이러한 작업을 할 수 있다.
[root@ns home]# quotacheck -avug  
quotacheck: Cannot remount filesystem mounted on /home read-only so counted values might not be right.
Please stop all programs writing to filesystem or use -m flag to force checking.
위처럼 에러 뜨면 밑에처럼 하면 됨 안되면 역시나 말고
[root@ns home]# quotacheck -avugm
quotacheck: Scanning /dev/cciss/c0d0p7 [/home] done
quotacheck: Checked 4124 directories and 40103 files

4) Quota 시작하기
[root@ns home]# quotaon /home1


계정 용량 할당 하기

[root@ns home]# edquota bresting

Disk quotas for user bresting (uid 510):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/cciss/c0d0p7           3126776          0          0        598        0        0

그러면 저런 화면이 뜸

block(soft = 0, hard=0)
block 은 지금 사용하고 있는 총 용량
soft 는 용량의 제한을 둬서 그걸 넘으면 에러 메세지를 보냄
hard 는 그 용량 되면 더이상 못씀
inodes (soft =0,    hard=0)
이건 파일 게수를 뜻한 역시나 위와 같음

예를 들자면

Disk quotas for user bresting (uid 510):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/cciss/c0d0p7           50         51200          56320        10       1500     1550

50 메가 넘으면 경고 메세지 보냄
55 메가 넘으면 더이상 못씀
1500 게 파일 넘으면 경고 메세지
1550 게 파일 넘으면 더이상 못씀


유예 기간
[root@ns home]# edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/cciss/c0d0p7                  7days                  7days


쿼터 설정 상태

[root@ns home]# repquota -a
*** Report for user quotas on device /dev/cciss/c0d0p7
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --    1216       0       0            141     0     0      
nobody    --   37960       0       0            825     0     0      
vpopmail  --    1688       0       0            181     0     0      
bresting  -- 3126776       0       0            598     0     0      
fellen    -- 26592228       0       0           1150     0     0      
mysql     --      20       0       0              5     0     0      
photo     --      24       0       0              6     0     0      
my2pc     --  332756       0       0           2394     0     0      
kang0927  -- 1410648       0       0           2713     0     0      
down      -- 6820940       0       0           1632     0     0      
jhs1013   -- 2646524       0       0           1644     0     0      
infoftp   -- 9556676       0       0           1213     0     0      
bibichu   -- 4675392       0       0           4668     0     0      
moriya    -- 9892968 9900000 9950000          13858     0     0      
heyworld  --      24       0       0              6     0     0      
heyoh     -- 8223824       0       0             75     0     0      
issey     -- 2285488       0       0          10063     0     0      
hayan     -- 1176884       0       0           1903     0     0      
club      --    5672       0       0            748     0     0      



쿼터 설정을 다른 사용자와 동일하게 설정 하기

edquota -p bresting bresting1 bresting2
bresting 의 환경을 bresting1 bresting2 에게 같이 적용

다중 사용자의 쿼터 적용
edquota -p bresting `awk -F: '$3 > 500 {print $1}' /etc/passwd`
awk 앞에는 숫자1 옆의 ` 그다음은 엔터 옆 ' ' passwd 는 숫자1 `
2010/08/01 23:40 2010/08/01 23:40

rsync란
rsync란 서로 다른 두 컴퓨터에 들어 있는 정보를 서로 동기화 시킬때 사용한다. 동일한 소스가 두군데 존재하고 한쪽을 편집했을때, 다른 한쪽에 편집한 부분을 업데이트 시켜줘야한다. 이때 모든 소스를 옮기게 되면 시간적으로 많은 낭비가 있기 때문에 rsync는 수정된 부분만 비교해서 옮겨 주게 된다. 그리고 anonymous 서버로도 설정할 수 있는등 많은 유용한 기능들이 들어있다.

rsh이나 ssh을 이용하여 전송하기
이것은 원격지의 호스트에 계정이 있고 rsync의 서버 데몬이 설정되어 있지 않을 경우 사용한다. 간단히 로컬에서도 cp 대신 사용할 수도 있다. ssh를 이용하면 안전하게 복사할 수 있다. 아래의 방법대로 하면 간단히 원격지로 복사할 수 있다.

shell> rsync -arvu -e ssh /from/directory/ to.hostname.com:/to/direcotry

클라이언트에서 실행
shell> rsync -avz -e ssh 210.222.18.105:/backup /backup

여기서 디렉토리를 써 줄경우 마지막 부분의 /가 중요한 의미를 가진다. 마직막에 /가 있을 경우는 그 디렉토리 내의 모든 파일을 의미하고 /가 없을 경우는 그 디렉토리 자체를 말하는 것이다. -arvu는 아래 부분을 참조하기 바란다.

원격지 서버 설정하기
먼저 리눅스 최신본을 설치하면 기본적으로 rsync가 설치된다. 그러나 xinetd를 이용하여 서버로 설정은 되어 있지 않기 때문에 서버로 사용할 수 있도록 설정을 해 주어야 한다.

xinetd.d에 rsync파일 추가하기
/etc/xinetd.d디렉토리에 rsync라는 파일을 만들고, 아래와 같은 내용을 입력한뒤, 저장한다.

service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

/etc/services파일에도 아래와 갈은 내용이 없으면 추가해 주도록 한다.

rsync 873/tcp # rsync
rsync 873/udp # rsync

그리고 /etc/rc.d/init.d/디렉토리에서 xinetd를 restart 시켜준다.

shell> /etc/rc.d/init.d/xinetd restart

rsyncd.conf 파일 생성
/etc디렉토리에 rsync.conf라는 파일을 생성한다.

#motd = /etc/rsync.motd # file : message of the day
uid = nobody
gid = nobody
use chroot = no
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid

[www.wangsy]
path = /somewhere/in/remote/host
comment = www.wangsy.com homepage
read only = false
uid = apache
gid = apache
auth users = wangsy
secrets file = /etc/rsyncd.secrets

위 파일과 함께 /etc디렉토리에 rsyncd.secrets파일도 함께 생성한다.

name:password

그리고 /etc/rsyncd.secrets파일의 permission을 rw-------로 해주는 것을 잊지 말도록 한다.

client에서 접근하기
서버 내용 내려받기
다음 명령을 통해서 서버의 내용을 다운 받을 수 있다.

shell> rsync -avz home.inzoo.co.kr::www.wangsy target_dir/

그리고 아래 명령을 통해서 로컬에서 수정된 파일을 서버에 반영할 수 있다.

shell> rsync -avz target_dir/ home.inzoo.co.kr::www.wangsy

위에서 -avz의 의미는 각각 다음과 같다. 자세한 사항은 rsync 홈페이지의 메뉴얼에서 확인할 수 있다.

-a, --archive archive mode
-v, --verbose increase verbosity
-z, --compress compress file data
-u, --update update only (don't overwrite newer files)

약간의 문제
client의 ip와 hostname이 lookup되지 않으면 remote호스트에서 접근을 허용하지 않는 문제가 있다. 이는 ADSL로 접속할 경우 연결이 되지 않게 되는 문제가 발생한다. 서버로 바로 접속하는 것 보다는 위 처음 방식인 ssh를 통한 접속 방법이 좀더 보안상 안전하기 때문에 이방법을 이용하는것이 좋을듯 하다.

2010/08/01 23:40 2010/08/01 23:40

깨지는 현상은 텍스트 모드에서 한글로 선택했을경우 생기는
부분이네요 ,,,,

해결방법은

#export LANG=c ----- 영문
#export LANG=ko ----- 한글

#cd /etc/sysconfig
여기서 sysconfig 디렉토리안의 내용을 볼께요.
#ls sysconfig
그러면 파일내용이 보일겁니다. 여기에 i18n이 있습니다.
그리고 여기서 i18n을 편집해야 합니다.
#vi i18n
편집하려면 i 혹은 a를 눌루면 insert 모드로 됩니다.
여기서 LANG="en_US"를 LANG="ko_KR" 혹은 LANG="ko_KR.eucKR"로 바꾸세요.
그다음에는 ESC키를 눌러 insert모드를 빠져나옵니다.
그런 후 :wq!라고 쳐서 저장하고 나옵니다.
그다음은 다시 부팅하세요.

LANG="ko_KR.eucKR"
SUPPORTED="ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="8859-15"

2010/08/01 23:39 2010/08/01 23:39
FC3 사용자는 설치후 udev-039-10.FC3.1로 경신(update)해야 한다.

실수로 FC3 udev 패키지에 디버깅 코드를 제거하지 않아, SIGCHLD 시그널이 udev에서 봉쇄되어 udev.rules의 정상 종료 상태(proper exit status)를 방해한다(,which prevents getting the proper exit status in udev.rules). 이로인해 시디롬 심볼링크(cdrom symlinks)가 만들어 지지 못하여, pam_ console이 데스크탑 사용자 소유권(desktop user ownerships)을 시디롬 디바이스에 적용할 수 없음을 의미한다.

휘도라 코아 3를 설치한 모든 사용자는 긴급히 이 버전으로 향상(upgrade)시켜야 한다.

이 갱신(update)용 파일들은 여기에서 다운 받을 수 있다.

fce34e8e8ab6a54d07c46d2626529e22 SRPMS/udev-039-10.FC3.1.src.rpm
e86fc1ec12edddd4f7ca68bfebe956cc x86_64/udev-039-10.FC3.1.x86_64.rpm
8b69da0b3adb624a11fc8185f98bada6 x86_64/debug/udev-debuginfo-039-10.FC3.1.x86_64.rpm
7df95371172d0b52452df76612cf674d i386/udev-039-10.FC3.1.i386.rpm
9897ebb971ab099de04c9ceb1ad31b57 i386/debug/udev-debuginfo-039-10.FC3.1.i386.rpm

이 업그레이드는 Update Agent로도 수행할 수 있다; ‘up2date’ 명령으로 Update Agent를 기동할 수 있다.

휘도라에서의 udev

By Harald Hoyer

본 문서는 udev의 비밀과 휘도라에서 작동하는 방법을 밝히려 한다.

Udev는 Dan Stekloff <dsteklof@us.ibm.com>, Kay Sievers , 그리고 다른 많은 분들의 도움을 받고 Greg Kroah-Hartman <greg@kroah.com>이 개발했다.
udev homepage와 the Linux-hotplug-devel mailing list https://lists. sourceforge.net/lists/listinfo/linux-hotplug-devel가 주요 개발 자원이다.

Udev가 하는 일은?

udev는 실제로 존재하는 디바이스에 대한 파일만을 포함하는 동적 디바이스 디렉토리를 제공한다. 보통 /dev/ 디렉토리에 있는 디바이스 노드 파일들을 만들거나 제거하고 혹은 네크워크 인터페이스에 새 이름을 붙여준다(or it renames network interfaces.).

hotplug 서브시스템의 일부로서, 만일 커널 디바이스가 추가되거나 시스템에서 제거되면, udev가 실행된다. 디바이스 생성시, udev는 라벨, 시리얼 번호, 또는 버스 디바이스 번호와 같은 디바이스 속성을 수집하기 위해 주어진 디바이스의 sysfs 디렉토리를 읽는다. 이 속성은 디바이스의 고유한 이름(uni-que name)을 결정하는 열쇠(keys)로 사용될 수 있다. udev는 시스템에 존재하는 디바이스에 대한 데이터베이스를 유지한다. 디바이스 제거시, udev는 삭제될 디바이스 파일을 찾기 위해 데이터베이스를 검색한다.

모듈이 적재되면, hotplug에 의해 udev가 호출되고, 디바이스가 추가되거나 제거된다. 만일 디바이스 노드가 드라이버와 통신할 수 있는 메이져와 마이너 번호(major and minor number)를 포함하고 있는 “dev” 파일을 드라이버가 제공하면, udev는 /sys/안을 들여다본다. 디바이스 노드 파일명과 심볼릭링크(symlinks)를 지정하는 /etc/udev/rules.d/디렉토리에 있는 udev 규칙을 살펴본후, 디바이스 노드는 /etc/udev/permissions.d/에 지정된 허가(perm-issions)를 갖고 /dev/에 생성된다.

디바이스 노드 생성, 제거, 혹은 네트워크 디바이스의 이름을 새로 붙인 후, udev는 /etc/dev.d/아래 디렉토리 트리(directory tree)에서 프로그램을 실행한다. 프로그램의 이름은 알아보기 쉽게 .dev란 접미사를 붙여야 한다. hot-plug 환경 변수에 더하여, DEVNAME도 생성된 노드의 이름이나 네트워크 디바이스의 새로 붙여진 이름이 실행된 프로그램에 이용될 수 있도록 보내진다(be exported). 모든 디렉토리에 있는 프로그램은 사전적 순서로 정렬되는 반면, 디렉토리는 다음 순서로 조회된다:

• /etc/dev.d/$(DEVNAME)/*.dev
• /etc/dev.d/$(SUBSYSTEM)/*.dev
• /etc/dev.d/default/*.dev
Udev가 휘도라에 어떻게 통합되는가?

initrd / initfs

mkinitrd는 /sbin/udev.static를 initrd /sbin/udev에 복사하고 /sbin/udev start에 심볼릭 링크를 한다(symlink).

커널이 부팅한 후, initrd의 내쉬 스크립트(nash script)를 실행한다. 이것은 tmpfs 파일 시스템을 /dev/에 마운트한다. hotplug대신에, /sbin/udev는 initrd 단계(phase)에서 호출된다. udevstart는 디바이스에 대한 모든 디바이스 노드를 생성하는 데, 이 디바이스는 커널에 컴파일(compile)되고 그 모듈은 내쉬(nash)에 의해 적재된다.

문제점

전(whole) udev와 hotplug 하부구조(infrastructure)가 initrd에 이용될 수 있는 것은 아니다. 따라서, hotplug 스크립트, udev 규칙, 허가(permissions), 그리고 /etc/dev.d/ 스크립트가 커널이 보낸 어떠한 hotplug event에 대해서든 모두 실행되는 것은 아니다.

rc.sysinit

제일 먼저, SELinux가 적재되고 활성화되면, /dev/의 문맥이 설정(set)된다. rc.sysinit는 /sbin/start_udev를 호출한다. start_udev는, 아직 마운트된 것이 없다면, tmpfs 파일시스템을 /dev/에 마운트시킨다. 이 때, 모듈 자동적재가 필요하거나 커널 모듈이 없는 곳에 디바이스 노드를 생성한다. 그리고나서, /sbin/udevstart는 다시 호출된다. 즉, 전 udev와 허가(permissions)을 적용하기 위해, initrd 단계에서 hotplug event를 모의 실험한다(? simulate). 그리고, rc.sysinit는 /sbin/kmodule의 결과물를 분석하고(parse) 모든 모듈을 적재한다. 이것은 컴퓨터에서 발견된 모든 하드웨어에 디바이스 노드를 제공할 것이다.

콘솔 사용자 허가(Console User Permissions)

디바이스노드가 생성될 때마다 /etc/dev.d/default/pam_console.dev가 호출되어, 디바이스 노드의 파일명(선택적으로 심볼릭 링크도 같이)과 함께 /sbin/ pam_console_setowner를 호출한다. 이것은 /etc/security/console.perms에서 지정한대로 콘솔 사용자를 위한 허가를 설정한다.

휘도라에서 udev를 커스터마이징하기

udev와 udevinfo의 매뉴얼페이지를 읽어보자. RPM 패키지 파일을 수정하지 말자.

새 규칙

새 규칙은 /etc/udev/rules.d/에 .rules로 끝나는 파일에 있어야 한다. 50-udev.rules은 사용하지 마라. 지지받고 선호받는 방법은 “NAME” tag없이 규칙을 생성하고 “SYMLINK”만을 만드는 것이다.

규칙 작성법에 관한 좋은 문서는 http://www.reactivated.net/udevrules.php에서 찾을 수 있다.

허가

새 허가는 /etc/udev/permissions.d/에 .permissions로 끝나는 파일에 있어야 한다. 50-udev.permissions는 사용하지 말자.

그러나 자신의 디바이스 노드의 사용를 간절히 원한다면!

원하는 디바이스 노드를 /etc/udev/devices/에 놔두자. 그러면 /dev/에 복사될 것이다. 만일 기본 실행으로 처리 되야 한다고 생각되면, a bugzilla entry에 의견을 올리자.

/dev/없이 udev를 업데이트하기

아나콘다나 복구 CD없이 업그레이드하는 단계(추천하고 싶지 않다):

• kernel-2.6을 시작한다
• /sys/가 마운트된 것을 확인한다
• 최신 initscripts 패키지를 설치한다
• 최신 udev 패키지를 설치한다
• /sbin/start_udev를 실행한다
• 최신 mkinitrd 패키지를 설치한다
• 최신 kernel 패키지를 설치한다
• 혹은 기존 커널에 대해서 mkinitrd 를 실행한다

initrd 없는 udev

보통 때처럼 휘도라 코아를 설치하고 재부팅한다. 다음 명령을 실행한다

mkdir /tmp/dev
mount --move /dev /tmp/dev
sbin/MAKEDEV null console zero
mount --move /tmp/dev /dev

initrd 없이 커널을 설치하고 재부팅한다.

SELinux 오류가 발생하고 syslogd는 바라던 대로(as expected) 동작하지 않을 것이다.



휘도라에서의 현 문제

udev에 대하여 알려진 모든 버그
Nvidia

빠른 해결: 만일 rhgb가 필요치 않으면, 단지 /etc/rc.local에 nvidia 모듈을 적재한다.

만일 udev>=032-5이면, nvidia 모듈을 적재한다:

cp -a /dev/nvidia* /etc/udev/devices
chown root.root /etc/udev/devices/nvidia*

이 문제에 관련된 버그질라는 133900이다.

Palm Pilot

만일 udev >= 032-5이면, 다음 명령을 실행한다:

ln -s ttyUSB1 /etc/udev/devices/pilot
ISDN
만일 udev >= 032-5이면:

/sbin/MAKEDEV -d /etc/udev/devices isdn


Copyright © 2003-2004 Red Hat, Inc. All rights reserved.
The Fedora Project is not a supported product of Red Hat, Inc.
Legal | Trademark Guidelines
This page last modified at: 2004/11/08 16:28:47
2010/08/01 23:38 2010/08/01 23:38
acpid-커널이 전원을 관리
dep1000-고속연산을 위한 aep1000/aep2000 코프로세서드라이버
anacron-
apmd-배터리를 필요로 하는장치에 사용(랩탑)
atd-특정시간에 지정명령어실행,시스템부하가 적을시 배치명령실행
autofs- 파일시스템이용시 자동마운트,이용안할시 자동언마운트
bcm5820-하드웨어 암호의 엑셀레이터 제공
chargen-슈퍼데몬 내부의 서비스에 접속이 끊길때까지 문자를 생성한다
cpuspeed-동적 CPU speed 데몬 실행
crond- 리눅스용 스케쥴러 데몬입니다.
cups-공동유닉스 인쇄시스템을 위한 실행,종료스크립트
cups-lpd-cups의 통신에 있어서 물려받은 lpd프로토콜에서의 어플리케이션사용 허용여부
daytime-현제시스템시간을 Wed Nov 13 22:30:27 EST 2002와 같이 출력할때
dc client-Distcache is a Distributed SSL Session Cache Client Proxy
dc server-Distcache is a Distributed SSL Session Cache Server
dovecot-Dovecot Imap Server
echo-echo's characters back to clients
gpm- 마우스 드라이버 데몬 입니다.
httpd- Web 서버 데몬 입니다.
innd-유즈넷뉴스서버로 지역뉴스서버를 설정
iptables- 방화벽 설정 데몬 입니다.
irda-장치간의 적외선 통신 제공
irqbalanced-멀티프로세서체제에있어 CPU간의 인터럽트를 분리함
isdn-isdn
ktalk-talk서버의 KDE버젼
kudzu 새로운 하드웨어가 추가됐을 때 이를 검색해주는 데몬입니다.
lisa-끝난 사용자시스템을 실행시키는 데몬
mdmonitor-RAID모니터링 관리
mdmpd-멀티패스장치 모니터링
messagebus-시스템이벤트를 브로드캐스팅
micorcode ctl-스크립트를 CPU microcode에 적용
named - BIND 데몬 입니다 (Domain Name Server)
netdump-네트워크콘솔을 제외한 콘솔을 초기화
netfs- 넷트웍 파일 시스템 데몬 입니다.
netplugd-논스태틱네트워크인터페이스를 관리하는데몬
network- 리눅스의 네트웍 데몬 입니다. 이것의 체크를 지우시면 인터넷이 되지 않습니다.
nfs-nfs서ㅓ로 작동할수있게함(보안상문제있음)
nfslock-rpclockd와rpcstatd를 실행해줌,nfs를 사용하지않을시 보안상문제로 옵션을 끈다
ntpd-네트워크타임프로토콜로 컴퓨터클라이언트나 서버의 시간을 다른 서비스로 부터 동기화함
pcmcia-랩탑에서 이더넷이나모뎀을 제공하는데 사용
portmap-리모트프로시져콜에관여하는 데몬,NFS나NIS사용시 선택
postgresql-postgresql DB를 이용하고자할때 씀
psacct-프로세스 계산
random시스템 난수발생에 필요한 데몬입니다.-
rawdevices-raw장치할당스크립트,오라클어플리캐이션에서 사용
readahead-startup 을 하는동안 프로그램들을 메모리에 로드시킴
rhnsd-업데이트를 체크해줌
rpcgssd-NFSv4클라이언트를 위한RPCSEC GSS관리하는 사용자레벨데몬
rpcidmapd-NFSv4를 위한 유저레벨 데몬
rpcsvcgssd-NFSv4서버를 위한 RPCSEC GSS관리하는 사용자 레벨데몬
rsync-FTP서버인rsync서버
sendmail-메일 서버 데몬 입니다.
services-인터넷슈퍼데몬서비스
sgi fam-파일교환시 모니터링
smartd-자신을 모니터링하고 기술보고서 작성
smb-삼바서버의 활성화를 하게함
snmpd-단순한 네트워크 관리 프로토콜
snmptrapd-단순한네트워크관리 프로토콜트랩
squid-인터넷오브젝트캐시로 요청되는 인터넷 오브젝트 저장
sshd-ssh 서버
syslog-/var/log에 시스템 로그파일 기록
time -시간서버
time-udp
tux-커널 기반의 스레드http서버
vncserver-vnc서버
vsftpd -ftp데몬
xfs- x폰트 서버를 위한 데몬
xinetd-슈퍼데몬
yppasswdd-NIS클라이언트 사용자가 패스워드를 변경가능하게 해줌
ypserv -표준 NIS /YP 네트워크 프로토콜 서버
ypxfrd -yp맵의 전송을 가속시킴
yum -프로그램 업데이트 데몬
2010/08/01 23:38 2010/08/01 23:38

1. rpm 설치하기
1) 설치하기
-U 옵션 : 기존의 것을 삭제하고 업그레이드하며 아무 메시지도 보여주지 않습니다.
-Uv 옵션 : 기존의 것을 삭제하고 업그레이드하며 패키지 이름을 보여 줍니다.
-Uvh 옵션 : 기존의 것을 삭제하고 업그레이드하며 그 설치 진행과 과정 # 표시로 자세히 보여줍니다.
// **. 보통 (ivh 보다) -Uvh 옵션을 쓰면 됩니다.
// **. 설치할경우 패키지파일전체 이름을 주고, 삭제/조회는 rpm 버젼 번호까지만 주면 됩니다.
mrtg 패키지전체 이름 : mrtg-2.9.17.i386.rpm // **. i386 은 386 CPU 호환 버젼을 말합니다.
mrtg 패키지 버젼 : mrtg-2.9.17

예)
# rpm -U mrtg-2.9.17.i386.rpm
# rpm -Uv mrtg-2.9.17.i386.rpm
# rpm -Uvh mrtg-2.9.17.i386.rpm

부가 옵션들
--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

# rpm -e tux // **. 삭제가 안됩니다.
error: "tux" specifies multiple packages
# rpm -e tux --allmatches // **. --allmatches 옵션으로 지웁니다.

--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 으로 설치 안되었을때 검색 합니다

2010/08/01 23:37 2010/08/01 23:37
기본 언어 타입 정해주기

/usr/lib/perl5/5.6.1/cgi.pm 파일을 보면
아래와 같이 언어 타입을 지정해 놓은 부분이 있다.
$self->charset('iso-8859-1');

위 부분대신 아래와 같이 한글타입으로 변경해 주면 된다.
$self->charset('euc_kr');
2010/08/01 23:37 2010/08/01 23:37

DSO방식 APM, Zend, GD설치

새로운 시스템(노코나 방식, fedora core3(64bit))에 거의 소스로 설치함.

■ 설치환경 : Zeon 2.8, Fedora Core3 64bit
■ 사용프로그램
mysql-3.23.58
apache_1.3.33
php-4.3.11
mod_throttle-3.1.2
ZendOptimizer-2.5.7-linux-glibc23-amd64

gd-2.0.33
libpng-1.2.8
jpeg-6b
freetype-2.1.9

설치순서
1. mysql
2. apache(DSO 방식)
3. libpng, jpeg, freetype, 마지막에 gd
4. php, Zend
5. mod_throttle


1. mysql 소스로 설치

tar xvzf mysql-3.23.58.tar.gz
cd mysql-3.23.58

./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-charset=euc_kr 엔터
make
make install

*** 여기서 초반에러를 방지하기 위해서 ****
adduser mysql <-- mysql이란 계정을 생성
passwd mysql <-- 엔터 하고 비밀번호 아무거나..
cd /home/
chmod 600 mysql <-- 권한 설정
cd /usr/local
chown -R mysql.mysql mysql <-- mysql의 하위 폴더까지 한번에 소유자와 그룹을 mysql로 변경
cd /usr/local/mysql/bin
./mysql_install_db <-- data 디렉토리(DB)를 생성, 반드시 한번만 실행
cd /usr/local/mysql
chown -R mysql.mysql data <-- 새로 생성된 data 디렉토리를 소유자와 그룹을 mysql로 변경
./safe_mysqld --language=korean & <-- mysql데몬을 백그라운드로 실행
cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld <-- 컴 부팅시 mysqld 데몬 시작
chmod 755 /etc/rc.d/init.d/mysqld
chown mysql.mysql /etc/rc.d/init.d/mysqld <-- 데몬 소유자,그룹 변경
./mysqladmin -u root password 새로운비밀번호 <-- mysql 비밀번호를 생성

2. apache(DSO 방식) 소스로 설치
./configure --prefix=/usr/local/apache --enable-rule=SHARED_CORE --enable-module=so --enable-shared=max
make
make install;

3. libpng, jpeg, freetype, 마지막에 gd

- libpng 설치
tar -xvzf tar xvzf libpng-1.2.8.tar.gz
cd libpng-1.2.5
cp scripts/makefile.linux Makefile
make test
make install

- jpeg 설치
tar ?zxf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure --prefix=/usr
make
make test
make install

마지막 amke install 시에 에러가 발생할것입니다.
이때는 우선 make clean 하고,
cjpeg.1 파일이 들어갈 폴더를 만들어준 다음 다시

make -> make install

필히 참고)
이때 에러메시지 내용은 대략 아래와 같습니다.
/usr/bin/install: cannot create regular file `/usr/local/man/man1/cjpeg.1'
: 그런 파일이나 디렉토리가 없음
/usr/local/man/man1폴더가 없어서 찾지는 못하는 경우입니다.
이때는 /usr/local/man/man1폴더를 생성후에 다시 설치 해주시면 됩니다.


make install-lib
make install-headers

- freetype 설치
tar -xvzf freetype-2.1.3.tar.gz
cd freetype-2.1.3
./configure
make
make install

- GD 설치
tar xvzf gd-2.0.9.tar.gz
cd gd-2.0.9
./configure
make
make install


4. php, Zend 설치
./configure
--with-apxs=/usr/local/apache/bin/apxs
--with-config-file-path=/usr/local/lib
--with-gd=/usr/local
--with-jpeg-dir
--with-png-dir
--with-freetype-dir
--with-mysql=/usr/local/mysql
--with-zlib --with-zlib-dir=/usr/lib64/
--enable-track-vars
--enable-ftp
--with-language=korean --with-charset=euc_kr
--enable-magic-quotes --disable-debug --enable-gd-imgstrttf
--enable-mbstring=kr
make
make install

zend 설치
ZendOptimizer-2.5.7-linux-glibc23-amd64
./install

5. mod_throttle(http://www.snert.com/Software/mod_throttle)
tar xvfz mod_throttle312.tgz
cd mod_throttle

그리고 나서 설치를 하시면 됩니다.
# make install

그런데 여기서 잘 살펴보아야 할점을, 설치를 하는경우 apxs라는 파일을 사용하는데 그것은 아파치의 bin폴더에 있습니다.

보통 저 경로를 지정하지 않았을 경우, 에러가 나게 되지요
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
따라서, 압축을 푼 폴더로 이동을 하신후에
#PATH=$PATH:/usr/local/apache/bin
#export path
저 명령을 내리십시오.

2010/08/01 23:37 2010/08/01 23:37
* script 삽입 공격을 당했는지 확인하는 쿼리

DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN

exec ('select ['+@C+'] from ['+@T+'] where ['+@C+'] like ''%<script%</script>''');
-- print 'select ['+@C+'] from ['+@T+'] where ['+@C+'] like ''%<script%</script>'''

  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;

* 위의 공격을 당했을 때 복원하는 쿼리 (100% 다 되는 것은 아님 - 별도 확인 필요)

* 해킹 시 길이가 긴 경우에는 짤리고 들어가는 현상이 발생함 - 이 경우에는 복원을 해도 원상복구가 안됨

* 백업 받은 것을 복원하는 수 밖에는 없음

DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script%</script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;


DB injection 공격?
구글에서 <script src= 0.js 라고 검색하면 놀랄 정도로 많은 사이트들이 DB 공격을 받았음을 확인 하실 수 있을겁니다.
제가 관리하는 사이트 또한 위와같은 스크립트 삽입되어 수많은 사이트를 찾아 다니며 복구하고 나름대로 보안하는 방법을 접하게 된 것을 올려 봅니다.


1. 공격 유형 :
SQL injection 홈페이지 상의 DB사용하는 페이지를 공격 즉, 웹소스 취약한 곳을 통해 DB를 공격.
특수 코드 삽입해서 DB에 스크립트를 삽입하여 접속하는 사용자에게 악성코드를 설치하는 유형.


2. 조치 시 주의 사항
1) 홈페이지 변조를 통해 악성코드 링크를 삽입한게 아니라, SQL injection 기법을 이용해 DB 컨텐츠에 삽입한 것입니다.
2) 조치 시 DBA 의 도움을 받는게 좋습니다.
3) 공격 때문에 기존의 데이터가 일부 덧씌워져 변경되었을 수 있습니다. 이럴 땐 백업의 도움을 받아야 겠지만, 일부 데이터의 유실은 어쩔 수 없을 듯...
4) 근본 원인은 사이트가 SQL injection 공격에 취약하게 개발되어 있어서 그렇습니다. 공격 포인트를 파악해서 외주개발 업체, 혹은 내부개발팀을 통해 소스를 수정하세요.
5) 소스를 수정할 수 없는 경우 웹 방화벽이 도움이 될 수도 있습니다. 그러나, 제품 도입시 면밀히 검토하실 필요가 있습니다. 단순 패턴 매칭 형태를 사용해서, 보유패턴과 1byte 만 틀려도 탐지 못하는 제품이 몇 개 있더군요.


3. 공격으로 생긴 DB table 삭제
comd_list 테이블 삭제
ahcmd 테이블 삭제
foofoofoo 테이블 삭제
Reg_Arrt 테이블 삭제
comd_list 테이블 삭제
D99_CMD 테이블 삭제
D99_TMP 테이블 삭제
Kill_kk 테이블 삭제
jiaozhu 테이블 삭제


4. 삽입 스크립트 제거 복구
DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype<object id=sayboxtistorycom4534743 codeBase=http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0 height="100%" width="100%" classid=clsid:d27cdb6e-ae6d-11cf-96b8-444553540000> <object width="100%" height="100%" wmode="transparent" id="sayboxtistorycom4534743" src="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestsayboxtistorycom4534743&id=453&callbackId=sayboxtistorycom4534743&host=http://saybox.tistory.com&float=left&" allowscriptAccess="always" menu="false" type="application/x-shockwave-flash" ></object></object>= 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://도메인주소/s.js></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;

'스크립트 부분은 삽입된 스크립트를 입력


5. 보안 적용 1 - MSSQL 메모리에서 위험한 sp들을 내린다.
보안상 위협이 될 수 있는 개체들에 대하여 일반 사용자 그룹의 사용권한을 제한한다.
SP 등록해제는 위험을 감안해야 하므로 메모리에서만 내린다. 단점, 재부팅되거나 DB 재시작시 다시 아래 쿼리 실행 할것!

dbcc xp_cmdshell(free)
dbcc xp_dirtree(free)
dbcc xp_regdeletekey(free)
dbcc xp_regenumvalues(free)
dbcc xp_regread(free)
dbcc xp_regwrite(free)
dbcc sp_makewebtask(free)


6. 보안 적용 2
무엇보다 DB 인젝션이 발생한 원인인 로그인, 회원가입, 게시판 등 사용자가 DB를 접하게 되는 소스 개발시 특수 문자 보안 적용 안된 경우가 가장 유력하다.
로그인, 회원가입, 아이디 비번찾기, 게시판 등이 개발자가 개발하면서 DB를 공격할만한 특수 문자에 대한 차단 기능을 적용하지 않은 문제로 판단됨. 소스를 모두 개선 해야함.

-subroutine-
2010/06/07 14:44 2010/06/07 14:44
아파치 인증 만들기 .

vi httpd.conf 파일을 편집한다.

대충 330 줄 쯤에 있다
---------------------------------------------------------------------------
# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
#
    AllowOverride all

#
# Controls who can get stuff from this server.
#
    Order allow,deny
    Allow from all  <------------------  all 로 바꿔준다.
</Directory>

#
# UserDir: The name of the directory which is appended onto a user's home
----------------------------------------------------------------------------




해당디록토리에  .htaccess 파일 생성해준다.

vi .htaccess
-------------------------------------------------------------
# 인증창의 이름을 지정하는 곳입니다. 즉, 웹 인증창에 보일 이름을 적으시면 됩니다.
AuthName "테스트"

# 인증타입을 설정하는 곳입니다. 기본적으로 Basic 입니다.
AuthType Basic

# .htpasswd 유틸을 사용하여 .htpasswd 파일이 저장될 위치를 지정하는 곳입니다.
AuthUserFile /usr/local/apache/htdocs/.htpasswd

# 그룹 인증을 위한 설정 부분입니다. 만일, 그룹 인증을 하시려면 그룹명을 입력하시면 됩니다.
AuthGroupFile /dev/null


# GET POST 방식의 접근만을 허용하는 부분입니다.
<Limit GET POST>

# 인증된 사람만이 접속을 허용하는 부분입니다.
require valid-user

</Limit>
---------------------------------------------------------------------


.htpasswd 파일 만들기

/usr/local/apache/bin/htpasswd -c .htpasswd 아이디 [엔터]
passwd :          [엔터]


-c 옵션은 처음 할때만 사용한다.
-c 옵션이 있는 상태에서 사용하면 덮어 씌운다. 초기화 비슷

아이디가 같은 경우 패스워드 업데이트한다.


아파치 재 가동한다..

이제 적용된 홈페이지 들어가본다 ..

암호하고 페스워드를 물어볼것이다.
2010/06/07 14:40 2010/06/07 14:40
웹서버의 로그파일이 커지면 속도가 떨어지게 됩니다.
접속자가 많은 경우는 1시간 간격으로 돌리는 것도 나름 괜챦아요.

/etc/cron.hourly 디렉토리에 logrotate-hourly 라고 파일을 만들어서
가장 사이즈가 큰 넘만 rotate 시켜줍니다.

#!/bin/bash
/usr/sbin/logrotate -f /etc/logrotate.d.BACKUP/apache-hourly

물론 logrotate script를 돌리기전에 prerotate에서 통계처리를 해주는 쎈쓰도^^

/etc/logrotate.d.BACKUP/apache-hourly

/usr/local/apache/logs/website.com-access_log {
        daily
        rotate 10
        prerotate
                /usr/local/apache/htdocs/webalizer/webalizer -c /usr/local/apach
e/htdocs/website-log.conf
        endscript
        postrotate
                /usr/local/apache/bin/apachectl restart
        endscript
}
2010/06/07 14:38 2010/06/07 14:38
/etc/ssh/sshd_config 파일에서 Port를 22에서 2200 이나 다른 것으로 변경

/etc/init.d/sshd restart 명령으로 sshd 데몬을 재 실행

이후에는 sshd client에서 22번 포트(기본 포트)로는 접속할 수 없고
2200으로 포트를 지정해야지만 접속이 가능 함.
2010/06/07 14:36 2010/06/07 14:36