2012-09-12

FreeBSD] 시스템 백업에 관한 얘기.



우선 쉘 스크립트를 작성하실 수 있어야 합니다.
(몰라도 가능하지만 모르면 그만큼 원하는 형태로 백업 받기 어려움)
또한 tar, rsync, cp, date, mysqldump (mysql DB라면), export(오라클이라면), mt, dump(테잎 백업) 등의 명령과 정기적으로 명령을 자동으로 실해시켜주는 cron 에 대해서도 아셔야 합니다.

두 가지 예만 들어들일테니 참고하시고 응용해보세요.
(테스트는 해보지 않고 쓰니 직접 확인해보세요.)


1. /etc 등 주요 설정과 관련된 디렉토리를 백업한다고 할 때


코드:

#!/bin/bash
#
# 파일명 : /root/bin/backup.sh
#
# /etc 전체를 백업디렉토리에 etc-년월일-시간.tar.gz 이름으로 백업한다.


DATE=`date +%Y%m%d-%H`
BACKUP_DIR="/backup/system"


# etc 백업

tar cvf $BACKUP_DIR/etc-$DATE.tar /etc
gzip $BACKUP_DIR/etc-$DATE.tar





중요한 것은 /backup 이나 /backup/system 디렉토리는 모두 퍼미션이 700으로 하셔야 합니다.

그래야 다른 일반 사용자들이 백업해둔 파일에 접근할 수 없는 것이죠.


코드:

# chmod 700 /backup
# chmod 700 /backup/system

# chmod 700 backup.sh
# ./backup.sh (이렇게 했을 때 /backup/system/ 에 백업됐는지 확인하시면 됩니다.)




2. 아래는 rsync를 이용해서 퍼미션과 소유자를 그대로 유지한 상태로 디렉토리를 통채로 복사하는 예입니다.



코드:


#!/bin/bash
#
# 파일명 : /root/bin/backup_dir.sh
#
# /home, /abcd 전체를 /backup/ 아래로 복사한다.


BACKUP_DIR="/backup"
DIR_LIST="/home /abcd"


for i in $DIR_LIST
do
   /usr/bin/rsync -avxH $i $BACKUP_DIR$i
done





코드:

# chmod 700 backup_dir.sh




rsync는 디렉토리안에 파일이 많으면 목록 인식하는데 시간이 걸린다는 것 참고하세요.

뭐 저런식으로 됐다면 crontab 에 넣어주면 백업을 해주겠죠.

아래는 매주 일요일 새벽 2:31과 2:51분에 backup.sh, backup_dir.sh이 실행되도록 하는 예입니다.



# crontab -e



코드:


31 2 * * 0 /root/bin/backup.sh > /dev/null 2>&1
51 2 * * 0 /root/bin/backup_dir.sh > /dev/null 2>&1





지금까지 하나의 예입니다.
모든 것을 다 알려주면 역시 님에게는 전혀 도움이 안되며, 서버 관리를 하시면 스스로 방법을 찾아내고, 문제를 해결하실 수 있어야 합니다.
이번 기회에 쉘 스크립트에 대해 배워보세요.



* 참고글
- [기초] 작업 자동화, cron 설정 http://coffeenix.net/board_view.php?cata_code=0&bd_code=97 (좋은진호)
- Bash를 이용한 쉘 스크립팅 완전 가이드 http://coffeenix.net/go.php?site_code=181&go=/doc/HOWTOs/html/Adv-Bash-Scr-HOWTO/ (번역:차현진)
- 시스템 백업 카테고리 http://coffeenix.net/?cata_code=54

FreeBSD]설치후 컴파일시 제일 많이 많이 나는 에러 대처 by 조성준


안녕 하세요? 조성준입니다


FreeBSD 설치시 Securty 부분을 설정 하고 나서 또는 /stane/ 안에 있는 설정 파일로 보안 부분 셋팅 후 커널 컴파일시


chflags: /kernel: Operation not permitted
*** Error code 1 (ignored)
mv /kernel /kernel.old
mv: rename /kernel to /kernel.old: Operation not permitted
*** Error code 1


위와 같은 에러가 납니다

그럼 다음과 같이 하시면 됩니다


vi /etc/rc.conf


kern_securelevel="1"
kern_securelevel_enable="YES"


로 되어 있는 부분을


kern_securelevel="2"
kern_securelevel_enable="NO"


로 바꾸신후 다시 하시면 됩니다

바꾸어도 않되면 위처럼 고치시고 Reboot 하세요

FreeBSD]새로운 디스크 설치


OpenBSD에서의 사항이니 FreeBSD에서도 거의 비슷하게 적용되겠지요??? ^^

===========================================
Title : OpenBSD에서의 하드드라이브 추가.
작성자 : l1nefeed(김기홍)
일자 : 2002.5월 24일. 할일없는 낮. -_-;
mailto : l1nefeed@codesum.org
===========================================


openbsd에서 새로운 하드드라이브를 추가하는 방법은 의외로 간단하다.
하지만 어렵게 느끼시는 분들도 계시길래, OpenBSD Crew! 의 이름으로 문서를 작성한다.

이 문서는 전적으로 BSD license를 적용한다.

자. 시작해 보자.

일단 새로운 하드드라이브를 컴퓨터에 부착하고 재부팅 했다고 가정한다.

dmesg | grep wd[0-9] 라고 쉘에 입력하면



$ dmesg | grep wd[0-9]

wd0 at pciide0 channel 0 drive 0: <QUANTUM FIREBALLlct08 13>
wd0: 16-sector PIO, LBA, 12416MB, 16383 cyl, 16 head, 63 sec, 25429824 sectors
wd1 at pciide0 channel 0 drive 1: <ST51080A>
wd1: 32-sector PIO, LBA, 1033MB, 2100 cyl, 16 head, 63 sec, 2116800 sectors
wd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2
wd1(pciide0:0:1): using PIO mode 4, DMA mode 2
dkcsum: wd0 matched BIOS disk 80
dkcsum: wd1 matched BIOS disk 81
root on wd0a
rootdev=0x0 rrootdev=0x300 rawdev=0x302

$



이와같이 wd0 과 wd1이 잡힌것을 볼수 있다. (하드드라이브의 종류에 따라 wd 로 잡히지 않을수도 있다.)

그럼 이제 새로 추가한 하드드라이브를 이식할 준비가 다되었다.
일단 이렇게 쳐보자.



# fdisk -i wd1



뭐라뭐라 뜨면서 MBR을 수정하겠냐 어쩌겠냐 라고 물어볼것이다.
당연히 y 다. 기존에 깔려있던 OS의 MBR을 가지고 있을 필요가 없다.
-i 옵션은 해당 disk의 MBR을 초기화 시켜주는 옵션이다.


그다음은 이제 해당 disk의 label을 정해주는 일이다.


잠시 알고 넘어갈 것은, freebsd를 써본 사용자라면 익숙한 내용이다.

bsd는 자신이 쓸 전체 파티션을 하나 잡는다. 그리고 그안에 파티션을 다시 나누어 OpenBSD에서 마운트하는 각 마운트 지점에 해당하는 파티션을 또 나눈다.
즉 커다란 하나의 파티션 안에 /home, /var, / 등의 파티션을 나눠 사용한다.
이 파티션을 레이블(label)이라고 부른다.
그래서 disklabel을 이용, 파티션을 재편집 해준다.

일단 여기선 wd1을 전체 사용하는걸로 생각하고 쓰겠다.

이제 이렇게 쳐 보자.


# disklabel -e wd1



옵션에서 감 잡았겠지만, wd1의 disklabel을 수정하라는 말이다.


참고로... disklabel -E wd1 을 하면 좀더 쉽게 label을 수정할수 있다.
즉 M(메가바이트) 나 G(기가바이트) 단위로 설정할수 있다는 말이다.
하지만 일단은 -e 에 대해 설명하겠다.


그럼 vi와 같은 간단한 text edit형식의 edit 란이 보이게 된다.



type: IDE
...bla...
sectors/track: 63
total sectors: 6185088
...bla...
16 partitions:

#        size   offset    fstype   [fsize bsize   cpg]
  c:  6185088        0    unused        0     0         # (Cyl.    0 - 6135)
  d:  1405080       63    4.2BSD     1024  8192    16   # (Cyl.    0*- 1393*)
  e:  4779945  1405143    4.2BSD     1024  8192    16   # (Cyl. 1393*- 6135)



자 이와 유사한 것이 보이는가..? 그럼 이제 수정할 준비가 다 되었다.


여기서 우리가 사용해야할 유틸리티가 있다. 바로 bc라는 계산기 이다. -_-;;
아직 자동화 라던지.. 보기 쉽게 보여주는 그런 툴은 openbsd에선 별로 볼수 없을것이다. -_-

이것이 openbsd의 단점이기도 하겠지만, 또한 매력 이기도 하다. -_-

아. 암산으로도 가능한 사람은 굳이 bc를 사용하지 않아도 되겠다.. -_-;;

우리가 계산해야 할 부분은 size와 offset의 사이즈를 계산해 내는것이다.
생각보다 간단하다. 미리 겁먹지 말자. -_-/

설치할때 보면 알겠지만, c: label은 그 하드디스크의 전체양을 보여주는 character device 다.

즉 지우고 싶어도 지워지지가 않는다. -_-;;

우리는 c: label에 있는 size 와 offset 을  토대로 label을 수정하면 된다.
일단 d: 와 e: label을 지운다. 지우는 명령은 vi와 동일하다.

그리고 나서 a: label을 추가 하겠다. 여기서는 전체 디스크를 사용한다는 가정하에서 말하는 것이다.

계산은 아주 간단하다. c: 에선 offset 이 0 이다. 하지만 새로운 label을 만들기 위해선 항상 앞쪽에 63 cyl 만큼 비워놔야 한다.

OpenBSD에서는 offset을 scetors/track 으로 정한다.
대부분의 하드디스크는 63 이 나올것이다.

그리고 저 값은 disklabel 을 실행할때 알아서 계산하여 뿌려주기 때문에 별 걱정할 필요는 없다.

그럼 전체 사이즈 6185088 에서 offset 63 만큼을 빼면 얼마일까..?
자 bc를 사용해서 계산 해 보라. -_-



답은 6185025 이다.



그럼 다 됐다. 새로 작성된 disklabel 이다.



#        size   offset    fstype   [fsize bsize   cpg]
  a:  6185025        63   4.2BSD     1024  8192    16
  c:  6185088        0    unused        0     0         # (Cyl.    0 - 6135)





위와 같이 되는가? 그럼 다 됐다.
:wq로 저장하고 나오면 된다.



자 여기서 openbsd의 숨겨진 편리함이 드러난다.
만약 사용자가 offset값을 잘못 설정하거나 size와 offset의 합이 c: 에 정의된 전체 크기와 맞지 않을시 종료했을땐 에러가 뜨면서 다시 수정하겠냐고 묻는 프롬프트가 뜬다. y 라고 치면 이전 화면으로 돌아가 다시 편집할수 있다.

얼마나 스마트 한가. -_-;/



아래는 필자의 데스크탑에 달린 wd1의 disklabel 이다.



# /dev/rwd1c:

type: ESDI
disk: ESDI/IDE disk
label: ST51080A
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 2100
total sectors: 2116800
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0



16 partitions:
#        size   offset    fstype   [fsize bsize   cpg]
  a:  2116737       63    4.2BSD     1024  8192    16   # (Cyl.    0*- 2099)
  c:  2116800        0    unused        0     0         # (Cyl.    0 - 2099)



(위에서 필자가 설명한 sectors/track 의 값이 63으로 나와있는것을 알수 있다. 자신의 하드디스크를 확인해 볼려면 disklabel /dev/wd0 이라고 쳐보자. 뿌려줄 것이다.)

자 이제 막바지 이다. 저장하고 빠져 나왔으면 file system을 새로 만들어 주면 끝이다.

openbsd는 default로 ffs를 사용한다.


이렇게 쳐 보자.



# newfs wd1a



왜 wd1a라고 하는지는 말안해도 알꺼라 믿는다. -_-;;
그러고 나면 파일시스템이 만들어 지면서 만드는 동안의 과정이 display 된다.
이 과정이 끝나고 나면 wd1는 이제 정상적으로 쓸수가 있다.

/etc/fstab을 편집하자. 별 다른 내용은 적을거 없고.. 그정도는 독자가 충분히 할수 있을꺼라 생각하여 자세히 적지 않겠다.


아래는 필자의 /etc/fstab이다.


$ cat /etc/fstab

/dev/wd0a / ffs rw,softdep 1 1
/dev/wd0d /var ffs rw,softdep 1 2
/dev/wd0e /home ffs rw,softdep 1 2
/dev/wd0f /usr ffs rw,softdep 1 2
/dev/wd1a /ebooks ffs rw,softdep 1 2

$



자 여기까지 추가해 줬으면 이제 다 끝났다. /dev/wd1a를 mount하여 사용하면 된다.
아니면 재부팅 해도 된다.



졸필의 글을 여기까지 읽어준 독자에게 진심으로 감사 드린다.

FreeBSD]사용자 로그인 컨트롤


사용자 로그인 컨트롤

Michael Lucas 저.
OpenBIRD, Inc. mailto:editors@openbird.com 역.

어떤 서버들은 각기 다른 목적으로 수백명이 사용하기도 합니다. 이들 각자에게 서로 다른 권한을 부여하고 싶을 땐 어떻게 할까요? FreeBSD는 몇가지 방법으로 사용자의 접근을 컨트롤 할 수 있습니다. /sbin/nologin은 어카운트 제한에 유용한 프로그램입니다. 더욱 일반적인 컨트롤은 /etc/login.access로 가능합니다.
여러분이 접하는 일반적인 경우중 하나는 사용자 ftp 억세스는 가능하게 하고 telnet 억세스는 못하게 하고자 할 경우입니다. 이것은 /sbin/nologin을 이용하여 간단히 해결할 수 있습니다. /sbin/nologin이 login shell로 지정된 사용자는 telnet과 SSH 접속이 불가능 한 반면 /etc/shells에 /sbin/nologin를 추가하면 ftpd를 통한 접속은 가능하게 됩니다.
사용자의 login shell이 /sbin/nologin로 지정 되었을때 telent과 SSH의 요구에 대해 아래와 같은 결과가 나오게 됩니다. :

  login: loserusername
  Password:
  Last login: Tue Mar 27 20:33:59 from localhost
  Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
    The Regents of the University of California. All rights reserved.

  FreeBSD 5.0-CURRENT (TURTLEDAWN) #3: Wed Mar 28 14:24:46 EST 2001

  This account is currently not available.
  Connection closed by foreign host.

이런 방식이 가진 문제점은 이미 시스템이 커넥션을 수행하고 해당 사용자에 대한 환경을 구축한다는 것입니다. shell을 셋팅하는 것은 이미 어느 정도의 프로세서 타임을 사용한 후에 행해지며, 사용자가 shell을 사용할 수 없다라는 것을 인식했을 때는 이미 많은 작업을 수행한 후 입니다.
CPU time이 문제되지 않는다면 /sbin/nologin만으로도 충분합니다. 이것은 유닉스 세계에선 이미 인정받은 보편적인 방법이며 거절당한 커넥션을 /usr/ports/sysutils/no-login에 로그로 남길수 있는 한층 진보된 버젼까지 나왔습니다.
그래도 덩치가 큰 설치작업에선 /sbin/nologin을 사용하는 것은 부담스러울수 밖에 없습니다. 사용자의 shell이 잘못 셋팅되는 경우는 관리자가 경험이 별로 없거나 일반적인 실수가 대부분입니다. FreeBSD는 /etc/login.acess 파일을 사용하여 훨씬 더 쉽게 할수 있습니다. 여러분이 FreeBSD 시스템에 연결을 시도할때 마다 login.access 파일을 체크됩니다. login.access를 적절하게 구성해 놓았다면 여러분이 필요한 모든 기능을 좀더 쉬운 방법으로 얻을수 있습니다.
/etc/login.access을 한번 보시기 바랍니다. 콜론으로 구별되는 세개의 필드가 있습니다. 첫번째 부분은 로그온을 할 수 있는 권한을 주거나(+) 안주거나 (-)를 결정합니다. 두번째 부분은 사용자나 그룹의 리스트입니다. 세번째 부분은 커넥션 소스의 리스트입니다. 이 파일은 "all"과 "all except" 구문을 사용하여 관리자가 기본적인 규칙을 만들수 있습니다.
시스템이 그룹과 커넥션 소스 둘 모두에 해당되는 첫번째 규칙을 찾으면 즉시 커넥션을 허락 또는 거절합니다. 따라서 규칙의 순서가 매우 중요합니다.
예를 들어 "wheel" 그룹의 멤버들과 root에게 console로 로그온 할수 있게 하려면 다음과 같이 사용하면 됩니다:

  +:wheel root:console

이 규칙의 재미있는 점은 다른 규칙들 또한 계속 진행된다는 것입니다. 다른 것들은 거절한다고 하는게 아니라 단지 이것들은 허락한다고 말하는 것입니다. 결국, console로 로그인을 시도하는 Joe Average는 이 규칙에 해당되지 않습니다. 이와 반대로 사용한다면 여러분은 좀 더 빨리, 관리자의 에러 위험을 덜면서 커넥션을 거절할 수 있습니다.

  -:ALL EXCEPT wheel root:console

Joe Average는 이 규칙에 해당되므로 그가 접속하면 바로 거절당합니다. 이런 규칙은 의도하지 않은 접속을 막아주며 뒤에 해당되는 규칙이 있는지 생각할 여지를 주지 않습니다. 허용하는 계정보다 거절해야 하는 계정을 리스트에 사용하는 게 더 좋습니다.
마지막 필드인 커넥션 소스는 상당히 다양하게 사용할 수 있습니다. 여기에는 여러가지 다른 타입을 사용할 수 있습니다: 호스트 네임, 호스트 어드레스, 네트워크 번호, 도메인 네임, LOCAL, 그리고 ALL 등.
먼저, ALL은 항상 해당되며 아래에 보는 것 처럼 EXCEPT와 함께 사용하여 특별한 의미를 나타냅니다.
호스트 네임은 DNS 와 hosts 파일에 따릅니다.

  -:ALL EXCEPT wheel:fileserver.mycompany.com

wheel 그룹은 파일 서버를 통해 로그인 가능하지만 그 외는 아무도 안됩니다.
DNS에 상관없다는 것 빼고는 호스트 어드레스도 비슷합니다. 만약 네임서버가 언제 해킹당할 지 걱정된다면 아마도 네임서버를 사용하길 원치 않을 것입니다.

  -:ALL EXCEPT wheel:169.254.8.3

아래의 경우는 .로 끝나는 모든 네트워크 번호가 해당됩니다.:

  -:ALL EXCEPT wheel:169.254.8.
         
만일 여러분의 방화벽에 관리 워크스테이션에서 들어오는 것을 제외한 모두를 접근금지시키고 싶다면 이렇게 할수도 있습니다.

  -:ALL EXCEPT wheel:ALL EXCEPT 192.168.89.128 192.168.170.33
         
가장 복잡한 것은 LOCAL입니다. 이것은 '.' 없는 호스트 네임은 모두 해당되며 일반적으로 로칼 도메인의 호스트들만을 의미합니다. 예를 들어 서버  www.blackhelicopters.org에서의 LOCAL의 의미는 "blackhelicopters.org"에 있는 모든(any) 호스트를 나타냅니다. 반면 접속하는 호스트가  "pedicular.blackhelicopters.org"이라는 호스트 네임을 갖더라도 그것의 IP  address(reverse DNS된 IP)가 pedicular.home.net과 같이 blackhelicopters.org 이외의 호스트명으로 변환(reverse DNS) 된다면 그 호스트는 LOCAL에 포함되지 않게 됩니다. 이것은 reverse DNS를 이용하기 때문입니다.
그러면 우리는 어떻게 이 모두를 한번에 할 수 있을까요? login.access에 다음 한줄로 다른 모든 리모트 커넥션을 거절하면서 관리자들이 서버에 로그온 할 수 있습니다.
  -:ALL EXCEPT wheel:ALL
         
이런 것은 각자의 환경에 따라 다릅니다: 많은 회사들은 스태프 그룹을 가지고 있습니다. 저의 경우는 미리 "dns" 그룹(도메인 존 파일을 수정할 수 있는 사람들)과 "www" 그룹(웹 서버 구성들을 수정할수 있는 사람들)으로 미리 환경 셋팅을 해 놓습니다. 우리 login.access은 아래와 같습니다.

  -:ALL EXCEPT wheel dns www:ALL
         
제 시스템의 login.access 파일은 아래와 같습니다.:

  -:ALL EXCEPT wheel:console
  -:ALL EXCEPT wheel dns www:ALL
         
여러분이 허용된 그룹에 사용자를 추가하지 않는 한 사용자들은 로그인 할수 없게 됩니다. 사용자의 login shell을 /sbin/nologin로 설정하는 것도 가능하지만 더 이상 필요치 않습니다. 천명의 사용자 계정을 수정하는 대신 하나의 파일을 건드리는 것으로 쉽게 해결되기 때문입니다.

FreeBSD]보안확인및 대처방법



퍼온글입니다.
  Posted: 2002-03-24 00:25



시스템을 관리하다 보면 많은 위험으로부터 공격을 받습니다.
이중에서 제일 관리자를 기분 나쁘게 하는 것이 바로 크래킹이죠.
지금 부터 서버에 백도어를 숨겨놓았나 확인하는 방법과 보안에 결함이 있나 확인하는 방법을 설명하겠습니다.

글은 모두 확인을해야 함으로 일정한 순서없이 진행하겠습니다.
물론 프비도 같은 방법으로 체크를합니다.


1. # grep -v "^#" /etc/inetd.conf --> 레드햇 7.1이전 버젼이 대부분이다.
하여 필요없는 서비스를 #로 주석처리하고 # killall -HUP inetd하여 데몬을 다시 실행한다.



2. #chattr +i /etc/inetd.conf

이것은 super-user만이 이 파일에대해 접근할 수 있도록 inetd.conf파일을 셋팅하는 것입니다. 셋팅이되면 수정,삭제 또는 리네임을 할 수 없습니다. 셋팅은 오직 super-suer만이 가능합니다.

이것을 풀기위하여는 -i 옵션을 주면 원상태로 됩니다.



3. 얼마나 많은 서비스들이 실행되는지 확인합니다.

#ps aux | wc -l

이것으로 서비스들을 확인하여 기록합니다.
이것을 다음에 예전 기록과 비교하여 이상한 서비스를 검출하기 위함입니다.



4. 스크립트 변경 후 확인

#netstat -na --ip



5. TCP Wrapper 사용

이것은 암호화는 지원하지 않지만 로그와 서버로의 접근을 제한 합니다.
이것은 telnet 또는 ftp와 같은 inetd서비스를 둘러싸는 실행화일입니다.

시스템 이름이나 도메인 이름을 사용하지말고 IP주소를 사용합니다.

/etc/hosts.deny 을 deny ALL로 설정한 후 접속을 허용할 주소만 /etc/hosts.allow파일에 기록합니다.

우선 순위는 allow가 먼저 입니다.


다음은 사용 예입니다.

  /etc/hosts.allow
    in.ftpd:192.168.0.1:ALLOW -->192.168.0.1으로 부터의 FTP만 허용
  /etc/hosts.deny
    ALL:ALL DENY -->모든 접근 불허


구성 후 #tcpdchk를 실행합니다.



6. 관리자의 history를 없앤다.
.bash_history에서  HISTFILESIZE=0으로한다.
그래도 HISTSIZE환경변수에 저장이됨으로 확인이 가능하다.



7. /etc/lilo.conf파일에 password=123 와 같이 암호부분을 넣어준다.
설정을한다음에 lilo -v한다.
그럼 재시동시 lilo에서 암호를 물어본다.



8. ipchains 나 iptables를 사용한다.
이것을 설정은 맨페이지나 관련 홈피를 참조하라..



9. /var/log및의 파일을 점검한다.

  acct 또는 pacct --> 사용자별로 실행되는 모든 명령어를 기록
  actlog --> 다이얼 -아웃 모뎀 관련 기록(자동 호출 장치)
  lastlog --> 각 사용자의 가장 최근 로그인 시간을 기록
  loginlog --> 실패한 로그인 시도를 기록
  messages --> 부트 메세지 등 시스템의 콘솔에서 출력된 결과를 기록하고
  syslog에 의하여 생성된 메시지도 기록
  sulog --> su 명령 사용 내역 기록
  utmp --> 현재 로그인한 각 사용자 기록
  utmpx --> utmp 기능을 확장, 원격 호스트 관련 정보 등 자료구조 확장
  wtmp --> 사용자의 로그인, 로그아웃 시간과 시스템의 종료 시간, 시스템 시작 시간 등을 기록
  wtmpx --> wtmp기능 확장
  vold.log --> 플로피 디스크나 cd - drom과 같은 외부 매체의 사용에서 발생하는 에러를 기록
  xferlog --> ftp 접근을 기록
  secure -->보안에 관련된 로그


위의 파일들을 확인하여 이상한 접근이나 사용자가 있는가를 점검한다.
이것은 시스템에 문제가 있을적에 제일 먼저 확인을 해야하는 로그들이다.



10. # w 명령으로 현재 로그인한 사용자를 확인한다.
이상한 유저가 로그인시 접속을 끊거나 활동상황을 감시한다.



11. # last 명령으로 기존 로그인한 사용자를 확인한다.
수상한 사용자가 있음 의심을 하자


특정한 ip를 제외하고 검색을 할려면
# last | grep -v 192.168.0.1 | grep -v www.linuxfreebsd.com

이것은 내부 ip가 192.168.0.1 이고 도메인이 www.linuxfreebsd.com  이란 말이다.
이런식으로 검출을 하면 많은부분을 쉽게 찾을수 있다.



12. secure를 확인하여 사용자 인증 관련 로그등을 확인한다.



13. access_log, error_log
파일에도 어느 사이트에서 어느 파일에 접근을 했는지를 확인한다.



14. 가장 상위 / 디렉토리에 .profile .history 파일들이 있나 확인을한다.
이런것들이 있으면 침입을 당한것이다.

# ls -al 으로 확인한다.



15. crontab -l 로 cron에 관리자가 이외의 사용자가 설정한 파일이있나 확인한다.



16. # find / -ctime -ndays -ls 로 ndays 이전 시점부터 현재까지 ctime 이 변경된

모든 파일을 찾아준다. 하지만 이는 파일의 접근시간(atime)을 변경시킨다.

따라서 침입자가 어떠한 파일에 접근했는지 알고 싶은 경우에는 사용하지 말자.



17.
nmap -sT -p 1-65535 www.linuxfreebsd.com
nmap -sU -p 1-65535 www.linuxfreebsd.com

이것으로 어떤 포트가 열려있는지를 확인한다.
nmap프로그램은 www.nmap.org에서 다운받아 설치한다.



18.
# find / -type -f -perm -04000 -ls --> SUID 파일을 찾기
# find / -type -f -perm -02000 -ls --> SGID 파일을 찾기



19.
# rpm -V -a --> 모든 설치된 패키지의 변화에 대하여 검사
# rpm -V 패키지 이름 --> 특정 패키지에 대해서만 변화여부 검사
# rpm -V fileutils --> 트로이잔 ls 프로그램을 확인한다.

예) S.5....T /bin/ls

S - 프로그램의 사이즈가 변경
5 - md5 cheksum 값이 변경
T - 파일의 mtime 값이 변경



20.
ps - sniffer 또는 취약점 스캔 프로그램등 공격 프로그램이 실행되고 있는지 살펴본다.
주로 평소에 보지 못했던 프로세스를 확인한다.
lsof - 시스템상의 모든 프로세스가 이용하는 열려진 파일 정보를 보여준다. 이는 ps 명령을 이용한 정보를 대체할 수 있다.
netstat - 서비스하지 않는 포트가 열려 있는지 또는 이상한 사이트에서 접속이 있는지 확인한다.
who - 누가 접속해 있는지 확인한다.



21.
/etc/passwd 파일에서 이상한 사용자를 검사한다.



22.
# find / -name "..*" -print 또는
# find / -name ".*" -print

이것으로 숨겨진 디렉토리를 찾아낸다.

# find /dev -type f -print

이것을 이용하여 /dev및에의 루트킷, 백도어 설정 파일을 찾아낸다.



23.
사용자 홈디렉토리의 ".rhosts", ".forward" 파일 내용을 점검한다.





무엇보다 중요한것은 초기 O/S인스톨이 끝난다음에나 설정이 완료된시점에서 모든 디렉토리를 백업하는것이다.
그래서 침입이 확인되었을적에 기존 파일을 지우고 백업파일을 올리는것이다.



이상으로 보안확인 및 대처 방법을 끝낸다.
리눅스 뿐만 아니라 프비도 위와 거의 같은 체크를한다.
그럼 본인의 시스템을 한번 확인해보자.

FreeBSD ]보안- A basic guide to securing FreeBSD 4.x-STABLE



장창균 님께서 남기신 글 (2002-03-12 02:31:11, Hit : 2377)

[번역] A basic guide to securing FreeBSD 4.x-STABLE


+===================================================================+
+           A basic guide to securing FreeBSD 4.x-STABLE            +
+-------------------------------------------------------------------+
+                                                                   +
+              Written by Marc Silver            +
+                   http://draenor.org/securebsd/                    +
+                                                                   +
+                                                                   +
+===================================================================+


Marc Silver <marcs@draenor.org> 저.

http://draenor.org/securebsd

2002년 02월 04일


장창균<ckchang@seoul.com> 역.

2002년 03월 12일


주의 : 저자와의 약속으로 인해 본 문서의 수정을 허용하지 않습니다.

$Id: secure,v 1.10 2002/02/04 11:30:01 marcs Exp $;

Table of Contents:

  ==> Overview
  ==> The Foundation for a secure system
      -> File System Layout

  ==> Post Installation
      -> System Secure Levels
      -> Removal of the toor user
      -> Shut down services that you dont need/want
         -> syslogd
         -> portmap
         -> telnetd
         -> sshd
         -> inetd
         -> ftpd
      -> Log in vain
      -> Blackhole
      -> Crontabs
      -> Secure the console
      -> Process accounting
      -> ipfw
      -> Mail aliases

  ==> Kernel changes
      -> Disable bpf if you dont need it
      -> Disable Ctrl-Alt-Del
      -> Quota Support
      -> ipfw/ipf support

  ==> Managing user accounts
      -> User quotas
      -> Home directory permissions
      -> Hiding processes
      -> Disabling procfs
      -> login.conf(5)

  ==> Stay up to date
      -> Keep your packages current
      -> Keep your OS current

  ==> Be Vigilant

  ==> Topics of Interest
      -> Jail

  ==> Other documents about FreeBSD Security

  ==> Thanks

Overview
========


보안이란 단어는 사람마다 다르게 받아들인다. 이 문서는 여러가지 상황을 설명하며 기본으로 설치된 FreeBSD의 보안을 강화할 수 있는 것들을 제안하지만, FreeBSD 보안을 강화하는 공식적인 가이드는 아니다. 단지 내 자신의 시스템에서 사용되고 대단히 성공적으로 수행되었던 모델에 관해서만 논의하는 것이다. 또한 내가 보안 ‘전문가’라고 말하는 것이 아님을 밝히고 싶다. 나는 단지 지나치게 조심스럽고 서버의 보안에 굉장한 자부심을 갖는 시스템 어드민일 뿐이다.

FreeBSD의 보안을 더 넓게 전망하기 위함과 아울러, 본론으로 들어가기 전에 FreeBSD 시스템에서 security(7)의 man page를 모든 이들이 읽어 볼것을 제안한다.  

본 문서 작업은 아직 진행중이다. 그러기 때문에 이 문서는 수정되고 증본되며 발전될 것이다. 더 추가 또는 수정할 사항이 있거나, 주석을 필요한 부분이나 문제가 되는 사항이 있다면, 메일을 보내주기 바란다
(marcs@draenor.org). 이 문서의 공식 홈페이지는 http://draenor.org/securebsd 이다.

또한 이 문서를 통해서 원격이나 로컬 DoS 공격을 막을 수 있음을 뜻하는 것은 아니다. 단지 기본으로 기본으로 설치된 FreeBSD 보안을 강화하는 데 도움을 주고자할 뿐이다. FreeBSD 보안에 관한 고급수준의 문서 또한 아니다. 단순히 자신의 머신을 안전하게 지키는데 사용할 수 있는 기본적인 아이디어를 설명한다.

이점을 인지하고 시작하기로 하자.

보안 시스템에 관한 기초
The Foundation for a secure system
==================================

시스템은 아주 초기부터 안전하게 설정되어야 한다. FreeBSD를 설치하는 동안 설치 이후의 골칫거리에서 피할 수 있도록 수행할 여러가지 것들이 있다. 내 생각으로는, 공격자가 시스템에 로컬 로그인을 이미 가지고 있다고 생각되는 곳에서는 파일 시스템 설정이 크게 다를 수 있다.

o  파일 시스템 레이아웃
o  File System Layout

아래의 파일 시스템 레이아웃은 어느 시스템에서든 가이드 라인으로 사용될 수 있다. 명백한 것은 디스크 레이아웃은 머신의 기능에 따라 달라질 수 있지만 이는 기본 가이드로 도움이 된다.

자신의 필요에 따라 적합하게 적용할 수 있다.

   Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
   /dev/ad0s1a    128990    31390    87282    26%    /
   /dev/ad0s1f     49583    27879    17738    61%    /tmp
   /dev/ad0s1d  12348393  2563101  8797421    23%    /usr
   /dev/ad0s1h   4065262    97983  3642059     3%    /home
   /dev/ad0s1g   2032623     6026  1863988     0%    /var
   procfs              4        4        0   100%    /proc



이제, mount(8) 명령의 출력을 보자:


   /dev/ad0s1a on / (ufs, local)
   /dev/ad0s1f on /tmp (ufs, local, nodev, nosuid, soft-updates)
   /dev/ad0s1d on /usr (ufs, local, soft-updates)
   /dev/ad0s1h on /home (ufs, local, nosuid, with quotas, soft-updates)
   /dev/ad0s1g on /var (ufs, local, soft-updates)
   procfs on /proc (procfs, local)


이제, 왜 이렇게 설정했는지를 논의해보자.

루트 파티션은 128MB로 적합하다(tuning(7) man page에서 추천한 대로이다) 그리고 KLD 그리고 상당히 중요한 여러 디렉터리뿐 아니라 커널이 저장되어 있는 곳이다. (/sbin이 유일하게 머리에 떠오르는 것이다). 이를 염두에 두고, 나중에 fstab(5) 파일을 수정하여 루트 파티션을 읽기전용으로 마운트가 가능하다.

임시 파일들은 /tmp에 저장된다. 그리고 이 디렉토리는 일반적으로 누구나가 기록할 수 있기때문에, 이 디렉토리에서 특정 파일이 사용되지 않도록하는 것이 중요하다. Fstab(5) 파일을 사용하여 (또한 mount(8)을 참고하라) /tmp에 NOSUID와 NODEV 플래그를 추가해주어 suid 프로그램을 사용할 수 없도록하고 캐릭터나 블록 특수 장치를 이 파일 시스템에서 정지하도록 해야한다. /tmp에 NOEXEC 플래그를 추가하기를 원할지도 모르지만 이는 여러가지로 제한적이며 일반 사용자에게 어려움을 가져다 줄지 모른다. NOEXEC는 ‘make install world’의 작업을 할 때 문제를 발생할 수 있다. NOEXEC는 또한 침입자를 찾아내는 기량을 제한할 수 있다. /usr/tmp와 /var/tmp를 /tmp 파티션에 심볼릭 링크를 걸어두어야 함을 인지하는 것이 중요하다. 그렇지 않으면 사용자에게 tmp 디렉토리를 아무런 제약없이 제공해야 한다.

사용자 디렉토리는 /home에 위치하며 이 파티션에 NOSUID 플래그를 추가하는 것은 좋은 아이디어 있다.

또한 QUOTA를 추가하여 사용자가 사용할 디스크 공간을 제한하라. /usr와 /var 모두 soft-updates를 사용할 수 있는 표준 파티션이다.

또한 procfs를 사용하지 않도록 선택할 수 있다. 자세한 사항은 ‘Disabling procfs.’
이 모델은 본인의 필요에 맞게 변경할 수 있다.

설치후 작업
Post Installation
=================

일단 FreeBSD 시스템을 설치한 후에 머신을 안정화하는데 도움이 될 여러가지가 있다.

시스템 보안 레벨
o  System Secure Levels

보안 레벨은 FreeBSD 보안의 핵심이다. FreeBSD 보안에서 매우 강력하고 기본적인 것이다.

대부분의 머신에서, X-Window를 실행하려하지 않는다면 보안 레벨 -1로 운영할 이유가 없다. X-Window를 실행하지 않는다면, sysctl(8) 변수 kern.securelevel을 수정하여 보안 레벨을 1로 변경할 것을 추천한다.

보안 레벨 1로 변경하되면 싱글 유저 모드가 아니고는 커널을 변경할 수 없고 KLD도 load/unload될 수 없으며 /dev/mem과 /dev/kmem은 쓰기모드로 오픈될 수 없다. 시스템을 재부팅하지 않기 위해서는 다음과 같이 명령을 실행한다.  

   sysctl kern.securelevel=1

이 변경을 지속하고자 한다면 다음을 /etc/rc.conf에 추가하라.

   kern_securelevel_enable="YES"
   kern_securelevel="1"

보다 중요한 머신에서는 보안 레벨을 2나 3로 올리고자할 것이다. 이 문서에서는 이들 상위 보안 레벨을 논의하지 않을 것이다. 여러 보안 레벨에 관한 자세한 정보와 작업사항은 init(8)의 man page 를 읽기 바란다.


Toor 유저의 삭제

o  Removal of the toor user

기본적으로, FreeBSD는 UID가 0인 부수적인 사용자계정이 함께 존재한다. 이 계정은 toor(root의 반대방향)이며, 백업 유저의 용도라서, 루트의 셀이 동작하지 않으면 이 유저로 로그인하여 문제를 해결할 수 있다. 이 계정은 기본으로 사용불가로 되어 있기때문에 패스워드를 변경하지 않는다면 사용할 수 없다.

이 계정에 패스워드를 설정하거나 삭제할 수 있다. 필자는 삭제하는 것을 선호하지만 선택은 전적으로 자신에게 달려있다.

Rmuser(8) 명령은 UID가 0인 계정의 삭제를 허용하지 않으니 주의하며, 이 계정을 삭제하기 위해 vipw(8)을 사용해야 할 것이다.

필요치 않거나 원치 않은 서비스들을 종료하라.

머신에서 필수적이지 않거나 모르는 서비스들은 실행하지 않도록 한다. 이를 수행하는 가장 좋은 방법은 머신에서 실행되는 모든 서비스들을 종료한 후에, 실행하고자 하는 것들만 사용하도록 한다. 이 방법으로 자신의 머신에서 실행되는 서비스들을 확실히 알 수 있다. Netstat(1) 명령으로 자신의 머신에서 오픈되어 있는 TCP 포트들을 알 수 있다. 즉:

   secure-me (1) :  netstat -na | grep LIST
   tcp4       0      0  *.80                   *.* LISTEN
   tcp4       0      0  *.25                   *.* LISTEN
   tcp4       0      0  *.22                   *.* LISTEN


위의 예는 TCP 포트 22(ssh), 25(smtp), 80(http)가 머신에서 대기상태이며 모든 IP에 반응할 것임을 나타낸다. 대기상태의 프로세스가 있으며 어떤 프로세스가 포트를 오픈하고 있는지 불확실하다면 sockstat(1)를 사용하여 오픈되어 있는 소켓를 나열하고 관련된 정보를 제공할 것이다.

Rc.conf(5)를 사용하여 기본적으로 사용할 서비스를 쉽게 설정할 수 있을뿐 아니라, /usr/local/etc/rc.d 디렉토리에서 볼 수 있는 로컬 패키지 init 스크립트도 마찬가지다.

비슷하게 UDP를 통해 대기상태에 있는 것들에 관해서도 볼 수 있다. Netstat(1)를 통해 이들 정보를 얻을 수 있다.


   secure-me (2) :  netstat -na | grep -i udp
   udp4       0      0  *.514                  *.*



위에서 syslogd가 514(UDP) 포트에서 대기상태에 있음을 알 수 있다.

이제 몇개의 공통적인 서비스들과 이들 서비스를 보다 안전하게 할 수 있는 것들에 관해 논의해보겠다.

   - syslogd ::

     syslogd는 UDP 514를 사용하지만, syslogd을 명령행으로 시동시킬 때 ‘-s’플래그를 사용하여 사용하지 않을 수 있다. 이는 네트워크 소켓을 사용하지 않게하며 간단히 /etc/rc.conf에 다음을 추가하면된다.

     syslogd_flags="-ss"
 

syslogd(8)를 참고하라.

     See the syslogd(8) man page for more information.

   - portmap ::

portmap은 원격 프로시져 호출에 사용되며 FreeBSD에서의 대부분의 일반 프로그램은 NFS와 함께 사용한다.

Portmap을 disable상태로 만들기 위해서는 /etc/rc.conf에 다음을 추가한다.



     portmap_enable="NO"

   - telnetd ::

이 서비스는 어떻게 해서든 사용을 피하라. telnet이 유용하기는 하지만, 더이상 사용할 이유가 없다.

telnet 세션을 통해 전송되는 모든 데이타는 일반 텍스트이다. (사용자명, 비밀번호도 포함한다)

inetd(8)을 완전히 종료하거나 /etc/inetd.conf에서 telnetd행을 제거하여 이 서비스를 제거할 수 있다.

본 서비스를 실행해야만 한다면 login.access(5)나 ipfw(8) 등의 사용법을 주지하여 접속을 제한할 수 있다.

FreeBSD는 sshd(8)를 포함한다. 이 대몬은 더 강력한 보안성을 갖는 telnetd의 대안이다.


   - sshd ::

FreeBSD 4.1.1부터 OpenSSH를 기본 시스템으로 포함하며 sshd(8)는 이제 telnetd의 확실한 대안이다.

하지만 암호화를 사용하므로서 접속 세션을 보호하여 더 안전하게 할 수 있다. RSA/DSA 키를 사용하여 더 견고한 암호화가 가능한 프로토콜이다.

대부분의 OpenSSH의 현재 버전들은 SSH 프로토콜 버전 2를 사용하지만 좀 오래된 버전을 사용하는 시스템에서는 버전 2만을 허용하도록 권한다. 이를 위해, /etc/ssh/sshd_config에 다음 문자열이 있는지 확인한다.



     Protocol 2



이는 sshd가 서버로의 SSH2 접속만을 허용한다는 것을 알려준다. 변경사항을 적용하기 위해 sshd를 재시작해야한다.

비슷하게, 서버로부터의 모든 SSH 접속을 기본으로 SSH2를 사용하도록 설정할 수 있다. 이는 /etc/ssh/ssh_config를 수정하여 할 수 있다.

보안을 더 향상시킬 수 있는 곳에서 DSA 키의 사용은 바람직하다. 이 문서는 DSA 키의 사용에 관해 설명하지 않을 것이다. 관련 정보는 http://www.openssh.com/에서 볼 수 있다.

OpenSSH, RSA/DSA 키와 이들 사용법에 관한 자세한 사항은 http://www.openssh.com/을 방문해보라.



   - inetd ::

inetd는 임의의 수개의 소켓에서 접속을 대기하도록 설계되었다. Telnetd(8), qpopper그리고 ftpd(8)와 같은 대중적인 응용프로그램들이 사용한다. 최소한, 필요하지 않거나 실행하려하지 않는 서비스들은 주석처리해야 한다(원치않는 행 앞에 #을 추가하여). Inetd 가 실행하는 대몬이 더이상 필요치 않다면, /etc/rc.conf에 다음을 추가하여 완전히 사용정지할 수 있다.



     inetd_enable="NO"



inetd를 사용한다면, 인바운딩 접속을 제한하기 위해 /etc/hosts.allow 파일을 살펴보라.



     ftpd ::

FreeBSD는 기본적으로 ftpd를 포함한다. FTP는 사용자 이름과 패스워드가 일반 텍스트로 전송되기 때문에 안전하지 않은 프로토콜이다. FTP의 대안으로 sftp(1)가 있으며 이 대몬은 모든 FTP의 이점과 함께 SSH의 암호화 기능도 제공한다. 또는 scp(1)를 사용할 수 있다.

그러나, ftpd를 서비스하기로 결정했다면 서버를 견고히 할 수 있는 몇가지 것들이 있다. 기본적으로 ftpd는 “-l”플래그와 같이 실행하며 이는 서버에 사용자가 실행하는 명령에 관한 더 많은 정보를 제공한다. “-r”플래그를 추가하여, ftpd를 읽기전용 모드로 설정할 수 있으며 이는 파일시스템을 변경하는 모든 명령들을 사용할 수 없게 할것이다. 또한 나는 익명 로그인만 허용하기 위해 “-A”플래그를 추가한다.

Ftpd 행은 /etc/inetd.conf에서 다음과 같이 보일것이다.


     ftp  stream  tcp  nowait  root  /usr/libexec/ftpd   ftpd -l -l -r -A

LOG_FTP 메시지는 기본적으로 syslogd(8)이 기록하지 않으며 enable해야함을 주의하라. 더 자세한 사항은 ftpd(8) man page를 참조하라. 명백한 이유때문에 사용자 로그인을 허용하도록 추전하지 않는다. 사용자 로그인을 필요하다면 ncftpd의 사용을 추천한다. 이 프로그램으로 별도의 사용자/패스워드 데이타베이스를 사용할 수 있으며 시스템의 사용자명과 독립적이며 다른 패스워드를 가질 수 있다.


o  Log in vain

많은 서비스들을 사용하지 않게 되었을 지라도 listeners/daemons이 없는 포트로의 접속시도를 기록해야 한다. 이를 위해 간단히 /etc/rc.conf에 다음을 추가한다.



   log_in_vain="YES"



서버를 재부팅하지 않고 변경하기 위해서는 아래와 같이 명령을 실행한다.



   sysctl net.inet.tcp.log_in_vain=1
   sysctl net.inet.udp.log_in_vain=1



listeners가 없는 포트로의 접속 시도 실패는 /var/log/messages에 기록될 것이다.
:

블랙홀



FreeBSD에는 대몬이나 listeners에 묶이지 않은 포트로의 모든 TCP/UDP 정보를 그러 모으는 옵션이 있다.

‘log in vain’과 같이 접속을 기록하는 대신, 블랙홀을 생성하여 패킷들이 블랙홀을 통해 묵살된다. 이 기능과 관련된 man page 또한 시스템을 목표로 한 DoS 공격을 지연시킬 수 있다고 서술한다. 블랙홀 MIB는 다음 명령으로 쉽게 enable할 수 있다.


   sysctl net.inet.tcp.blackhole=1
   sysctl net.inet.udp.blackhole=1

 

한가지 주의할 점은 UDP에서 블랙홀을 사용하게 되면 타 시스템에서 블랙홀이 enable된 시스템으로 traceroute(8)를 사용할 수 없게된다. TCP 값 역시 2로 증가된다. 자세한 정보는 blackhole(4) man page를 참고하라.

재부팅 후에도 계속 설정을 유지하기 위해서는 아래 설정을 /etc/sysctl.conf에 추가하라.


   net.inet.tcp.blackhole=1
   net.inet.udp.blackhole=1


이것은 ipfw/ipf의 대안이 아님을 주의하라.

주의 : James Lawrence에 따르면, 이것은 Konqueror에 문제가 있을 수 있다.


o  Crontabs

먼저, 일반적으로 사용자가 열람하지 않으면 하는 파일들이 있다. Root의 crontab이 바로 그러하다.

/etc/crontab을 0640으로 파일 모드를 안전하게 변경할 수 있으며 root와 wheel 그룹의 사용자만이 열람할 수 있다. 사용자가 어떤 작업이 cron으로 동작되는지 알 필요는 없다.

동시에, crontab(1)을 사용자가 사용하지 않기를 원할 수 있다. 간단히 /var/cron/deny 파일을 생성하고 파일에 사용자 리스트를 추가하여 원하는 것을 얻을 수 있다. 리스트에 오른 사용자들은 아래와 같은 메시지를 볼 것이다.

   crontab: you (marcs) are not allowed to use this program


비슷하게, /var/cron/allow를 생성하여 crontab을 사용할 수 있는 사용자를 추가할 수 있다. 자세한 사항은 crontab(1) man page를 참고하라.


콘솔 보안


많은 사람들이 물리적 접근이 가능한 악의적인 사용자가 싱글 유저 모드로 재부팅하여 루트 패스워드를 변경하는 것을 걱정한다. 하지만 침입자가 서버로 물리적 접근이 가능하다면 할 수 있는 일은 없다.

단순히 싱글 유저 모드로 부팅하여 root 패스워드를 변경하는 것을 막을 수 있을 뿐이다. /etc/ttys를 수정하여 ‘console’행의 ‘secure’단어를 ‘insecure’로 변경한다. 이렇게 되면 싱글 유저 모드로 들어갈때 root 패스워드를 입력해야 한다. 해당 라인은 다음과 갈다.


   console none                            unknown off insecure


또한 콘솔 보안을 설정하고 root 패스워드를 잊는다면, 패스워드를 초기화하기 위해 fixit 플로피를 사용해야 한다. 이는 싱글 유저 모드로 접속하게 되면 패스워드를 변경할 수 없기 때문이다.  


프로세스 어카운팅

머신에서 무슨일이 일어나는지 정확히 아는 것은 지극히 좋은 일이며 머신에서 프로세스 어카운팅을 enable하도록 권장한다. 이 기능을 사용하여 사용자가 실행한 명령을 살펴볼 수 있으며, 또한 어떤 문제들을 디버깅할 때 꽤 유용하기도 하다. 약간의 부하가 걸리지만 일반적으로 저하된 성능을 알아차릴 수 있는 정도는 아니다. Enable하기 위해서 단순히 다음의 명령을 실행한다.


   secure-me (1) :  touch /var/account/acct
   secure-me (2) :  accton /var/account/acct



재부팅 후에도 계속 설정을 유지하기 위해서는 아래 설정을 /etc/rc.conf에 추가하라.


   accounting_enable="YES"


어카운팅이 enable되면 lastcomm(1)과 sa(8)를 사용하여 프로세스 어카운팅 데이타베이스에서 유용한 통계자료를 얻을 수 있다.


o  ipfw

ipfw는 이 문서의 범위를 벗어나기는 하지만 머신을 안전하게 지키고자 할 것이며 ipfw를 사용하여 공격 패턴에 관한 정보를 얻고자 할 것이다. 때때로 당신의 머신에 관심을 갖는 누군가가 관심 이상의 의도를 갖는지를 알려줄 수도 있다. Ipfw(8) man page를 참고하라.


메일 얼라이어스

자신의 시스템에서 일어나는 일들을 감시하라. FreeBSD는 일/주/달 단위로 동작하는 많은 스크립트를 가지며(periodic(8)의 man page와 /etc/periodic 파일을 살펴보라) 이 스크립트들이 추출하는 정보들은 SUID 프로그램이나 커널 메시지 그리고 다른 유용한 정보와 같은 시스템에 관한 것들이다. 이 때문에 이러한 정보들을 메일로 받아보는 것이며 스크립트들의 출력이 root 계정으로 발송되지만 여러개의 이메일 주소로 발송할 수도 있다. /etc/mail/aliases를 수정하여 아래와 같은 행을 추가한다.


   root:   localuser, remoteuser@yourdomain.com


로컬 관리자뿐 아니라 별도의 메일 서버에 위치하는 곳에서도 결과물을 받아 볼 수 있다.



커널 변경
==============

필요치 않다면 bpf를 disable 상태로 하라.

FreeBSD을 설치한 후 가장 먼저 할 것 중 하나는 커널 컴파일이다. 공격자가 네트워크 카드를 정상적인 요청에 응답할 수 없는 상태로 만들 수 있기 때문에 커널에서 disable 상태로 설정하는 것중 하나가 bpf 장치이다. 서버 자체가 위험에 놓여 있기 때문에 유용하다. 간단히 커널 파일에서 다음 행을 주석처리하면 된다.


   #pseudo-device   bpf             #Berkeley packet filter


DHCP를 사용하는 사용자는 bpf를 diable하면 안된다. BPF를 diable상태로 설정하면 snort와 같은 프로그램에 영향을 줄 것이다.

또한 이 옵션에  ipfw, ipfilter를 추가할 수 있으며 동시에 쿼터설정을 지원할 수 있다.


Ctrl-Alt-Del 사용금지

물리적 접근이 가능한 사용자가 Ctrl-Alt-Del 키를 사용하여 시스템을 재부팅하지 못하게 할 수 있다.

다음을 커널 파일에 추가하기만 하라.


   options         SC_DISABLE_REBOOT       # disable reboot key sequence



이 설정은 모든 사용자가 시스템을 재부팅하는 것을 방지한다는 것을 명심하라. 또한 콘솔을 insecure로 설정했다면 재부팅하여 root 패스워드를 변경하지 못하게 한다. 즉, 물리적으로 접근할 수 있는 누군가가 악의적인 일을 하고자 한다면 당신은 상당한 곤란에 처하게 된다.


o  Quota Support

파일 시스템이 쿼터를 지원하기 위해서는 커널에 옵션을 enable해야 한다. 아래의 옵션으로 이를 설정할 수 있다.


   options         QUOTA                   #enable disk quotas


o  ipfw/ipf support

방화벽 지원 또한 커널에 추가할 수 있다. 무엇을 추가할 지는 자신에게 달려 있다. FreeBSD는 기본 시스템에 ipfw와 ipf가 포함된다. 자세한 사항은 LINT를 참고하라.


사용자 계정 관리
======================

사용자 쿼터

임의의 파일시스템에서 사용자 쿼터를 설정함으로써 한 사용자가 디스크 공간을 소모해버리는 위험을 덜 수 있다. 사용자가 모든 디스크 공간을 잡아먹을 가능성이 있는 곳에 설정하라. 또한 디스크 사용을 효육적으로 관리할 수 있는 장점이 있다.

쿼터는 커널에서 지원하도록 컴파일한 경우에 사용할 수 있다. 쿼터를 지원하도록 컴파일한 경우에는 다음을 /etc/rc.conf에 추가해야 할 것이다.


   enable_quotas="YES"
   check_quotas="YES"


edquota(8), qoutacheck(8), qoutanon(8), qoutaoff(8), repqouta(8)를 사용하여 쿼터 파일시스템을 관리할 수 있다.


홈 디렉토리 권한

사용자가 무엇을 열람할 수 있는지 알고 있어야 한다. 사용자가 Root의 crontab을 열람하기를 원치않는 것과 마찬가지로 root 디렉토리의 내용을 열람할 수 있는 걸 원치않을 것이다. ‘chmod 0750 /root’명령은 wheel 그룹의 사용자가 아니라면 디렉토리의 내용을 볼 수 없을 것이다.

또한 파일 권한을 0700으로 설정하여 사용자 홈 디렉토리들을 제한할 수 있다. 이렇게 되면 사용자들은 자신의 홈 디렉토리를 다른 사용자가 열람할 수 있도록 직접 변경해 주어야 한다.


프로세스 숨기기

ps(1) 명령을 사용하여 사용자가 볼 수 있는 프로세스를 제한할 수 있다. 기본적으로 FreeBSD 는 자기가 소유하지 않는 프로세스를 포함하여 시스템의 모든 프로세스를 볼 수 있다. 자기 소유의 프로레스만을 열람할 수 있도록 하고자한다면 kern.ps_showallprocs sysctl 변수를 변경하라. 시스템이 실행중인 상태에서 아래의 명령으로 변경할 수 있다.


   sysctl kern.ps_showallprocs=0


재부팅 후에도 변경사항을 유지하고자 한다면 /etc/sysctl.conf에 아래와 같이 추가한다.


   kern.ps_showallprocs=0

root는 kern.ps_showallprocs 변수에 영향을 받지 않고 모든 프로세스를 볼 수 있다.



이 방법은 ps(1)의 출력을 제한하는 반면 공격자가 어떤 프로세스가 실행되고 있는지 알아내기 위해 /proc를 접근을 막을 수는 없다. 이에 관한 정보는 ‘Disabling procfs’를 살펴보라.


o  Disabling procfs

procfs를 사용하여 실행되고 있는 프로세스에 관한 정보를 얻을수 있다. 이것은 또한 ps(1), w(1), truss(1)와 같은 프로그램이 완전히 동작하기 위해 필요하다. Procfs가 포함하고 있는 많은 정보들로 인해 많은 관리자들이 이 파일시스템을 disable로 설정하는 데 유익하다고 생각하고 있다.

이 설정은 본인에 달려있다. 원치 않으면 disable 상태로 설정할 필요는 없다.

Procfs를 disable상태로 설정하기 위해서는 /etc/fstab에서 procfs 파일시스템에 NOAUTO 옵션을 추가하라.
필요하다면 수동으로 마운트할 수도 있다.


o  login.conf(5)

‘login classes’에 사용자를 추가하여 사용자가 사용할 수 있는 CPU/memory 등을 제 한할 수 있다. 이 기능은 로컬 DoS 공격자를 제한하는 데 매우 효과적이다. 더 자세한 사항은 login.conf(5) man page를 참고하라.



최신 상태로 유지하라.
===============

패키지를 최신으로 유지하라.

외부에서 노출되어 있고 접근가능한 대몬들을 실행할 때는 자신의 패키지가 항항 최신 상태로 유지하는 것은 중요하다. 설치되 패키지의 새 버전이 나오면 포트 트리를 이용하여 항상 최신 버전을 유지하라.

대부분의 경우 몇분도 걸리지 않지만 골치거리로부터 해방되기 위한 최소한의 노력이다. 보안 권고에 관해서는 bugtraq과 같은 리스트를 살펴보는 것도 도움이 될 것이다.

패키지를 항상 최신 상태로 유지하기위해서 FreeBSD  핸드북을 참고하기 바란다.


   http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/


운영체제를 최신 상태로 유지하라.

비슷하기, FreeBSD 자체를 최신 상태로 유지하는 것 또한 중요하다. 소스 트리를 최신 상태로 유지하고 새 보안 패치가 나오면 ‘make world’를 수행하라. 보안 권고에 관해서는 bugtraq과 같은 리스트를 살펴보는 것도 도움이 될 것이다.

운영체제를 항상 최신 상태로 유지하기위해서 FreeBSD  핸드북을 참고하기 바란다.


   http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/


또한 FreeBSD 보안 권고 메일리스트에 가입하도록 하라.


   http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/eresources.html


조심성을 갖는다.

===========


이상 징후를 발견했을 때 시스템에서 낯선 점들을 탐색해야 한다. 특히 다음과 같을 때 주의한다.

최근 재부팅된 시스템

시스템이 재부팅되었다면 심각한 무언가가 변경되었는지를 체크하라. 특히 시스템 보안레벨에 주의를 기울여라. 이는 공격자가 커널이나 KLM등과 같은 것을 수정하기 위해 변경할 것이며, 변경 불가 시스템이나 추가 전용 플래그 시스템을 통과할 수 있는 기회를 갖게 되기 때문이다.


SUID 파일들의 변경

일단위 레포트는 SUID 파일에서 변화에 관한 정보를 담고 있다. 이 레포트에 상당한 관심을 기울여라.

중요한 시스템 파일에서의 변경

커널과 같은 중요한 시스템 파일들의 변경을 항상 주지하라. FreeBSD를 설치할 때, 이들 파일의 MD5 값을 구한후 안전한 곳에 저장하라. 그리고 수시로 이 값을 비교하라. 알수 없는 이유로 일치하지 않는다면 조사하라. 이를 위해 /usr/ports/security/tripwire를 사용할 수 있다. 물론 다른 툴을 사용할 수 있다.



Topics of Interest
==================

당신이 중요하게 생각하는 다른 토픽들이 있지만 그것들은 이 문서의 범위를 벗어 난다.


o  Jail

jail 환견은 chroot(8)와 비슷하지만 더 많이 향상되는 것을 경험할 수 있다. Jail이 무엇이며 어떻게 사용하는 지에 대한 설명은 jail(8) man page에서 찾을 수 있으며 아래 링크에서도 볼 수 있다.


   http://docs.freebsd.org/44doc/papers/jail/jail.html


FreeBSD 보안에 관한 다른 문서들
======================================

다음 사이트들은 FreeBSD 보안에 관한 정보를 가지고 있다.

   - http://www.freebsd.org/security/
   - http://www.freebsd.org/~jbk/howto.html
   - http://www.subterrain.net/presentations


FreeBSD 보안에 도움이 되는 툴들

   - http://www.openssh.com/ - 현재 FreeBSD 기본 배포에 포함되어 있다..


다른 유용한 프로그램들

-        http://www.ncftpd.com/ - 안전한 FTP 대몬


감사의 말
======

이 문서를 개선할 수 있는 제안을 하고 문제점을 지적해준 다음의 사람들에게 감사하고 싶다.



   Hiten Pandya  (who is converting this document to DocBook for addition as an article on the FreeBSD website)
   Gary W. Swearingen
   Tom Rhodes
   Nick Cleaton
   Sean Lewis
   Jean-Michel Amblat
   Dominic Marks
   Seth
   Chris Phillips
   Sebastian Benner
   Trevor Johnson
   James Lawrence

FreeBSD]리눅스에서 NTFS 파일시스템읽고 쓰기



리눅스와 바이너리호환이 되므로 그점을 응용하면 사용이 가능하지 않을까???


작성자 : 좋은진호(truefeel)
작성일 : 2003.11.09(일)


리눅스 커널에는 실험적으로 NTFS 파일시스템에 쓸 수 있도록 하고 있으나 혹시 발생할 수도 있는 문제 때문에 사용하는 이들은 많치 않을거라 생각된다.

이런 걱정을 할 필요없이 커널에서 지원하는 쓰기 모듈을 이용하지 않고 색다른 방법으로 NTFS을 다루는 방법(10월 공개적으로 발표된 툴)이 나왔다.

Jan Kratochvil씨가 만든 Captive 프로그램은 윈도우즈 NT(XP) 커널 에뮬레이션을 통해 NTFS 파일 시스템을 리눅스에서 자유자재로 읽고 쓸 수 있도록 하고 있다. 에뮬레이션하는 것이라 XP에 설치된 ntoskrnl.exe와 ntfs.sys 파일이 반드시 필요하다.

1. Captive 설치 (redhat기준이나 별반 차이 없을 것이다.)
* Captive 홈페이지 : http://www.jankratochvil.net/project/captive/

 Redhat 8과 9, Mandrake 9.x, Suse 9.0, Debian 등 여러 배포본별 패키지와 소스를 제공한다.

1) Captive 설치전에 NTFS 프로젝트( http://linux-ntfs.sourceforge.net/downloads.html#downloads )
  홈에서 ntfsprogs (현재 ntfsprogs-1.8.0beta2-1.i386.rpm )을 받아 설치한다.

2) Captive 홈페이지에서 다음을 받아 설치한다.

  captive-1.0.2-0.i386.rpm (397.6KB)
  captive-lufs-1.0.2-0.i386.rpm (22.5KB)
  captive-install-1.0.2-0.i386.rpm (57.3KB)
  lufs-0.9.6-1captive6.i386.rpm (1.6MB)
  gnome-vfs-httpcaptive-2.3.8captive2-0.i386.rpm (36.6KB)
  ntfsprogs-gnomevfs-1.0.2-0.i386.rpm (11.8KB)

# rpm -ivh *.rpm


  LUFS(Linux Userland File System)을 사용하기 때문에 위에서 보는 것처럼 lufs 패키지(lufs.o 커널 모듈이 포함되어 있음)이 필요하다.

  참고로 LUFS는 FTP나 SSH, 그누텔라 등을 마운트해서 로컬 파일처럼 사용할 수 있도록 해준다.


3) captive-install-acquire 을 실행하면 창 하나가 뜰 것이다.


  NTFS 파일시스템까지 뒤져가면서 ntfs.sys와 ntoskrnl.exe을 찾는다. 그러나 저의 경우 ntoskrnl.exe 파일이 분명히 존재하는데 뭐가 문제인지 찾지 못했다. 그래서 captive가 driver 를 저장해두는 /var/lib/captive 디렉토리에 직접 복사해 넣었다.


  이제 설치는 끝났다.

  captive 사용자가 생성되어 있고 /etc/fstab는 captive-install rpm 설치할 때 인식한 파티션 정보가 추가되어 있을 것이다.


  /dev/hdb2 /mnt/captive-hdb_download captive-ntfs defaults,noauto 0 0
  /dev/hda1 /mnt/captive-c_linux   captive-ntfs defaults,noauto 0 0


  마운트 포인터로 표시된 hdb_download, c_linux는 Captive가 인식한 HDD의 볼륨명이다.

  물론 /mnt 아래에도 마운트할 디렉토리가 이미 생성되어 있다.


2. NTFS 파일시스템 다루기

  /etc/fstab에 이미 설정되어 있으므로 간단히 'mount /dev/디바이스명' 해도 읽고 쓸 수 있는 형태로 마운트된다. 처음 마운트할 때는 컴파일 과정이 필요하므로 시간이 걸릴 것이다.
 ( mount -t captive-ntfs /dev/hdb2 /mnt/마운트할_디렉토리명 )


  # mount /dev/hdb2
  Captive NTFS v1.0.2. Check new version: http://www.jankratochvil.net/

  # cd /mnt/captive-hdb_download

  # cp ~/ntfs_rw.txt .

  # ls -l

  합계 1
  drwx------  1 root   root      0 7월 13 12:01 ?????? <-- 한글 파일명
  drwx------  1 root   root      0 7월 12 17:16 System Volume Information
  drwx------  1 root   root      0 9월 27 11:47 WUTemp
  ... 중략 ...
  -rw-------  1 root   root     6122 11월 9 22:57 ntfs_rw.txt

  # mount
  ... 중략 ...

  /dev/hdb2 on /mnt/captive-hdb_download type captive-ntfs (owner=0,fs=captivefs,mntent.mnt
  fsname=/dev/hdb2,mntent.mnt_type=captive-ntfs,dir_cache_entries=0,image=/dev/hdb2,noauto,
  aptive_options=--disk;--rw;--load-module=/var/lib/captive/ntoskrnl.exe;--filesystem=/var/lib/captive/ntfs.sys;--sandbox-server=/usr/sbin/captive-sandbox-server;--bug-pathname=/var/lib/captive/bug-%FT%T.captivebug.xml.gz;--syslog;--rw,server_socket=/tmp/lufsd812572323,server_pid=19268)

 
  * captive-ntfs : 마운트 타입
  * --rw : 읽기 쓰기 형태로
  * --load-module=/var/lib/captive/ntoskrnl.exe
  * --sandbox-server=/usr/sbin/captive-sandbox-server : NTFS 액세스하도록 해주는 wrapper
   마운트하게되면 항상 sandbox server 프로세스가 띄워져 있다.
  * --bug-pathname=/var/lib/captive/bug-%FT%T.captivebug.xml.gz
   버그러포팅이 저장되는 경로. 상당히 큰 파일이다.


3. 문제점을 하나씩 살펴보자.

 그러나 이 것 또한 여러 문제점이 있다.
 문제점에 비하면 쉽게 읽고 쓸 수 있다는게 더 매력적이지만.

 1) 이미 알려진 문제로 한글을 포함한 여러 언어의 파일명을 표시하지 못한다. 위의 목록에서도  ??? 로 표시된 것을 확인할 수 있다. (옵션 사용해도 의미 없음)

 2) 아직은 윈도우즈 XP 드라이버만 호환성을 갖는다. 앞으로 윈도우즈 2000, NT 4.0, 2003 서버 드라이버도 호환을 갖도록 할 계획이라고 한다.

   이 말이 XP 드라이버를 이용하여 윈도우즈 2000의 NTFS 파일시스템을 액세스 할 수 없다는 의미는 아닌 것 같다.


 3) NTFS 파일시스템 액세스할 때 시스템 로드를 많이 잡아 먹는 경우가 종종 생긴다.

   PID USER   PRI NI SIZE RSS SHARE STAT %CPU %MEM  TIME CPU COMMAND
  19271 captive  20  0 10776 10M 2500 R  71.5 2.8  0:06  0 captive-sandbox

  19268 root   16  0 13968 13M 4632 S  22.3 3.6  0:01  0 lufsd


 4) 제 시스템만의 문제인지는 모르겠으나 2개의 NTFS 파티션 중에 하나의 파티션(/dev/hda1)은 쓰기를 할 수 없었다.
   써진 것 처럼 보이는데, 언마운트하고 다시 마운트해서 살펴보면 좀 전에 썼던 파일이 없었다.
   발생한 에러 로그는 /var/log/messages에 남는데, 다음과 같은 에러 메시지를 볼 수 있었다.

  Nov 9 22:42:35 truefeel Captive[8019]: Filesystem crash broke dirty object: /kkkk


 5) 큰 파일 복사할 때 너무 오랜 시간이 걸린다.
   성능이 1GHz CPU: read 1.5MB/s, write 500KB/s, 20MB of RAM 과 같이 개선되었다고 하나 실제로는 10MB 파일 1개 복사(write)하는데 1분 이상 걸렸다.



4. 참고 자료

* Captive 홈페이지
 http://www.jankratochvil.net/project/captive/

* Linux-NTFS Project
( 참고로 커널 커파일이 귀찮은 사용자를 위해 NTFS 모듈을 별도로 제공한다. )
 http://linux-ntfs.sourceforge.net/

* LUFS 홈페이지
 http://lufs.sourceforge.net/lufs/