IT이야기2009. 3. 9. 23:53
웹프로그래밍을 할 때, 웹브라우저명(Agent)이나 레퍼러(Referer) 정보를 화면에 출력할 경우가 있다. Request header의 웹브라우저명, 레퍼러를 누구나 쉽게 변경(위조)가 가능하다는 것을 알면서도 특별한 조치없이 바로 echo하는 경우가 많다. 일반적인 브라우저명이라면 다음과 같은 형식이다. 그대로 echo한다고 해도 문제가 되지 않을 것이다. 

Mozilla/5.0 (X11; U; Linux i686; ko; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4

그러나 다음과 같이, 브라우저명에 자바스크립트 등의 코드를 넣은다면 상황은 달라질 것이다. 피해는 XSS나 XSRF에 비해 미비할 수도 있겠지만 악의적인 임의의 자바스크립트를 실행할 수 있다.

<script>alert('hello')</script>

브라우저명에 실행가능한 형태의 코드나 자바스크립트를 넣는 것을 XAS(Cross Agent Scripting)라고 하며,
레퍼러에 넣는 것을 XRS(Cross Referer Scripting)이라고 부른다.

레퍼러를 변경해서 테스트해보자. FireFox에는 레퍼러를 변경할 수 있는 'RefControl' Addon( http://addons.mozilla.org/ko/firefox/addon/953 )이 있다. 설치 후 도구 -> RefControl Options -> Add Site 를 클릭한다.

RefControl

( Firefox RefControl Addon에서 Referer를 사용자가 설정하는 화면 )



단순히 <? echo $_SERVER['HTTP_REFERER']; ?>만 되어 있는 페이지의 경우 다음과 같이 자바스크립트가 실행되는 것을 확인할 수 있다.
XRS 임시 테스트 화면

( XRS 테스트 결과. 이 페이지는 테스트를 위해 임시로 만듬. 실제 존재하지 않음 )



XAS, XRS를 막기위해서 php의 경우 htmlspecialchars() 함수 등으로 특수문자(<, > 등)를 변환해야 한다.

[ 좋지 않은 php 코드 ]
<?
echo $_SERVER['HTTP_USER_AGENT'];
echo $_SERVER['HTTP_REFERER'];
?>

[ 안전한 형태의 php 코드 ]
<?
echo htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
echo htmlspecialchars($_SERVER['HTTP_REFERER']);
?>

※ XSS(Cross Site Scripting), CSRF/XSRF(Cross Site Request Forgery)에 대한 한글 문서는 많으나 XAS, XRS에 대한 글은 거의 없어 정리했다.

Posted by 좋은진호
일상2009. 3. 5. 18:22
'댓글 1개에 200원 기부하겠습니다.'에서 얘기한 4권의 책이다. 책의 저자나 책에서 소개된 분들은 함께 사는 것이 무엇인지를 실천하는 분들이다. "모든 행복은 남을 위한 마음에서 오고, 모든 불행은 이기심에서 온다."라는 말이 떠오른다. 모두 행복한 분들이다. 확실히.



MS 호주지사와 중국지사 이사였던 존 우드는 휴가기간에 네팔에 간다. 책을 읽고 싶어도 읽을 수 없는 아이들을 보게된다. 학교 도서관은 텅비어 있었고, 그나마 있는 책도 자물쇠로 된 감궈진 캐비닛에 보관되어 있었다. 존 우드는 여기서 깨닸는다. 자신의 미래는 MS보다는 이들을 위해 도서관을 마련해야겠다고. MS를 그만두고 '룸투리드' 재단을 설립한다. 이 재단을 통해 2008년 12월 현재 7000여개의 도서관, 760여개의 학교를 설립하고, 280만권의 도서를 기증한다. 280만권은 대구시 인구보다 많고, 대한민국 국회도서관의 책보다 많다.



국내 대학생('넥스터스')이 직접 인도의 사회적기업을 탐방한 이야기를 정리한 책이다. 거짓말 같이 아름다운 일들이 세상 곳곳에서 일어나고 있음을 볼 수 있다. 이 책은 사회적 기업을 소개하는 교과서이면서, 사회적기업을 만드려는 이들에게 실천서의 역할도 함께 한다. 우리나라에서도 사회적 기업의 혁명이 일어날 날이 빨리 오기를 바래본다.



'체 게바라'가 '알베르토 그라나도'와 함께 오토바이를 타고 남미 여행을 한 이야기이다. 영화로도 봤을 것이다. 여행하는 도중에 체 게바라는 변한다. 변화된 체 게바라의 모습은 산파블로 나환자촌을 방문했을 때 강하게 드러난다. 나환자촌에서 맞게된 생일날. 생일파티에 참석한 이들을 향해 짧게 연설을 한다.

"우리는 아메리카 대륙을 실체가 없는 나라로 쪼갠다는 것이 완전히 허구라고 믿고 있으며, 이런 여행을 통해 이런 믿음이 더욱 굳어졌다. 우리는 민족적 유사성을 가진 하나의 메스티조 민족이다. 라틴아메리카 연대를 기원하며 축배를 제안한다."



인도 캘커다의 〈칼리가트〉, 〈프렘 단〉에서 봉사활동하면서 만난 친구들을 소개한 이야기이다.
저자는 아무 생각없이 그냥 캘커타에 들어왔다가 발목 잡히듯이(?) 몇 개월간 봉사활동을 하게 된다. 힘든 나날의 연속이지만 결코 힘든 생활이 아니었을 것이다. 이미 '고통의 삶'은 '천국의 삶'으로 변했기 때문이다. 이 책에서 소개한 친구들은 과연 사람인가, 천사인가라는 의문이 든다. 눈물을 함께 나눈 친구들, 주기만 하는 것이 아닌 받을 준비도 된 친구들. 저자의 말처럼 우정은 언제나 플러스로만 쌓이는 '노 리미트 게임'이라는 것을 친구들 그리고 저자 자신도 보여주고 있다. 중요한 것은 저자 자신이 변했고, 책을 있는 독자도 변했다는 것이다.


Posted by 좋은진호
일상2009. 3. 3. 12:36
별도의 시간을 내지 않고 남을 도울 수 있는 방법을 생각하다가, 댓글과 트랙백의 수에 따라서 연말에 기부하기로 했다.  어떤 단체에 기부할 것인지는 아직 미정이다. 기부는 2009년에 쓴 글을 기준으로 시작되고, 액수는 200원에서 300원이다.
  • 댓글 1개에 200원 (글 1개에 25개까지. 아직까진 이렇게 달린 글은 없다. ^^)
  • 트랙백 1개에 300원
  • 방명록 1개에 300원
동전

이렇게 모아도 작은 돈일 수 있는데(현재 흐름상으로는 10만원 내외), 가만히 있는 것보다는 좋은 일 아닌가? 이제 첫걸음이다. 다른 블로거들도 참여했으면 좋겠다. 이 블로그가 시스템관련 내용이 위주라 그다지 많은 댓글이 달리지 않는데, 활동적인 블로그라면 기부액수를 줄여 참여해도 좋을 것 같다.

댓글을 통해 기부를 하려고 마음 먹은 것은 책 때문이다. 책이 나 자신을 변화시켰다. 책 한권 한권 읽을 때마다 나 자신이 예전의 내가 아닌 새로운 내가 되고 있음을 느낀다. '체 게바라'는 대학시절에 오토바이를 타고 남미 여행을 했다.  이를 책 '모터사이클 다이어리'에 엮었는데, 다음과 같은 문구가 있다.

˝아르헨티나 땅에 발을 디뎠던 그 순간, 이 글을 쓴 사람은 사라지고 없는 셈이다.
이 글을 다시 구성하며 다듬는 나는 더 이상 예전의 내가 아니다.
나는 생각보다 더 많이 변했다.˝

나도 변했다. 그래~ 책을 읽을 때마다 나도 변했다. '댓글 기부'를 하도록 마음 먹게한 책은 다음 포스팅에서 소개하겠다.

댓글을 달아주세요.

댓글이 늘어날수록 블로거님의 힘으로 좋은 곳에 돈을 보낼 수 있습니다.

Posted by 좋은진호
IT이야기2009. 2. 27. 13:37
꽃보다 남자

드라마 '꽃보다 남자' (이미지 출처 : esbada 티스토리 블로그)


드라마 '꽃남'을 본 적이 없다. 주위에서 F4, 구준표, 금잔디 얘기가 자주 들린다. 얘기를 해도 뭔지 알아 들을 수가 없지만. ^^ 'F4', '꽃남', '꽃보다남자' 등의 이름으로 도메인 등록한 것이 있는지 확인해봤다.

결과는?

$ ./whois_list.sh f4
f4.co.kr             등록 => 등록일: 2005. 01. 15.
f4.or.kr             등록 => 등록일: 2008. 11. 30.
f4.re.kr             없음
f4.pe.kr             등록 => 등록일: 2008. 03. 04.
f4.go.kr             없음
f4.kr                없음
f4.com               등록 =>  Creation Date: 17-nov-1999
f4.org               등록 => Created On:11-Dec-1998 05:00:00 UTC
f4.net               등록 =>  Creation Date: 27-may-2002

$ ./whois_list.sh 꽃남
꽃남.co.kr           없음
꽃남.or.kr           없음
꽃남.re.kr           없음
꽃남.pe.kr           없음
꽃남.go.kr           없음
꽃남.kr              등록 => 등록일: 2009. 01. 20.
꽃남.com             등록 =>  Creation Date: 31-jan-2009
꽃남.org             없음
꽃남.net             없음

$ ./whois_list.sh 꽃보다남자
꽃보다남자.co.kr     없음
꽃보다남자.or.kr     없음
꽃보다남자.re.kr     없음
꽃보다남자.pe.kr     없음
꽃보다남자.go.kr     없음
꽃보다남자.kr        등록 => 등록일: 2008. 09. 25.
꽃보다남자.com       등록 =>  Creation Date: 08-jan-2009
꽃보다남자.org       등록 => Created On:19-Nov-2002 09:53:15 UTC
꽃보다남자.net       등록 =>  Creation Date: 20-feb-2009

f4.or.kr은 2008년 11월 30일. 꽃남.kr, 꽃남.com, 꽃보다남자.com, 꽃보다남자.net은 드라마의 인기 시점과 맞아 떨어지는 2009년 1월~2월에 등록했다. f4.or.kr, 꽃남.kr, 꽃보다남자.com 도메인은 서비스가 되고 있다. 그러나 다른 것을 홍보하기 위한 용도의 서비스. '꽃보다여자'가 들어가는 도메인은 없었다.

2mb 도메인 이후 흥미롭게 찾아본 도메인이다. f4.kr 도메인은 아직 남았있다. 난 전혀 관심이 없는데, 누구 등록하실 분? ^^



Posted by 좋은진호
시스템이야기2009. 2. 26. 09:30

FreeBSD 7.0부터는 오픈솔라리스의 ZFS(Zettabyte File System)을 사용할 수 있다. ZFS는 파일시스템과 볼륨관리자가 통합되어 있는 장점을 최대한 살려 한두개의 과정만으로 파일시스템을 바로 사용할 수 있다. 또한 마치 찰흙을 붙였다 떼었다 하는 듯한 느낌으로 볼륨 관리의 유연성을 맛 볼 수 있다. 그러나 FreeBSD에서는 아직 실험적으로 동작중이며, IO 성능 또한 만족스럽지 못하다. 결국 FreeBSD에서 만큼은 미래를 위해 맛보기용 파일시스템로 즐기면 될 듯 싶다.

간단한 ZFS의 특징을 정리하면.

- 파일시스템 + 볼륨관리자가 통합되었다.
- 128비트 파일시스템이며, 디렉토리와 파일의 갯수에 제한이 없다.
- 미러링, 그리고 RAID기능에 해당하는 raidz를 지원한다.
- 물리적 disk를 쉽게 스토리지 풀에 추가할 수 있다.
- 상태 모니터링이 효과적이다. (iostat, status, history, get 등)
- 스냅샷 기능을 지원한다.

1. ZFS 풀과 파일시스템 생성 (zpool create, zfs create, zpool list, zfs list)

# zpool create data mfid0s1h
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
data                   31.8G    110K   31.7G     0%  ONLINE     -
# df -t zfs
Filesystem    1K-blocks    Used    Avail Capacity  Mounted on
data           32771968       0 32771968     0%    /data

zpool create 명령만으로 쉽게 '스토리지 풀'을 생성했다. 이 명령 하나만으로 바로 파일시스템을 이용할 수가 있다. 매우 간단하지 않는가?
리눅스의 LVM과 비교해보자. LVM은 PV 생성 -> VG 생성 -> LV 생성의 3과정을 거쳐야 한다. 1) 디스크나 파티션을 LVM으로 사용하겠다고 선언하는 PV(Physical Volume) 생성(pvcreate) 과정. 2) 이후 PV를 하나의 큰 덩어리로 묶는 VG(Volume Group) 생성(vgcreate) 과정. 3) 필요한 만큼만 떼어 내어 실제 사용가능한 파일시스템으로 만드는 LV(Logical Volume) 생성 과정. 이와 비교하면 zfs는 정말 간단하다.

이제 하나의 풀에 여러 파일시스템을 만들어보자.

# zfs create data/backup
# zfs create data/log
# zfs create data/photo
# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
data          182K  31.3G    22K  /data
data/backup    18K  31.3G    18K  /data/backup
data/log       18K  31.3G    18K  /data/log
data/photo     18K  31.3G    18K  /data/photo

data 풀에 data/backup, data/log, data/photo 파일시스템을 생성했다. 그런데 마운트포인트가 모두 /data 아래로 생성되었는데, 다른 곳으로 할 수는 없을까? zfs set 명령 하나면 바로 변경 가능하다. 또는 생성할 때 -o mountmpoint=/backup 옵션으로 지정할 수 있다.
(※ zfs get all 또는 zfs get mountpoint로 속성 정보를 얻을 수 있다.)

# zfs set mountpoint=/backup data/backup
# zfs list /backup
NAME          USED  AVAIL  REFER  MOUNTPOINT
data/backup    18K  31.3G    18K  /backup
# df -h -t zfs
Filesystem    1K-blocks    Used    Avail Capacity  Mounted on
data              31G      0B     31G     0%    /data
data/log          31G      0B     31G     0%    /data/log
data/photo        31G      0B     31G     0%    /data/photo
data/backup       31G      0B     31G     0%    /backup

위의 파티션을 보면 용량이 모두 31GB로 표시되었다. zfs의 각 파티션이 '스토리지 풀'의 최대 용량까지 함께 사용하기 때문이다. data/photo 파티션은 5G만 사용하라고 쿼터를 할당해보자. 이 쿼터는 허용치만큼 늘릴 수도 줄일 수도 있다. 리눅스의 LVM이 확장하는 것만 가능(lvextend)한 것과 비교하면 상당히 유연한 자세를 취하고 있다.

# zfs set quota=5g data/photo
# zfs list data/photo
NAME         USED  AVAIL  REFER  MOUNTPOINT
data/photo    18K  5.00G    18K  /data/photo
#
# zfs set quota=3g data/photo
# zfs list data/photo
NAME         USED  AVAIL  REFER  MOUNTPOINT
data/photo    18K  3.00G    18K  /data/photo
#
# df -h data/photo
Filesystem    Size    Used   Avail Capacity  Mounted on
data/photo    3.0G    128K    3.0G     0%    /data/photo

만약 다른 파티션에서 용량을 사용하게 되면 그 양만큼 다른 파티션은 사용할 공간이 줄게 된다. 아래를 보면 /data/log가 11G를 사용중이다. 그래서 다른 파티션은 31GB-11GB 뺀 용량이 전체 사이즈로 표현된다.

# df -h -t zfs
Filesystem     Size    Used   Avail Capacity  Mounted on
data            20G      0B     20G     0%    /data
data/log        31G     11G     20G    35%    /data/log
data/photo     3.0G    128K    3.0G     0%    /data/photo
data/backup     20G      0B     20G     0%    /backup

ZFS는 자체에 데이터 안정성을 높을 높이는 mirror와 RAID-Z 기능을 제공한다. mirror기능으로 풀을 만들어 보자.

# zpool create backup mirror mfid1 mfid3
# df -h -t zfs
Filesystem    Size    Used   Avail Capacity  Mounted on
backup         66G      0B     66G     0%    /backup

디스크는 SAS 73GB짜리이다. ufs 또는 zfs로 1개의 파일시스템을 만들면 66GB가 나온다. 2개 디스크인데, 132GB가 아닌 66GB로 표시되는 것은 mirror로 생성되었음을 보여준다. mirror로 설정되어 있는지 확인하는 방법은 뒤에서 다시 얘기하겠다.

2. zfs는 당신이 한 일을 모두 알고 있다. (zfs history)

# zpool history
History for 'data':
2009-02-16.18:32:06 zpool create data mfid0s1h
2009-02-16.18:33:23 zfs create data/backup
2009-02-16.18:33:31 zfs create data/log
2009-02-16.18:33:50 zfs create data/photo
2009-02-16.18:35:19 zfs set mountpoint=/backup data/backup
2009-02-16.18:41:17 zfs create -o mountpoint=/work data/work
2009-02-16.18:51:07 zfs set quota=5g data/photo
2009-02-16.19:00:09 zfs set quota=3g data/photo
2009-02-16.19:16:41 zfs set quota=5g data/photo
2009-02-16.19:21:36 zfs set quota=3g data/photo
2009-02-16.19:28:49 zfs destroy data/work

'data' 풀에 적용된 작업이 모두 나왔다.

3. 상태 살펴보기 (zpool iostat, zpool status)

# zpool iostat 2
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
data        11.4G  20.4G      8     63   881K  1.58M
data        11.6G  20.1G      0  1.75K  32.0K   128M
data        11.9G  19.9G      0  1.88K  64.0K   133M
data        12.1G  19.7G      0  2.09K  32.0K   128M
data        12.3G  19.4G      0  2.17K  64.0K   131M
data        12.6G  19.2G      0  2.20K  32.0K   137M
data        12.8G  18.9G      0  2.33K  32.0K   139M
data        12.9G  18.9G    610  1.49K  75.8M  77.8M
data        12.9G  18.9G    521  1.61K  65.0M  89.7M
data        12.9G  18.9G    615  1.35K  76.5M  71.2M

IO 상태를 2초간격으로 살펴본 것이다. 리눅스나 FreeBSD에서 iostat를 해봤을 것이다. iostat는 디스크별로 IO를 보는 것이며, zpool iostat는 '스토리지 풀'별로 살펴보는 것이다. 'data' 풀의 ONLINE상태를 확인할 수 있다.

# zpool status
  pool: data
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        data        ONLINE       0     0     0
          mfid0s1h  ONLINE       0     0     0

다음은 'backup'풀이 mfid1, mfid3 2개 disk를 사용하여 mirror되어 있는 것을 볼 수 있다.

# zpool status
  pool: backup
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        backup      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            mfid1   ONLINE       0     0     0
            mfid3   ONLINE       0     0     0

errors: No known data errors

4. ZFS 풀과 파일시스템 unmount & 지우기 (zpool destroy, zfs umount, zfs destroy)

파일시스템를 umount하기 위해서는 'zfs umount 파일시스템' 형태로 하며, 완전 제거는 'zfs destroy'로 한다. 파일시스템이 사용중이지 않으면 바로 unmount와 제거가 가능하다.

# cd /data/log
# zfs umount  data/log
cannot unmount '/data/log': Device busy
# cd /
# zfs umount  data/log
# zfs mount   data/log
# zfs destroy data/log

스토리지 풀 전체를 제거할 때도 마찬가지로 zpool destroy로 하면 된다.

# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
data                   31.8G   10.9G   20.9G    34%  ONLINE     -
# zpool destroy data
cannot unmount '/backup': Device busy
could not destroy 'data': could not unmount datasets
# cd /
# zpool destroy data
# zpool list
no pools available

5. FreeBSD에서는 ZFS를 서비스에 적용할 수 있을까? (성능 및 기타 사항)

ZFS는 최소 1GB이상의 메모리를 권장한다. 그러나 ZFS는 실제 많은 메모리를 사용하는 경우가 있다. 파일시스템 성능 체크를 하는 동안 panic: kmem_malloc(16305): kmem_map too small: 332353536 total allocated 같은 메시지를 뿌리면서 몇 번 다운되었다. i386 환경에서는 kmem address space(vm.kmem_size_max)의 최대값이 320M으로 되어 있다. 그러나 이 수치는 ZFS을 사용하기에는 낮은 수치이므로 기본값을 그대로 사용할 경우에는 커널 패닉이 발생할 수 있다고 한다. 그래서 나도 다운이 된 것이었다. vm.kmem_size는 read only값이므로 /boot/loader.conf 에 다음 2줄을 추가한다. 그리고 부팅을 하고, 필요시 이 수치는 더 늘리면 된다.

vm.kmem_size="512M"
vm.kmem_size_max="512M"

[ 부팅 전 ]
# sysctl -a|grep kmem
vm.kmem_size_scale: 3
vm.kmem_size_max: 335544320
vm.kmem_size_min: 0
vm.kmem_size: 335544320

[ 부팅 후 ]
# sysctl -a|grep kmem
vm.kmem_size_scale: 3
vm.kmem_size_max: 536870912
vm.kmem_size_min: 0
vm.kmem_size: 536870912

bonnie++로 Sequential Output/Input/Create, Random, Random Create의 성능 비교를 했다. ufs 파일시스템과 비교했을 때 각 항목별로 대략 2~5배 이하의 만족스럽지 못한 성능이 나왔다. zfs 기본 생성외에 mirror로 이뤄진 풀, raidz 로 이뤄진 풀도 낮은 수치인 것은 마찬가지였다.

그리고, 부팅 후 ZFS를 처음 create할 때는 다음과 같은 메시지가 나온다.

This module (opensolaris) contains code covered by the
Common Development and Distribution License (CDDL)
see http://opensolaris.org/os/licensing/opensolaris_license/
WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6

'WARNING' 부분이 보이는가? FreeBSD에서는 실험적인 상태이고, 성능 또한 상당히 낮으니, 편리함과 유연함을 높이 산다고 하더라고 서비스에 적용하기는 무리가 있다. 아직 FreeBSD에서는 재밌게 즐기면 된다. 즐기다 보면 미래에 적용해도 괜찮을 때가 오겠지...

6. 참고 자료

* ZFS 시작하기
* ZFS Tuning Guide
* FreeBSD 7.1 달라진 것 몇가지 (2009.1.20, 글 좋은진호)
* FreeBSD 7.0 사용기 (2008.3.7, 글 좋은진호, ZFS 사용기 일부 포함)



Posted by 좋은진호