본문 바로가기
운영체제 (LNX,WIN)

Linux 기반의 서버 설치 및 셋팅

by 날으는물고기 2009. 5. 18.

Linux 기반의 서버 설치 및 셋팅

최초 설치
우선 하드의 배드섹터를 체크하고 수정한다.
iptables로 방화벽 구성
사용자 계정을 한 곳에서 관리하기 위해 NIS 설치
윈도우 클라이언트에서 쉽게 접근 가능하도록 삼바 설정
원격에서 X윈도우로 관리가 가능한 TightVNC를 설치한다. (기존의 VNC는 사용하지 않음)
콘솔에서 한글을 사용하기 위해 jfbterm 설치 (콘솔 한글이 안될 경우)
한글 man페이지 지원을 위한 less 재설치 (man 페이지가 정상적이지 않을 경우)
도메인 네임 서버 설정
타임 서비스와 시간 동기화 (네트웤 타임 동기화가 없을 경우)
메일 서버와 메일 백신 설정
메일 서버를 제외한 서버들의 백신 설정
FTP 서버 설정
Web 서버 설정
사용자 계정 관리용 스크립트 제작 사용



-- rulemaker 소스 ----------------------------------------------
-- 서비스별 포트 번호 참고 ------------------------------------- -- 마스터 smb.conf 소스 ---------------------------------------- -- 슬레이브 smb.conf 소스 -------------------------------------- -- perl 정규식 참고 -------------------------------------------- -- SoriiMilter.pl 소스 ----------------------------------------- -- userman 소스 ------------------------------------------------ -- mkgrpmail 소스 ---------------------------------------------- ================================================================================ 최초 설치 -------------------------------------------------------------------------------- 서버의 구성 ├ns.sorii.com - DNS,NIS(S),SMB(S) / SSH,VNC ││ 도메인 네임 서버 │└home │ └sorii [sorii:sorii/770] - 서버 관리용 공유 폴더 │ ├home.sorii.com,ftp.sorii.com - WWW,FTP,NIS(M),SMB(M) / SSH,VNC ││ 사내 ftp와 홈페이지 공간 │└home │ ├sorii [sorii:sorii/777] - 전체, 외부 사용자 공유 폴더 │ ├manage [root:manage/770] - 기획/관리자 그룹 전용 폴더 │ │└사용자 [이름:manage/750] │ ├develop [root:develop/770] - 개발자 그룹 전용 폴더 │ │└사용자 [이름:develop/750] │ ├design [root:design/770] - 디자이너 그룹 전용 폴더 │ │└사용자 [이름:design/750] │ └public_html [root:sorii/771] - 개인 홈페이지 전용 폴더 │ ├mail.sorii.com - MAIL,NIS(C),SMB(S) / SSH,VNC ││ 메일 서버 │└home │ └sorii [sorii:sorii/770] - 서버 관리용 공유 폴더 │ ├wireless.sorii.com - DHCP / Web │ 무선 인터넷 테스트용 공유기 │ └lan.sorii.com - DHCP / SSH 내부 네트웤 구성용 인터넷 공유기 서버 선택 자동 파티션 구성 네트웤 설정, 방화벽 없음 추가적으로 다음 파티션을 따로 구성하여 루트가 꽉차는 것을 방지한다. /boot - 부팅 시스템들. : 첫번째 파티션! 50~100MB /var - 시스템 로그 파티션 : 400MB~1GB / - 시스템 루트 : 3GB~6GB /home - 사용자 공간 : 채움 또는 /에 포함 관리용 독립된 계정 하나 추가 id : sorii SSH로 접속하여 관리할 때 sorii계정으로 먼저 접속한 후 다음 명령으로 root에 들어간다 # su - 아래에 나열된 내용중의 버전 번호는 시스템 상태에 따라 다를 수 있다. ================================================================================ 우선 하드의 배드섹터를 체크하고 수정한다. -------------------------------------------------------------------------------- 복구용 RIP 리눅스를 준비한다. CD나 플로피를 넣고 부팅한다. 배드블록을 체크하고 발견하면 수정하기 # e2fsck -cy /dev/hda1 # e2fsck -cy /dev/hda2 ... 완료 후엔 재부팅 # reboot 정상 시스템에서 부팅시 재검사를 요구한다면 다시 검사해 준다. ================================================================================ iptables로 방화벽 구성 -------------------------------------------------------------------------------- 이전의 방화벽 설정을 확인 # iptables -L 방화벽 룰 생성 스크립트 작성 # vi /usr/bin/rulemaker -첨부된 rulemaker 소스 참고------------------------------------- # chmod 700 /usr/bin/rulemaker 방화벽 룰 생성용 자료 파일 작성 # vi ipdata -다음 중 적당한 내용을 골라서 추가------------------------------
d:tcp:20
d:tcp:21
d:tcp:25
d:tcp:53
d:udp:53
s:tcp:53
s:udp:53
d:tcp:80
d:tcp:110
d:tcp:143
d:tcp:220
d:tcp:465
d:tcp:993
d:tcp:995
.
218.235.99.62
218.235.99.63
218.235.99.64
218.235.99.65
218.235.99.66
218.235.99.67
218.235.99.68
218.235.99.69
218.235.99.70
218.235.99.71
218.235.99.72
218.235.99.73
218.235.99.74
218.235.99.76
.
# 데이타 중간엔 주석이 들어가선 안된다.
# 여기서부터는 주석

포트를 열때는 가능한 적게 열어 외부 서비스를 구성하고
신뢰하는 IP를 적당히 열어서 내부 서비스를 구성한다.

포트를 여는 형식은 '<s|d>:[tcp|udp]:[포트]'
제일 앞의 s는 소스 포트를 허용할 때 d는 현재 호스트의 목적 포트를 허용할 때
's:udp:53'은 반드시 있어야 dns 응답을 받을 수 있다.

ftp-data    20/tcp
ftp         21/tcp
ssh         22/tcp                      # SSH Remote Login Protocol
telnet      23/tcp
smtp        25/tcp      mail
time        37/tcp      timserver
nameserver  42/tcp      name            # IEN 116
domain      53/tcp                      # name-domain server
domain      53/udp                      # name-domain server
http        80/tcp      www www-http    # WorldWideWeb HTTP
pop3        110/tcp     pop-3           # POP version 3
imap        143/tcp     imap2           # Interim Mail Access Proto v2
imap3       220/tcp                     # Interactive Mail Access
smtps       465/tcp                     # SMTP over SSL (TLS)
imaps       993/tcp                     # IMAP over SSL
pop3s       995/tcp                     # POP-3 over SSL
----------------------------------------------------------------

방화벽 설정용 스크립트 생성
    # rulemaker -i ipdata -o /etc/sysconfig/ipfilter
    # chmod 700 /etc/sysconfig/ipfilter

실행 및 확인
    # /etc/sysconfig/ipfilter
    # iptables -L

재부팅시 자동으로 실행되게 추가
    # vi /etc/rc.local
-다음을 마지막에 추가-------------------------------------------
/etc/sysconfig/ipfilter
----------------------------------------------------------------

브로드캐스팅 핑 막기
    # echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    재부팅 해도 막도록 rc.local에 추가
    # vi /etc/rc.local
-다음을 마지막에 추가-------------------------------------------
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
----------------------------------------------------------------

DNS버전 정보 감추기
    # vi /etc/named.conf
-다음을 확인 및 수정--------------------------------------------
options {
    version "unknown";  //버전 정보 감추기
    directory "/var/named";
};
----------------------------------------------------------------


-첨부된 서비스별 포트 번호 참고---------------------------------


================================================================================
사용자 계정을 한 곳에서 관리하기 위해 NIS 설치
--------------------------------------------------------------------------------

NIS는 다음과 같이 설치된다.
    도메인 이름   : sorii-lan
    마스터 서버   : home.sorii.com
    슬래이브 서버 : ns.sorii.com
    클라이언트    : 218.235.99.*

이후의 작업에 영향을 주도록 도메인 설정
    # domainname sorii-lan

[ 마스터, 슬레이브, 클라이언트 공통 ]

NIS도메인 추가
    # vi /etc/sysconfig/network
-다음을 마지막에 추가-------------------------------------------
NISDOMAIN=sorii-lan
----------------------------------------------------------------

호스트 바로가기 추가
    # vi /etc/hosts
-다음을 마지막에 추가-------------------------------------------
218.235.99.62 ns.sorii.com ns
218.235.99.63 home.sorii.com home
----------------------------------------------------------------

NIS를 통한 서비스 가능성 추가
    # vi /etc/nsswitch.conf
    가능한 모든 항목 뒤에 'nis'를 추가
    모든 서버가 동일한 항목에 대해 nis 설정

NIS 사용자 처리가 가능하도록 추가
    # vi /etc/passwd
-다음을 마지막에 추가-------------------------------------------
+::::::
----------------------------------------------------------------

재부팅 때마다 실행되도록 서비스 등록
    서비스 리스트 목록을 검사한 후
    # chkconfig --list | grep ypbind
    목록에 없으면 추가한다.
    # chkconfig --add ypbind
    서비스를 활성 시킨다.
    # chkconfig ypbind on

[ 마스터, 슬레이브 공통 ]

허가권 설정
    # vi /var/yp/securents
-다음을 작성----------------------------------------------------
# allow connections from local host -- necessary
host 127.0.0.1
# same as 255.255.255.255 127.0.0.1
#
# allow connections from any host
# on the 218.235.99.0 network
255.255.255.0   218.235.99.0
----------------------------------------------------------------
    # vi /etc/ypserv.conf
-다음의 내용을--------------------------------------------------
# *     : * : *             : none
-아래처럼 바꾼다------------------------------------------------
*       : * : *             : none
----------------------------------------------------------------

[ 마스터 서버 ]

슬레이브 서버 목록 파일을 만든다
    # vi /var/yp/ypservers
-다음을 작성----------------------------------------------------
ns.sorii.com
----------------------------------------------------------------

맵DB를 생성
    # /usr/lib/yp/ypinit -m
    이후에 슬레이브로 사용될 서버들의 host이름까지 추가한 후 Ctrl+D를 눌러 db생성

마스터가 갱신될 때 슬레이브 서버도 같이 갱신시키기 원하면 NOPUSH옵션을 해제한다.
    # vi /var/yp/Makefile
-다음의 내용을--------------------------------------------------
NOPUSH=true
-아래처럼 바꾼다------------------------------------------------
NOPUSH=false
----------------------------------------------------------------

매우 느릴 수 있으므로 NOPUSH옵션은 켜두는 것이 좋다.
대신 마스터가 make하면 슬레이브쪽에서도 make하는 것이 좋다

이후부터 맵DB를 갱신하기 위해서는
    # cd /var/yp/
    # make

[ 슬레이브 서버 ]

마스터 서버를 확인
    # ypwhich -m

맵DB를 동기화
    # /usr/lib/yp/ypinit -s home

이후부터 맵DB를 갱신하기 위해서는
    # cd /var/yp/
    # make

[ 마스터 슬레이브 공통 ]

재부팅 때마다 실행되도록 서비스 등록
    서비스 리스트 목록을 검사한 후
    # chkconfig --list | grep yp
    목록에 없으면 추가한다.
    # chkconfig --add ypserv
    # chkconfig --add yppasswdd
    # chkconfig --add ypxfrd
    서비스를 활성 시킨다.
    # chkconfig ypserv on
    # chkconfig yppasswdd on
    # chkconfig ypxfrd on

서버가 실행 중인지 확인
    # rpcinfo -u localhost ypserv

[ 마스터, 슬레이브, 클라이언트 공통 ]

클라이언트가 실행 중인지 확인
    # rpcinfo -u localhost ypbind


================================================================================
윈도우 클라이언트에서 쉽게 접근 가능하도록 삼바 설정
--------------------------------------------------------------------------------

SMB는 다음과 같이 설치된다.
    워크그룹 이름 : sorii-lan
    마스터 서버   : home.sorii.com
    슬레이브 서버 : *.sorii.com

마스터 서버에서만 계정을 추가 삭제하고 WINS와 도메인 서버로 구성하여
슬레이브 서버는 마스터의 로그인 정보를 사용하도록 한다.

삼바 설정 파일 수정
    # vi /etc/samba/smb.conf
-마스터 서버는 첨부된 마스터 smb.conf를 참고--------------------
-슬레이브 서버는 첨부된 슬레이브 smb.conf를 참고----------------
    슬레이브 서버는 'server string = '항목에 적당한 서버이름을 넣는다
    공유될 폴더에 관한 설정을 수정하려면 '== Share Definitions =='아래의 항목을 수정한다

실행 및 확인
    # /etc/init.d/smb start
    윈도우 클라이언트의 탐색기에서 '\\xxx.xxx.xxx.xxx'나 '\\x.sorii.com'으로 접속해본다

재부팅 때마다 실행되도록 서비스 등록
    서비스 리스트 목록을 검사한 후
    # chkconfig --list | grep smb
    목록에 없으면 추가한다.
    # chkconfig --add smb
    서비스를 활성 시킨다.
    # chkconfig smb on


================================================================================
원격에서 X윈도우로 관리가 가능한 TightVNC를 설치한다. (기존의 VNC는 사용하지 않음)
--------------------------------------------------------------------------------

TightVNC 서버 버전 다운 받기
    http://www.tightvnc.com/download.html

서버 rpm 설치
    # rpm -Uvh tightvnc-server-1.2.9-1.i386.rpm

패스워드 생성
    # vncpasswd
    암호 두번 입력 후 읽기 전용 암호도 설정

기본 수행 설정 파일 편집
    # vi /etc/sysconfig/vncservers
-다음을 마지막에 추가-------------------------------------------
VNCSERVERS="10:root"
----------------------------------------------------------------

VNC서버를 실행
    # /etc/init.d/vncserver start

환경변수 문제로 데몬 서비스로 시작하지 못하는 경우가 많으므로
터미널로 로그인 후 수동으로 시작하여야 한다.

윈도우용 클라이언트를 다운로드 받아서 'Fast Compression'으로 접속한다
윈도우에서 TightVNC로 접속할 때에는
    host.domain:10
을 사용해서 접속
VNC를 통해 시스템 관리가 가능함
한번 로그인 되면 Xvnc가 계속 떠있으므로 로그아웃하지 않으면 세션은 그냥 보존된다.
따라서 접속을 끊기 전에 '화면 잠금'을 하는 것이 안전하다.


================================================================================
콘솔에서 한글을 사용하기 위해 jfbterm 설치 (콘솔 한글이 안될 경우)
--------------------------------------------------------------------------------

한글 패치된 jfbterm 다운 받기
    http://download.kldp.net/kslack/jfbterm-0.3.12-han-2.tar.gz

압축 해제후 설치
    # tar xzvf jfbterm-0.3.12-han-2.tar.gz
    # cd jfbterm-0.3.12-han-2/
    # ./configure 
    # make 
    # make install 
    # cat termcap.jfbterm >> /etc/termcap 
    # tic terminfo.jfbterm

설치 확인
    jfbterm.conf에서 term 과 encoding 부분을 다음과 같은 확인 및 변경
    # cd /usr/local/etc
    # vi jfbterm.conf
-다음을 확인 및 수정--------------------------------------------
term : jfbterm
encoding : G0,G1,iso646-1973irv,ksc5601-1987,,
----------------------------------------------------------------
    혹시 무슨무슨 폰트가 없다고 나오면,
    jfbterm.conf에서 fontset을 주석 처리 혹은 적절한 fontset을 설정.

실행
    # jfbterm

로긴 때마다 자동실행
    # vi /etc/profile
-다음을 마지막에 추가-------------------------------------------
tty_tmp=`tty | sed -e "s/\/dev\/\([ty]*\).*/\1/"` 
if [ "$tty_tmp" = "tty" ]; then 
    exec jfbterm 
fi
----------------------------------------------------------------


================================================================================
한글 man페이지 지원을 위한 less 재설치 (man 페이지가 정상적이지 않을 경우)
--------------------------------------------------------------------------------

한글 패치된 less 소스 받기
    http://people.redhat.com/djoo/Koreanizing/less-378-8KR.src.rpm

소스를 컴파일 하여 rpm 생성후 설치
    # rpmbuild --rebuild less-378-8KR.src.rpm
    # rpm -Uvh /usr/src/redhat/RPMS/i386/less-378-8KR.i386.rpm
    rpmbuild가 없을 경우 rpm-build 패키지를 설치한다


================================================================================
도메인 네임 서버 설정
--------------------------------------------------------------------------------

로컬의 DNS을 변경할 때는 다음 파일을 편집
    # vi /etc/resolv.conf
-내용-----------------------------------------------------------
search sorii.com
nameserver 218.235.99.62
nameserver 210.220.163.82
nameserver 168.126.63.1
----------------------------------------------------------------

zone을 등록하기 위해 설정 편집
    # vi /etc/named.conf
-내용-----------------------------------------------------------
// dns
controls {
    inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

include "/etc/named.custom";
include "/etc/rndc.key";


zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa";
};
zone "99.235.218.in-addr.arpa" {
    type master;
    file "99.235.218.in-addr.arpa";
};


zone "localhost" {
    type master;
    file "localhost.zone";
};
zone "sorii.com" {
    type master;
    file "sorii.com.zone";
};
zone "burumaru.com" {
    type master;
    file "sorii.com.zone";
};
zone "tinywolf.com" {
    type master;
    file "tinywolf.com.zone";
};
----------------------------------------------------------------
    # vi /etc/named.custom
-내용-----------------------------------------------------------
// local
zone "." {
    type hint;
    file  "named.ca";
};

options {
    directory "/var/named/";
};
----------------------------------------------------------------

각 존 파일을 추가
    # vi /var/named/99.235.218.in-addr.arpa
-내용-----------------------------------------------------------
; 218.235.99.0 / 255.255.255.0
$TTL 86400
@   IN  SOA ns.sorii.com.   root.sorii.com (
            15  ; serial
            28800   ; refresh
            7200    ; retry
            604800  ; expire
            86400   ; ttk
            )

    IN  NS  ns.sorii.com.

62  IN  PTR ns.sorii.com.
63  IN  PTR home.sorii.com.
68  IN  PTR ns.tinywolf.com.
75  IN  PTR wireless.sorii.com.
76  IN  PTR lan.sorii.com.
----------------------------------------------------------------
    # vi /var/named/sorii.com.zone
-내용-----------------------------------------------------------
; sorii.com
$TTL 86400
@   IN  SOA ns.sorii.com.   root.sorii.com (
            5   ; serial
            28800   ; refresh
            7200    ; retry
            604800  ; expire
            86400   ; ttl
            )

    IN  A   211.233.5.48
    IN  NS  ns.sorii.com.
    IN  MX  10  mail

ns          IN  A   218.235.99.62
home        IN  A   218.235.99.63
mail        IN  A   218.235.99.64
wireless    IN  A   218.235.99.75
lan         IN  A   218.235.99.76

www IN  CNAME   @
ftp IN  CNAME   home
*   IN  CNAME   home
----------------------------------------------------------------
    # vi /var/named/tinywolf.com.zone
-내용-----------------------------------------------------------
; tinywolf.com
$TTL 86400
@   IN  SOA ns.sorii.com.  root.tinywolf.com (
            2   ; serial
            28800   ; refresh
            7200    ; retry
            604800  ; expire
            86400   ; ttl
            )

    IN  A   218.235.99.68
    IN  NS  ns.tinywolf.com.
    IN  MX  10  mail.sorii.com.

ns      IN  A   218.235.99.68
home    IN  A   218.235.99.68

www     IN  CNAME   home
ftp     IN  CNAME   home
mail    IN  CNAME   mail.sorii.com.
----------------------------------------------------------------

DNS 서버에 관계된 파일의 위치
    /etc/rndc.conf
    /etc/rndc.key
    /etc/named.conf
    /etc/resolv.conf
    /var/named/*

서비스 시작
    # /etc/init.d/named start

재부팅 때마다 실행되도록 서비스 등록
    서비스 리스트 목록을 검사한 후
    # chkconfig --list | grep named
    목록에 없으면 추가한다.
    # chkconfig --add named
    서비스를 활성 시킨다.
    # chkconfig named on


================================================================================
타임 서비스와 시간 동기화 (네트웤 타임 동기화가 없을 경우)
--------------------------------------------------------------------------------

시간을 동기화 시키는 스크립트 작성
    # vi /etc/init.d/nettime
-내용-----------------------------------------------------------
#!/bin/bash

# primary와 secondary 타임서버를 설정
time_server1="time.kriss.re.kr"
time_server2="time.nuri.net"

# 비교할 시간(10분 오차로 비교)과 되돌릴 시간 지정
old_time=`date --date '10 minutes ago' +%Y%m%d%H%M%S`
old_time_for_undo=`date '+%Y-%m-%d %H:%M:%S'`

# primary에 시간을 맞춤
echo -n "시간 동기화 : $time_server1"
ntpdate $time_server1 > /dev/null 2>&1
server_fail=$?
new_time=`date +%Y%m%d%H%M%S`

if [ $server_fail != 0 ] || [ $new_time -lt $old_time ]; then
    echo -e "\t[실패]\t$new_time"

    # secondary에 시간을 맞춤
    echo -n "시간 동기화 : $time_server2"
    ntpdate $time_server2 > /dev/null 2>&1
    server_fail=$?
    new_time=`date +%Y%m%d%H%M%S`

    if [ $server_fail != 0 ] || [ $new_time -lt $old_time ]; then
        echo -e "\t[실패]\t$new_time"

        # 둘 다 실패시 이전 시간으로 돌림
        echo "이전 시간으로 돌림"
        date -s "$old_time_for_undo" > /dev/null
    else
        echo -e "\t[성공]"
    fi

else
    echo -e "\t[성공]"
fi

echo -n "시스템 현재 시간 : "
date
----------------------------------------------------------------

정기적으로 타임서버와 서버의 시간을 동기화 시킨다.
    # crontab -e
-다음을 마지막에 추가-------------------------------------------
# 매달 1일 3시 : 타임서버와 시간 동기화
00 03 01      *  *      echo "매달 1일 3시: 타임서버와 시간 동기화" > /dev/tty2
00 03 01      *  *      /etc/init.d/nettime
----------------------------------------------------------------


================================================================================
메일 서버와 메일 백신 설정
--------------------------------------------------------------------------------

재부팅 때마다 실행되도록 서비스 등록
    서비스 리스트 목록을 검사한 후
    # chkconfig --list | grep sendmail
    # chkconfig --list | grep ipop3
    # chkconfig --list | grep pop3s
    # chkconfig --list | grep imap
    # chkconfig --list | grep imaps
    목록에 없으면 추가한다.
    # chkconfig --add sendmail
    # chkconfig --add ipop3
    # chkconfig --add pop3s
    # chkconfig --add imap
    # chkconfig --add imaps
    서비스를 활성 시킨다.
    # chkconfig sendmail on
    # chkconfig ipop3 on
    # chkconfig pop3s on
    # chkconfig imap on
    # chkconfig imaps on

메일을 받을 수 있는 호스트 설정
    # vi /etc/mail/local-host-names
-다음을 마지막에 추가-------------------------------------------
sorii.com
mail.sorii.com
burumaru.com
mail.burumaru.com
tinywolf.com
mail.tinywolf.com
----------------------------------------------------------------

별칭을 추가 및 관리
    # vi /etc/aliases
-다음을 마지막에 추가-------------------------------------------
# Person who should get root's mail
root:           mkkim,tinywolf
home:           mkkim

# Aliases
ceo:            kimjw
sorii:          kimjw,thubansk
webmaster:      thubansk
----------------------------------------------------------------
    # newaliases

인증기능 활성시킬려면 다음의 파일을 편집
    # vi /etc/mail/sendmail.mc
-다음의 내용을--------------------------------------------------
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
-아래처럼 바꾼다------------------------------------------------
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
----------------------------------------------------------------
    # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

메일 서버를 재시작한다.
    # /etc/init.d/sendmail restart

필터링을 가능케 하기 위해 sendmail-devel패키지와 소스를 설치
설치CD : RedHat9 cd3 RPMS
    sendmail-devel-8.12.8-4.i386.rpm
다운받는 곳 : http://rpmfind.net/에서 sendmail로 검색 후 RedHat9용 최신 버전을 찾는다.
    sendmail-8.12.8-9.90.src.rpm
    sendmail-8.12.8-9.90.i386.rpm
    sendmail-cf-8.12.8-9.90.i386.rpm
    sendmail-devel-8.12.8-9.90.i386.rpm

root로 소유권 변경후 설치
    # rpm -qa | grep sendmail
    버전을 검사한 후 서로 버전 다를 경우 전부 설치한다
    같은 버전일 경우 없는 것과 소스만 설치한다
    # rpm -Uvh sendmail-8.12.8-9.90.i386.rpm
    # rpm -Uvh sendmail-cf-8.12.8-9.90.i386.rpm
    # rpm -Uvh sendmail-devel-8.12.8-9.90.i386.rpm
    # rpm -Uvh sendmail-8.12.8-9.90.src.rpm

소스 컴파일
    # cd /usr/src/redhat/SPECS/
    # rpmbuild -bc sendmail.spec
    rpmbuild가 없을 경우 rpm-build 패키지를 설치한다
    컴파일시 요구되는 패키지가 있으면 전부 설치한다
    설치된 rpm안의 내용물이 어떤 것인지 보려면 'rpm -ql <패키지 이름>'을 이용한다

메일로 퍼지는 바이러스를 막기 위해 AntiVir 백신 설치
다운받는 곳 : http://www.hbedv.com/에서 'AntiVir Milter for Sendmail Linux'를 다운받는다
    avlxmlt.tgz
설치
    # tar xzvf avlxmlt.tgz
    # cd antivir-milter-1.0.6
    # mkdir /usr/lib/AntiVir
    # cp bin/avmilter /usr/sbin
    # cp script/avq /usr/lib/AntiVir
    # ln -s /usr/lib/AntiVir/avq /usr/sbin/avq
    # cp bin/antivir /usr/lib/AntiVir
    # ln -s /usr/lib/AntiVir/antivir /usr/sbin/antivir
    # cp vdf/antivir.vdf /usr/lib/AntiVir
    # cp etc/avmilter.conf /etc
    # cp etc/antivir.conf /etc
    # cp init/rc.avmilter /etc/init.d/avmilter
    # chkconfig --add avmilter

라이센스키를 http://www.hbedv.com/private/에서 메일로 발급 받아서 복사해 넣는다.
    hdedv.key
    lic_info.txt
복사
    # cp hbedv.key lic_info.txt /usr/lib/AntiVir
    # cp hbedv.key /usr/lib/AntiVir/avmgate.key
    # chown uucp:uucp /usr/lib/AntiVir/avmgate.key

백신 필터용 스풀 디렉토리를 생성한다
    # mkdir /var/spool/avmilter
    # cd /var/spool/avmilter
    # mkdir incoming outgoing rejected
    # chown -R uucp:uucp /var/spool/avmilter
    # chmod -R 700 /var/spool/avmilter

인증기능 활성시킬려면 다음의 파일을 편집
    # vi /etc/mail/sendmail.mc
-다음을 마지막에 추가-------------------------------------------
INPUT_MAIL_FILTER(`avmilter',`S=inet:3333@localhost,F=T,T=S:10m;R:10m;E:5m')dnl
----------------------------------------------------------------
    # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

백신 서비스를 시작한다.
    # /etc/init.d/avmilter start

메일 서버를 재시작한다.
    # /etc/init.d/sendmail restart

백신 동작을 확인
    # netstat -atnp | grep avmilter

백신이 정기적으로 업데이트되고 실행될 수 있도록 cron을 추가
    # crontab -e
-다음을 마지막에 추가-------------------------------------------
# 매일 5시 : /home 바이러스 검사
00 05  *      *  *      echo "[cron] daily    AM 05h : /home virus check" > /dev/tty2
00 05  *      *  *      /usr/lib/AntiVir/antivir --allfiles -s -nolnk /home
# 매 홀수날 2시 : 바이러스 패턴 업데이트
00 02 1-31/2  *  *      echo "[cron] odd days AM 02h : update virus pattern" > /dev/tty2
00 02 1-31/2  *  *      /usr/lib/AntiVir/antivir --update
# 매주 일요일 4시 : 감염되어 거부된 메일 삭제
00 04  *      * sun     echo "[cron] sunday   AM 04h : delete rejected mails" > /dev/tty2
00 04  *      * sun     rm -f /var/spool/avmilter/rejected/*
----------------------------------------------------------------

백신이 바이러스를 발견할 경우 보낸 사람과 받는 사람 모두에게 경고를 보냄
    # vi /etc/avmilter.conf
-다음의 내용을--------------------------------------------------
# VirusAlertToRcpt                 NO
# VirusAlertToSender               NO
-아래처럼 바꾼다------------------------------------------------
VirusAlertToRcpt                 YES
VirusAlertToSender               YES
----------------------------------------------------------------

백신이 보내는 경고 메일을 한글로 보내도록 템플릿 수정
    # mkdir /usr/lib/AntiVir/templates
	# cd /usr/lib/AntiVir/templates
	# vi patho-administrator
-내용-----------------------------------------------------------
Subject: 수상한 메일 경고! [발신자: SENDER]

* * * * * * * * * * * * * * * 수상한 메일 경고 * * * * * * * * * * * * * * *
LICENSE

발신자   : SENDER
발신제목 : "SUBJECT"

AntiVir has detected a suspicious mail sent through your server which was not scanned because:
AntiVir가 당신의 서버로 보내진 메일에서 아래와 같이 의심되는 수상한 점을 발견함:

        REASON

The mail was not delivered.
해당 메일은 전송되지 않았습니다.

It has been quarantined with the following queue id:
아래의 큐이름으로 격리 보관됨:

        QUEUEID
----------------------------------------------------------------
    # vi patho-recipient
-내용-----------------------------------------------------------
Subject: 수상한 메일 경고! [발신자: SENDER]

* * * * * * * * * * * * * * * 수상한 메일 경고 * * * * * * * * * * * * * * *

발신자   : SENDER
발신제목 : "SUBJECT"

AntiVir has detected a suspicious mail addressed to you, which was not scanned because:
AntiVir가 당신에게로 보내진 메일에서 아래와 같이 의심되는 수상한 점을 발견함:

        REASON

The mail was not delivered.
해당 메일은 전송되지 않았습니다.
----------------------------------------------------------------
    # vi patho-sender
-내용-----------------------------------------------------------
Subject: 수상한 메일 경고! [발신제목: "SUBJECT"]

* * * * * * * * * * * * * * * 수상한 메일 경고 * * * * * * * * * * * * * * *

발신자   : SENDER
발신제목 : "SUBJECT"

AntiVir has detected a suspicous mail from your address, which was not scanned because:
AntiVir가 당신의 주소에서 보내져온 메일에서 아래와 같이 의심되는 수상한 점을 발견함:

        REASON

The mail was not delivered.
해당 메일은 전송되지 않았습니다.

다음과 같은 조치를 권해드립니다.
        ADVICE
----------------------------------------------------------------
    # vi virus-administrator
-내용-----------------------------------------------------------
Subject: 바이러스 경고! [발신자: SENDER]

* * * * * * * * * * * * * * * 바이러스 경고 * * * * * * * * * * * * * * *
LICENSE

발신자   : SENDER
발신제목 : "SUBJECT"

AntiVir has detected the following in a mail sent through your server:
AntiVir가 당신의 서버로 보내진 메일에서 아래와 같은 바이러스를 발견함:

        VIRUSES

The mail was not delivered.
해당 메일은 전송되지 않았습니다.

It has been quarantined with the following queue id:
아래의 큐이름으로 격리 보관됨:

        QUEUEID
----------------------------------------------------------------
    # vi virus-recipient
-내용-----------------------------------------------------------
Subject: 바이러스 경고! [발신자: SENDER]

* * * * * * * * * * * * * * * 바이러스 경고 * * * * * * * * * * * * * * *

발신자   : SENDER
발신제목 : "SUBJECT"

AntiVir has detected the following in a mail addressed to you:
AntiVir가 당신에게로 보내진 메일에서 아래와 같은 바이러스를 발견함:

        VIRUSES

The mail was not delivered.
해당 메일은 수신 거부 되었습니다.
----------------------------------------------------------------
    # vi virus-sender
-내용-----------------------------------------------------------
Subject: 바이러스 경고! [발신제목: "SUBJECT"]

* * * * * * * * * * * * * * * 바이러스 경고 * * * * * * * * * * * * * * *

발신자   : SENDER
발신제목 : "SUBJECT"

AntiVir has detected the following in a mail from your address:
AntiVir가 당신의 주소에서 보내져온 메일에서 아래와 같은 바이러스를 발견함:

        VIRUSES

The mail was not delivered.
해당 메일은 전송되지 않았습니다.

Please remove any potential malicious software from your computer before
sending a new mail with attachments.
메일에 첨부되어 전송된 악의적인 소프트웨어를 제거해 주시기 바랍니다.
----------------------------------------------------------------

백신의 테스트
http://www.eicar.org/anti_virus_test_file.htm에서 eicar.com을 다운 받아서
메일에 첨부하여 메일 서버로 보내본다.
다음의 제목으로 시작하는 메일을 받았다면 백신은 정상 작동하는 것이다.
    AntiVir ALERT ...

백신에 관한 내용은 http://kltp.kldp.org/를 참고

펄로 메일 필터를 제작하여 사용하기 위해서 다음의 펄모듈을 다운받는다
    http://www.cpan.org/authors/id/G/GA/GAAS/MIME-Base64-3.00.tar.gz
    http://www.cpan.org/authors/id/C/CY/CYING/Sendmail-Milter-0.18.tar.gz

Base64 모듈 설치
    # tar xzvf MIME-Base64-3.00.tar.gz
    # cd MIME-Base64-3.00
    # perl Makefile.PL
    # make
    # make install

Milter 모듈 설치. 반드시 sendmail소스 컴파일이 먼저 되어 있어야 한다.
    # tar xzvf Sendmail-Milter-0.18.tar.gz
    # cd Sendmail-Milter-0.18
    # perl Makefile.PL /usr/src/redhat/BUILD/sendmail-8.12.8/ /usr/src/redhat/BUILD/sendmail-8.12.8/obj.Linux.2.4.20-8.i686/
    # make
    # make install

perl로 milter 생성
    # vi /etc/mail/SoriiMilter.pl
-첨부된 SoriiMilter.pl 소스 참고--------------------------------

재부팅 때마다 시작하도록 rc.local에 추가
    # vi /etc/rc.local
-다음을 마지막에 추가-------------------------------------------
perl /etc/mail/SoriiMilter.pl SoriiMilter /etc/mail/sendmail.cf &
----------------------------------------------------------------

로그파일을 생성한다
    # touch /var/log/milterlog
    로그를 모니터링할 수 있다
    # tail -f /var/log/milterlog

정기적으로 로그를 청소하도록 cron에 추가한다.
    # crontab -e
-다음을 마지막에 추가-------------------------------------------
# 매주 월요일 4시 : 밀터로그를 청소한다
00 04  *      * mon     echo "[cron] monday   AM 04h : clear milter log" > /dev/tty2
00 04  *      * mon     (echo -n "Milter Log Clear"; date) > /var/log/milterlog
----------------------------------------------------------------

milter가 백신보다 먼저 실행될 수 있도록 설정 수정
    # vi /etc/mail/sendmail.mc
-다음의 앞줄에--------------------------------------------------
INPUT_MAIL_FILTER(`avmilter',`S=inet:3333@localhost,F=T,T=S:10m;R:10m;E:5m')dnl
-다음을 추가----------------------------------------------------
INPUT_MAIL_FILTER(`SoriiMilter', `S=local:/var/run/soriimilter.sock')dnl
----------------------------------------------------------------
    # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

milter를 백그라운드로 실행한다.
    # perl /etc/mail/perlmilter/SoriiMilter.pl SoriiMilter /etc/mail/sendmail.cf &
그냥 재부팅하여 자동으로 실행 되도록 하여도 된다.
실행이 되었는지 확인한다.
    # ps -Al | grep perl

메일 서버를 재시작한다.
    # /etc/init.d/sendmail restart

-첨부된 perl 정규식 참고----------------------------------------


================================================================================
메일 서버를 제외한 서버들의 백신 설정
--------------------------------------------------------------------------------

윈도우와 공유되는 폴더의 바이러스를 막기 위해 AntiVir 백신 설치
다운받는 곳 : http://www.hbedv.com/에서 'AntiVir Linux Server'를 다운받는다
    avlxsrv.tgz
설치
    # tar xzvf avlxsrv.tgz
    # cd antivir-server-2.0.9
    # ./install
    이후엔 대화형으로 진행된다.
    대부분 디폴트 값을 선택하고 autoupdate항목에서 y를 한다

백신이 실행될 수 있도록 cron을 추가
    # crontab -e
-다음을 마지막에 추가-------------------------------------------
# 매일 5시 : /home 바이러스 검사
00 05  *      *  *      echo "[cron] daily    AM 05h : /home virus check" > /dev/tty2
00 05  *      *  *      /usr/lib/AntiVir/antivir --allfiles -s -nolnk /home
----------------------------------------------------------------

정해진 주기 말고 업데이트를 설정하고 싶으면 자동 업데이터를 정지시키고 cron으로 업데이트 한다
    # /usr/lib/AntiVir/avupdater stop
    # crontab -e
-다음을 마지막에 추가-------------------------------------------
# 매 홀수날 2시 : 바이러스 패턴 업데이트
00 02 1-31/2  *  *      echo "[cron] odd days AM 02h : update virus pattern" > /dev/tty2
00 02 1-31/2  *  *      /usr/lib/AntiVir/antivir --update
----------------------------------------------------------------


================================================================================
FTP 서버 설정
--------------------------------------------------------------------------------

proftpd를 설치한다.

설정파일을 수정
    # vi /etc/proftpd/proftpd.conf
-다음 각 항목들을 수정하거나 추가-------------------------------
ServerName              "SORIi FTP Server"
ServerType              standalone
ServerAdmin             ftp@sorii.com
DeferWelcome            on
MultilineRFC2228        on
DefaultRoot             /home
MaxClients              10  "Sorry, maximum users %m -- try again later. 사용자가 많습니다 -- 잠시 후 다시 시도해 주십시오."
MaxClientsPerHost       2   "Only one client is allowed to connect! 오직 하나의 연결만 가능합니다!"
DisplayConnect          /home/.proftpd/connect.msg
DisplayLogin            /.proftpd/welcome.msg
DisplayFirstChdir       .message

<Anonymous ~ftp>
# 익명접속 허용하지 않음
  <Limit LOGIN>
   DenyAll
  </Limit>
</Anonymous>
----------------------------------------------------------------
    # mkdir /home/.proftpd
    # vi /home/.proftpd/connect.msg
-내용-----------------------------------------------------------
************************************************
        Welcome to %V
        admin E-mail : %E
************************************************
    익명 접속을 허용하지 않습니다.
    Anonymous user cannot login this server.

----------------------------------------------------------------
    # vi /home/.proftpd/welcome.msg
-내용-----------------------------------------------------------
************************************************
        Welcome to %V
        admin E-mail : %E
************************************************
    접속자      : %U
    로그인 시간 : %T
    접속 IP     : %R
    접속자 수   : 현재 (%N) / 최대 (%M)

    외부 사용자의 접근을 제한합니다.
    호스트당 1개의 접속만 허용합니다.

    웹호스팅 디렉토리는
        /public_html/%U/입니다.
    현재 남은 용량은 %f입니다.

----------------------------------------------------------------

서버 재실행 및 서비스 등록
    # /etc/init.d/proftpd restart
    # chkconfig proftpd on


================================================================================
Web 서버 설정
--------------------------------------------------------------------------------

일단 깔려있는 패키지를 전부 제거
실행중인 프로세스를 전부 찾아서 종료시키고 rpm패키지를 제거한다
    # ps -ef | grep httpd
    # killall httpd
    # rpm -qa | grep apache
    # rpm -e <패키지 이름> --nodeps
    위와 같은 식으로 apache, mysql, php를 전부 제거
    mysql같은 경우 몇몇 디렉토리나 파일이 남아 있다면 찾아서 제거.
    /etc/my.cnf, /var/lib/mysql, /var/local/mysql 등.

MySQL 설치
다운받는 곳 : http://www.mysql.com/downloads/mysql-4.0.html에서 'Tarball (tar.gz)'을 다운받는다
    mysql-4.0.18.tar.gz
데이타베이스는 /home에 위치하도록 한다. (root파티션이 차는 것을 막기 위해)
    # mv mysql-4.0.18.tar.gz /usr/local/share
    # tar xzvf mysql-4.0.18.tar.gz
    # cd mysql-4.0.18
    # ./configure --prefix=/usr/local/mysql --localstatedir=/home/.mysqldata --with-charset=euc_kr
    # make && make install
    # cd /usr/local/mysql
    # cp support-files/my-medium.cnf /etc/my.cnf
    # ./bin/mysql_install_db
    # chown -R mysql:mysql /usr/local/mysql
    # chown -R mysql:mysql /home/.mysqldata
    # ./bin/mysqld_safe &

아파치를 설치한다
다운받는 곳 : http://httpd.apache.org/download.cgi 여기서 'httpd-2.0.x.tar.gz'의 최신버전을 다운받는다.
    httpd-2.0.48.tar.gz
    # tar xzvf httpd-2.0.48.tar.gz
    # cd httpd-2.0.48
    # ./configure --enable-layout=RedHat --enable-rule=SHARED_CORE --enable-mods-shared=all --disable-info
    # make && make install
    # cd /etc/httpd/conf
    # cp httpd-std.conf httpd.conf
    # cp highperformance-std.conf highperformance.conf
    # cp ssl-std.conf ssl.conf
    # cp /usr/sbin/apachectl /etc/init.d/httpd
    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc0.d/S90httpd
    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/S89httpd
    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc4.d/S89httpd
    # ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc5.d/S89httpd
    # vi /etc/httpd/conf/httpd.conf
-다음의 내용이 있는지 확인--------------------------------------
LoadModule rewrite_module libexec/mod_rewrite.so
-다음의 내용을--------------------------------------------------
ServerAdmin you@example.com
# ServerName www.example.com:80
AddDefaultCharset ISO-8859-1
# DefaultLanguage nl
-아래처럼 바꾼다------------------------------------------------
ServerAdmin webmaster@sorii.com
ServerName home.sorii.com:80
AddDefaultCharset EUC-KR
DefaultLanguage ko
-그리고 다음을 마지막에 추가------------------------------------
NameVirtualHost *

<VirtualHost *>
    ServerName home.sorii.com
    ServerAdmin home@sorii.com
    DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *>
    ServerName board.sorii.com
    ServerAdmin home@sorii.com
    DocumentRoot /home/public_html/phpBB2
</VirtualHost>

<VirtualHost *>
    ServerName sorii.com
    # 모든 호스트에 대해
    ServerAlias *.sorii.com
    ServerAdmin home@sorii.com
    # 호스트명이 생략 되었을 경우에는 home.sorii.com으로
    Redirect /index.html http://home.sorii.com/
    # 호스트명을 매칭 시켜서 해당 폴더로 리다이렉팅
    RewriteEngine on
    RewriteCond   %{HTTP_HOST}         ^[^.]+\.sorii\.com$
    RewriteRule   ^(.+)                %{HTTP_HOST}$1     [C]
    RewriteRule   ^([^.]+)\.sorii\.com(.*) /home/public_html/$1$2
</VirtualHost>
----------------------------------------------------------------

이미지 지원을 위해 freetype과 GD를 설치
다운받는 곳 : http://www.freetype.org/에서 찾아들어가서 'freetype의 stable 최신 소스 tar.gz'를 다운받는다
    freetype-2.1.7.tar.gz
다운받는 곳 : http://www.boutell.com/gd/에서 'Download .tar.gz'를 다운 받는다
    gd-2.0.22.tar.gz
다음의 라이브러리들이 깔려 있는지 확인한다
    libpng
    libpng-devel
    zlib
    zlib-devel
    libjpeg
    libjpeg-devel
    libjpeg6a
    # rpm -q <확인할 패키지>
    없는 것이 있을 경우 찾아서 설치한다.
FreeType을 설치한다
    # tar xzvf freetype-2.1.7.tar.gz
    # cd freetype-2.1.7
    # ./configure
    # make && make install
    # cd ..
GD 라이브러리를 설치한다
    # tar xzvf gd-2.0.22.tar.gz
    # cd gd-2.0.22
    # vi Makefile
    # ./configure
    # make && make install

PHP를 설치한다
    # tar xzvf php-4.3.4.tar.gz
    # cd php-4.3.4
    # ./configure --with-apxs2=/usr/sbin/apxs --with-config-file-path=/etc --with-mysql --with-mod-charset --with-language=korean --with-charset=euc_kr --with-zlib --with-gd=/usr/local --with-jepg-dir=/usr --with-ttf=/usr/local --enable-ftp --enable-calendar
    각 함목 중 --with-mysql은 그냥 추가하고
    나머지 --with-xx항목은 해당 라이브러리 항목이 설치된 디렉토리를 적는다.
    rpm으로 설치된 라이브러리는 /usr아래에 있고 소스로 설치된 항목은 /usr/local아래에 있다.
    /usr/lib에서 라이브러리를 찾아서 있으면 /usr인 것이고 /usr/local/lib에 있으면 /usr/local로 하면 된다.
    # make && make install
    # cp php.ini-dist /etc/php.ini

아파치에서 php를 사용할 수 있도록 설정한다
    # vi /etc/httpd/conf/httpd.conf
-다음의 내용이 있는지 확인--------------------------------------
LoadModule php4_module lib/apache/libphp4.so
-다음을 AddType항목 중 마지막에 추가----------------------------
AddType application/x-httpd-php .php .phtml
AddType application/s-httpd-php-source .phps
-다음의 내용을--------------------------------------------------
DirectoryIndex index.html index.html.var
-아래처럼 바꾼다------------------------------------------------
DirectoryIndex index.html index.html.var index.php index.phtml index.phps
----------------------------------------------------------------

phpBB2를 설치
다운받는 곳 : http://www.phpbb.com/downloads.php
	phpBB-2.0.6.tar.gz
	lang_korean.tar.gz
	subSilver_korean.tar.gz
우선 MySQL에 계정을 하나 만든다
	# cd /usr/local/mysql
	# ./bin/mysqladmin -u root password '관리자암호'
	# ./bin/mysql -u root -p
	> create database board;
	> use mysql;
	> insert into user (host,user,password) values ('localhost','phpbb2',password('암호'));
	> insert into db values ('localhost','board','phpbb2','y','y','y','y','y','y','y','y','y','y','y','y');
	> flush privileges;
	> exit
	# ./bin/mysqladmin reload
phpBB2를 압축 풀고 설치
	# cd /home/public_html
	# tar xzvf phpBB-2.0.6.tar.gz
	# cd phpBB2
	# cd language
	# tar xzvf ../../lang_korean.tar.gz
	# cd ../templates
	# tar xzvf ../../subSilver_korean.tar.gz
웹브라우저에서 http://board.sorii.com으로 phpBB2를 설치 시작한다.
	빈 값을 적당히 채워 넣은 후 (DB는 'localhost','board','phpbb2','암호'를 위의 MySQL에서 정한 것과 동일하게 입력)
	config.php를 다운 받아서 phpBB2 디렉토리에 덮어쓰고
	다시 접속했을 때 지시하는 두개의 디렉토리를 삭제한다.
	다시 http://board.sorii.com으로 접속하면 phpBB2설치 완료

phpBB2의 여러가지 MOD설치는 http://www.phpbb.com/ http://www.phpbb.co.kr/ http://www.phpbbhacks.com/ 사이트를 참고


================================================================================
사용자 계정 관리용 스크립트 제작 사용
--------------------------------------------------------------------------------

메일 서버를 제외한 각 서버의 root로 오는 메일을 메일서버로 돌린다
    # vi /etc/aliases
-다음의 내용을--------------------------------------------------
# root:         m
-아래처럼 바꾼다------------------------------------------------
root:           root@mail.sorii.com
----------------------------------------------------------------

NIS와 SMB에 동시에 사용자를 추가 시켜주는 스크립트를 마스터 서버에서 사용한다.
    # vi /usr/bin/userman
-첨부된 userman 소스를 참고-------------------------------------

메일 서버에 그룹을 사용한 메일링 리스트가 가능하도록 스크립트를 제작하고 aliases를 수정한다.
    # mkdir /etc/mail/group
    # chmod 755 /etc/mail/group
    # vi /usr/bin/mkgrpmail
-첨부된 mkgrpmail 소스를 참고-----------------------------------
    # vi /etc/aliases
-다음을 마지막에 추가-------------------------------------------
# Groups
all:            ":include:/etc/mail/group/sorii.list"
manage:         ceo,":include:/etc/mail/group/manage.list"
develop:        ceo,":include:/etc/mail/group/develop.list"
design:         ceo,":include:/etc/mail/group/design.list"
----------------------------------------------------------------
    # newaliases

사용자가 추가되거나 삭제될 때에는 메일 서버에서 아래의 명령을 실행하여 목록을 갱신한다.
    # mkgrpmail

사용자를 추가할 때는 sorii그룹을 초기 그룹으로하고 사용자의 성격에 맞게 추가 그룹을 설정한다.
    # userman
-입력예---------------------------------------------------------
========================================
=          새로운 사용자 추가          =
========================================

  1. 사용자 ID : tinywolf
  2. 전체 이름 : Jeong Seung-Dae
  3. 암호      : 입력 됨
  4. 초기 그룹 : sorii
  5. 추가 그룹 : develop
  6. 홈 위치   : /home/develop/tinywolf
  7. 쉘 종류   : 기본 쉘 사용
  8. 뼈대 복사 : no 스켈렉톤 디렉토리를 복사하지 않습니다.
  9. 뼈대 위치 : 기본 위치 사용
 10. 새 그룹   : no 사용자 ID와 같은 이름의 새 그룹을 만들지 않습니다.
 11. UID       : 기본값 사용
 12. 홈 생성   : yes 홈 디렉토리를 생성합니다.
 13. 삼바 추가 : yes 삼바 계정에 추가합니다.

 [q] 생성 취소

  내용을 점검하고 수정하십시오. 완료되면 엔터를 누르십시오.
  수정할 항목 번호 :
----------------------------------------------------------------


================================================================
-- rulemaker 소스 ----------------------------------------------
================================================================
#!/bin/bash

iptables="iptables"
[ -f /usr/local/bin/iptables ] && iptables="/usr/local/bin/iptables"
[ -f /sbin/iptables ] && iptables="/sbin/iptables"

Usage() {
    echo "RuleMaker 0.9b"
    echo ""
    echo "iptables로 방화벽을 구축할 룰을 생성합니다."
    echo ""
    echo "사용법) rulemaker [-i <inputfile>] [-o <outputfile>]"
    echo "        rulemaker --help"
    echo ""
    echo "입력 파일이 생략될 경우 표준 입력으로 입력하게 되고"
    echo "출력 파일이 생략될 경우 표준 출력으로 출력됩니다."
    echo ""
}

DefaultRule() {
    echo "# iptables 모듈 등록"
    echo "modprobe iptable_filter"
    echo "# 룰 초기화"
    echo "$iptables -F"
    echo "# 기본 정책 수립"
    echo "$iptables -P INPUT DROP"
    echo "$iptables -P OUTPUT ACCEPT"
    echo "# 라우터로 사용할 경우 FORWARD룰은 ACCEPT로 수정해야 한다"
    echo "$iptables -P FORWARD DROP"
    echo ""
    echo "# localhost의 트래픽은 전부 수용"
    echo "$iptables -A INPUT -i lo -j ACCEPT"
    echo ""
}

PortOpen() {
    echo "# 특정 포트를 통한 입력은 전부 받아들임"
    input="."
    read input
    while [ "$input" != "." ] && [ -n $input ]
    do
        if [ "$input" != "" ]; then
            ptype="${input#*:}"; ptype="${ptype%%:*}"
            [ "$ptype" != "" ] && ptype=" -p $ptype"
            port="${input##*:}"
            [ "$port" != "" ] && port=" --${input%%:*}port $port"
            echo "$iptables -A INPUT$ptype$port -j ACCEPT"
        fi

        read input
    done
    echo ""
}

IPOpen() {
    echo "# 특정 IP를 통한 입력은 전부 받아들임"
    input="."
    read input
    while [ "$input" != "." ] && [ -n $input ]
    do
        if [ "$input" != "" ]; then
            echo "$iptables -A INPUT -s $input -j ACCEPT"
        fi

        read input
    done
    echo ""
}

AcceptRule() {
    echo "# 이미 연결 성립된 응답은 받아들임"
    echo "$iptables -A INPUT -p tcp ! --syn -j ACCEPT"
    echo ""
}

if [ $# -eq 0 ]; then
    echo "#!/bin/sh"
    echo "#######################################################################"
    echo "# 기본적으로 iptables 모듈을 등록하고 룰 기본 정책을 세우도록 합니다. #"
    echo "#######################################################################"
    DefaultRule
    echo "#########################################################################################"
    echo "# 모든 영역에서 허용할 서비스의 종류와 포트번호를 다음과 같은 형식으로 입력해 주십시오. #"
    echo "# 형식) <s|d>:[tcp|udp]:[port-number] (입력을 마칠때는 마침표 하나만 입력)              #"
    echo "#########################################################################################"
    PortOpen
    echo "##########################################################################################"
    echo "# 모든 포트를 허용할 IP주소를 차례대로 입력해 주십시오.                                  #"
    echo "# 예제) 192.168.1.1 혹은 192.168.1.0/24 혹은 192.168.1.0/255.255.255.0 (마칠때는 마침표) #"
    echo "##########################################################################################"
    IPOpen
    echo "###############################################"
    echo "# 마지막으로 다음의 일반적인 룰이 추가됩니다. #"
    echo "###############################################"
    AcceptRule

elif [ "$1" == "--help" ]; then
    Usage

else
    for i in $*
    do
        case $i in
        -i) exec < $2; shift 2;;
        -o) exec > $2; shift 2;;
        --) shift; break;;
        esac
    done
    echo "#!/bin/sh"
    DefaultRule
    PortOpen
    IPOpen
    AcceptRule
fi
================================================================


================================================================
-- 서비스별 포트 번호 참고 -------------------------------------
================================================================
echo            7/tcp
echo            7/udp
discard         9/tcp       sink null
discard         9/udp       sink null
systat          11/tcp      users
systat          11/udp      users
daytime         13/tcp
daytime         13/udp
qotd            17/tcp      quote
qotd            17/udp      quote
msp             18/tcp              # message send protocol
msp             18/udp              # message send protocol
chargen         19/tcp      ttytst source
chargen         19/udp      ttytst source
ftp-data        20/tcp
ftp-data        20/udp
# 21 is registered to ftp, but also used by fsp
ftp             21/tcp
ftp             21/udp      fsp fspd
ssh             22/tcp              # SSH Remote Login Protocol
ssh             22/udp              # SSH Remote Login Protocol
telnet          23/tcp
telnet          23/udp
# 24 - private mail system
smtp            25/tcp      mail
smtp            25/udp      mail
time            37/tcp      timserver
time            37/udp      timserver
rlp             39/tcp      resource    # resource location
rlp             39/udp      resource    # resource location
nameserver      42/tcp      name        # IEN 116
nameserver      42/udp      name        # IEN 116
nicname         43/tcp      whois
nicname         43/udp      whois
tacacs          49/tcp              # Login Host Protocol (TACACS)
tacacs          49/udp              # Login Host Protocol (TACACS)
re-mail-ck      50/tcp              # Remote Mail Checking Protocol
re-mail-ck      50/udp              # Remote Mail Checking Protocol
domain          53/tcp              # name-domain server
domain          53/udp
whois++         63/tcp
whois++         63/udp
bootps          67/tcp              # BOOTP server
bootps          67/udp
bootpc          68/tcp              # BOOTP client
bootpc          68/udp
tftp            69/tcp
tftp            69/udp
gopher          70/tcp              # Internet Gopher
gopher          70/udp
netrjs-1        71/tcp              # Remote Job Service
netrjs-1        71/udp              # Remote Job Service
netrjs-2        72/tcp              # Remote Job Service
netrjs-2        72/udp              # Remote Job Service
netrjs-3        73/tcp              # Remote Job Service
netrjs-3        73/udp              # Remote Job Service
netrjs-4        74/tcp              # Remote Job Service
netrjs-4        74/udp              # Remote Job Service
finger          79/tcp
finger          79/udp
http            80/tcp      www www-http    # WorldWideWeb HTTP
http            80/udp      www www-http    # HyperText Transfer Protocol
kerberos        88/tcp      kerberos5 krb5  # Kerberos v5
kerberos        88/udp      kerberos5 krb5  # Kerberos v5
supdup          95/tcp
supdup          95/udp
hostname        101/tcp     hostnames   # usually from sri-nic
hostname        101/udp     hostnames   # usually from sri-nic
iso-tsap        102/tcp     tsap        # part of ISODE.
csnet-ns        105/tcp     cso     # also used by CSO name server
csnet-ns        105/udp     cso
rtelnet         107/tcp             # Remote Telnet
rtelnet         107/udp
pop2            109/tcp     pop-2   postoffice  # POP version 2
pop2            109/udp     pop-2
pop3            110/tcp     pop-3       # POP version 3
pop3            110/udp     pop-3
sunrpc          111/tcp     portmapper  # RPC 4.0 portmapper TCP
sunrpc          111/udp     portmapper  # RPC 4.0 portmapper UDP
auth            113/tcp     authentication tap ident
auth            113/udp     authentication tap ident
sftp            115/tcp
sftp            115/udp
uucp-path       117/tcp
uucp-path       117/udp
nntp            119/tcp     readnews untp   # USENET News Transfer Protocol
nntp            119/udp     readnews untp   # USENET News Transfer Protocol
ntp             123/tcp
ntp             123/udp             # Network Time Protocol
netbios-ns      137/tcp             # NETBIOS Name Service
netbios-ns      137/udp
netbios-dgm     138/tcp             # NETBIOS Datagram Service
netbios-dgm     138/udp
netbios-ssn     139/tcp             # NETBIOS session service
netbios-ssn     139/udp
imap            143/tcp     imap2       # Interim Mail Access Proto v2
imap            143/udp     imap2
snmp            161/tcp             # Simple Net Mgmt Proto
snmp            161/udp             # Simple Net Mgmt Proto
snmptrap        162/udp     snmp-trap   # Traps for SNMP
cmip-man        163/tcp             # ISO mgmt over IP (CMOT)
cmip-man        163/udp
cmip-agent      164/tcp
cmip-agent      164/udp
mailq           174/tcp             # MAILQ
mailq           174/udp             # MAILQ
xdmcp           177/tcp             # X Display Mgr. Control Proto
xdmcp           177/udp
nextstep        178/tcp     NeXTStep NextStep   # NeXTStep window
nextstep        178/udp     NeXTStep NextStep   # server
bgp             179/tcp             # Border Gateway Proto.
bgp             179/udp
prospero        191/tcp             # Cliff Neuman's Prospero
prospero        191/udp
irc             194/tcp             # Internet Relay Chat
irc             194/udp
smux            199/tcp             # SNMP Unix Multiplexer
smux            199/udp
at-rtmp         201/tcp             # AppleTalk routing
at-rtmp         201/udp
at-nbp          202/tcp             # AppleTalk name binding
at-nbp          202/udp
at-echo         204/tcp             # AppleTalk echo
at-echo         204/udp
at-zis          206/tcp             # AppleTalk zone information
at-zis          206/udp
qmtp            209/tcp             # Quick Mail Transfer Protocol
qmtp            209/udp             # Quick Mail Transfer Protocol
z39.50          210/tcp     z3950 wais  # NISO Z39.50 database 
z39.50          210/udp     z3950 wais
ipx             213/tcp             # IPX
ipx             213/udp
imap3           220/tcp             # Interactive Mail Access
imap3           220/udp             # Protocol v3
link            245/tcp     ttylink
link            245/ucp     ttylink
fatserv         347/tcp             # Fatmen Server
fatserv         347/udp             # Fatmen Server
rsvp_tunnel     363/tcp
rsvp_tunnel     363/udp
rpc2portmap     369/tcp
rpc2portmap     369/udp             # Coda portmapper
codaauth2       370/tcp
codaauth2       370/udp             # Coda authentication server
ulistproc       372/tcp     ulistserv   # UNIX Listserv
ulistproc       372/udp     ulistserv
ldap            389/tcp
ldap            389/udp
svrloc          427/tcp             # Server Location Protocl
svrloc          427/udp             # Server Location Protocl
mobileip-agent  434/tcp
mobileip-agent  434/udp
mobilip-mn      435/tcp
mobilip-mn      435/udp
https           443/tcp             # MCom
https           443/udp             # MCom
snpp            444/tcp             # Simple Network Paging Protocol
snpp            444/udp             # Simple Network Paging Protocol
microsoft-ds    445/tcp
microsoft-ds    445/udp
kpasswd         464/tcp     kpwd        # Kerberos "passwd"
kpasswd         464/udp     kpwd        # Kerberos "passwd"
photuris        468/tcp
photuris        468/udp
saft            487/tcp             # Simple Asynchronous File Transfer
saft            487/udp             # Simple Asynchronous File Transfer
gss-http        488/tcp
gss-http        488/udp
pim-rp-disc     496/tcp
pim-rp-disc     496/udp
isakmp          500/tcp
isakmp          500/udp
gdomap          538/tcp             # GNUstep distributed objects
gdomap          538/udp             # GNUstep distributed objects
iiop            535/tcp
iiop            535/udp
dhcpv6-client   546/tcp
dhcpv6-client   546/udp
dhcpv6-server   547/tcp
dhcpv6-server   547/udp
rtsp            554/tcp             # Real Time Stream Control Protocol
rtsp            554/udp             # Real Time Stream Control Protocol
nntps           563/tcp             # NNTP over SSL
nntps           563/udp             # NNTP over SSL
whoami          565/tcp
whoami          565/udp
submission      587/tcp     msa     # mail message submission
submission      587/udp     msa     # mail message submission
npmp-local      610/tcp     dqs313_qmaster  # npmp-local / DQS
npmp-local      610/udp     dqs313_qmaster  # npmp-local / DQS
npmp-gui        611/tcp     dqs313_execd    # npmp-gui / DQS
npmp-gui        611/udp     dqs313_execd    # npmp-gui / DQS
hmmp-ind        612/tcp     dqs313_intercell # HMMP Indication / DQS
hmmp-ind        612/udp     dqs313_intercell # HMMP Indication / DQS
ipp             631/tcp             # Internet Printing Protocol
ipp             631/ucp             # Internet Printing Protocol
ldaps           636/tcp             # LDAP over SSL
ldaps           636/udp             # LDAP over SSL
acap            674/tcp
acap            674/udp
ha-cluster      694/tcp             # Heartbeat HA-cluster
ha-cluster      694/udp             # Heartbeat HA-cluster
kerberos-adm    749/tcp             # Kerberos `kadmin' (v5)
kerberos-iv     750/udp     kerberos4 kerberos-sec kdc
kerberos-iv     750/tcp     kerberos4 kerberos-sec kdc
webster         765/tcp             # Network dictionary
webster         765/udp
phonebook       767/tcp             # Network phonebook
phonebook       767/udp
rsync           873/tcp             # rsync
rsync           873/udp             # rsync
telnets         992/tcp
telnets         992/udp
imaps           993/tcp             # IMAP over SSL
imaps           993/udp             # IMAP over SSL
ircs            994/tcp
ircs            994/udp
pop3s           995/tcp             # POP-3 over SSL
pop3s           995/udp             # POP-3 over SSL

#
# UNIX specific services
#
exec            512/tcp
biff            512/udp     comsat
login           513/tcp
who             513/udp     whod
shell           514/tcp     cmd     # no passwords used
syslog          514/udp
printer         515/tcp     spooler # line printer spooler
printer         515/udp     spooler # line printer spooler
talk            517/udp
ntalk           518/udp
utime           519/tcp     unixtime
utime           519/udp     unixtime
efs             520/tcp
router          520/udp     route routed    # RIP
ripng           521/tcp
ripng           521/udp
timed           525/tcp     timeserver
timed           525/udp     timeserver
tempo           526/tcp     newdate
courier         530/tcp     rpc
conference      531/tcp     chat
netnews         532/tcp
netwall         533/udp             # -for emergency broadcasts
uucp            540/tcp     uucpd   # uucp daemon
klogin          543/tcp             # Kerberized `rlogin' (v5)
kshell          544/tcp     krcmd   # Kerberized `rsh' (v5)
afpovertcp      548/tcp             # AFP over TCP
afpovertcp      548/udp             # AFP over TCP
remotefs        556/tcp     rfs_server rfs  # Brunhoff remote filesystem

socks           1080/tcp            # socks proxy server
socks           1080/udp            # socks proxy server

# Port 1236 is registered as `bvcontrol', but is also used by the
# Gracilis Packeten remote config server.  The official name is listed as
# the primary name, with the unregistered name as an alias.
bvcontrol       1236/tcp    rmtcfg  # Daniel J. Walsh, Gracilis Packeten remote config server
bvcontrol       1236/udp            # Daniel J. Walsh

h323hostcallsc  1300/tcp            # H323 Host Call Secure
h323hostcallsc  1300/udp            # H323 Host Call Secure
ms-sql-s        1433/tcp            # Microsoft-SQL-Server 
ms-sql-s        1433/udp            # Microsoft-SQL-Server 
ms-sql-m        1434/tcp            # Microsoft-SQL-Monitor
ms-sql-m        1434/udp            # Microsoft-SQL-Monitor      
ica             1494/tcp            # Citrix ICA Client
ica             1494/udp            # Citrix ICA Client
wins            1512/tcp            # Microsoft's Windows Internet Name Service
wins            1512/udp            # Microsoft's Windows Internet Name Service
ingreslock      1524/tcp
ingreslock      1524/udp
prospero-np     1525/tcp            # Prospero non-privileged
prospero-np     1525/udp
datametrics     1645/tcp    old-radius  # datametrics / old radius entry
datametrics     1645/udp    old-radius  # datametrics / old radius entry
sa-msg-port     1646/tcp    old-radacct # sa-msg-port / old radacct entry
sa-msg-port     1646/udp    old-radacct # sa-msg-port / old radacct entry
kermit          1649/tcp
kermit          1649/udp
l2tp            1701/tcp    l2f
l2tp            1701/udp    l2f
h323gatedisc    1718/tcp
h323gatedisc    1718/udp
h323gatestat    1719/tcp
h323gatestat    1719/udp
h323hostcall    1720/tcp
h323hostcall    1720/udp
tftp-mcast      1758/tcp
tftp-mcast      1758/udp
mtftp           1759/udp
hello           1789/tcp
hello           1789/udp
radius          1812/tcp            # Radius
radius          1812/udp            # Radius
radius-acct     1813/tcp    radacct     # Radius Accounting
radius-acct     1813/udp    radacct     # Radius Accounting
mtp             1911/tcp            #
mtp             1911/udp            #
hsrp            1985/tcp            # Cisco Hot Standby Router Protocol
hsrp            1985/udp            # Cisco Hot Standby Router Protocol
licensedaemon   1986/tcp
licensedaemon   1986/udp
gdp-port        1997/tcp            # Cisco Gateway Discovery Protocol
gdp-port        1997/udp            # Cisco Gateway Discovery Protocol
nfs             2049/tcp    nfsd
nfs             2049/udp    nfsd
zephyr-srv      2102/tcp            # Zephyr server
zephyr-srv      2102/udp            # Zephyr server
zephyr-clt      2103/tcp            # Zephyr serv-hm connection
zephyr-clt      2103/udp            # Zephyr serv-hm connection
zephyr-hm       2104/tcp            # Zephyr hostmanager
zephyr-hm       2104/udp            # Zephyr hostmanager
cvspserver      2401/tcp            # CVS client/server operations
cvspserver      2401/udp            # CVS client/server operations
venus           2430/tcp            # codacon port
venus           2430/udp            # Venus callback/wbc interface
venus-se        2431/tcp            # tcp side effects
venus-se        2431/udp            # udp sftp side effect
codasrv         2432/tcp            # not used
codasrv         2432/udp            # server port
codasrv-se      2433/tcp            # tcp side effects
codasrv-se      2433/udp            # udp sftp side effectQ

# Ports numbered 2600 through 2606 are used by the zebra package without
# being registred.  The primary names are the registered names, and the
# unregistered names used by zebra are listed as aliases.
hpstgmgr        2600/tcp    zebrasrv    # HPSTGMGR
hpstgmgr        2600/udp            # HPSTGMGR
discp-client    2601/tcp    zebra   # discp client
discp-client    2601/udp            # discp client
discp-server    2602/tcp    ripd    # discp server
discp-server    2602/udp            # discp server
servicemeter    2603/tcp    ripngd  # Service Meter
servicemeter    2603/udp            # Service Meter
nsc-ccs         2604/tcp    ospfd   # NSC CCS
nsc-ccs         2604/udp            # NSC CCS
nsc-posa        2605/tcp    bgpd    # NSC POSA
nsc-posa        2605/udp            # NSC POSA
netmon          2606/tcp    ospf6d  # Dell Netmon
netmon          2606/udp            # Dell Netmon

corbaloc        2809/tcp            # CORBA naming service locator
icpv2           3130/tcp            # Internet Cache Protocol V2 (Squid)
icpv2           3130/udp            # Internet Cache Protocol V2 (Squid)
mysql           3306/tcp            # MySQL
mysql           3306/udp            # MySQL
trnsprntproxy   3346/tcp            # Trnsprnt Proxy
trnsprntproxy   3346/udp            # Trnsprnt Proxy
pxe             4011/udp            # PXE server
rwhois          4321/tcp            # Remote Who Is
rwhois          4321/udp            # Remote Who Is
krb524          4444/tcp            # Kerberos 5 to 4 ticket xlator
krb524          4444/udp            # Kerberos 5 to 4 ticket xlator
rfe             5002/tcp            # Radio Free Ethernet
rfe             5002/udp            # Actually uses UDP only
cfengine        5308/tcp            # CFengine
cfengine        5308/udp            # CFengine
cvsup           5999/tcp    CVSup   # CVSup file transfer/John Polstra/FreeBSD
cvsup           5999/udp    CVSup   # CVSup file transfer/John Polstra/FreeBSD
x11             6000/tcp    X       # the X Window System
afs3-fileserver 7000/tcp            # file server itself
afs3-fileserver 7000/udp            # file server itself
afs3-callback   7001/tcp            # callbacks to cache managers
afs3-callback   7001/udp            # callbacks to cache managers
afs3-prserver   7002/tcp            # users & groups database
afs3-prserver   7002/udp            # users & groups database
afs3-vlserver   7003/tcp            # volume location database
afs3-vlserver   7003/udp            # volume location database
afs3-kaserver   7004/tcp            # AFS/Kerberos authentication service
afs3-kaserver   7004/udp            # AFS/Kerberos authentication service
afs3-volser     7005/tcp            # volume managment server
afs3-volser     7005/udp            # volume managment server
afs3-errors     7006/tcp            # error interpretation service
afs3-errors     7006/udp            # error interpretation service
afs3-bos        7007/tcp            # basic overseer process
afs3-bos        7007/udp            # basic overseer process
afs3-update     7008/tcp            # server-to-server updater
afs3-update     7008/udp            # server-to-server updater
afs3-rmtsys     7009/tcp            # remote cache manager service
afs3-rmtsys     7009/udp            # remote cache manager service
sd              9876/tcp            # Session Director
sd              9876/udp            # Session Director
amanda          10080/tcp           # amanda backup services
amanda          10080/udp           # amanda backup services
pgpkeyserver    11371/tcp           # PGP/GPG public keyserver
pgpkeyserver    11371/udp           # PGP/GPG public keyserver
h323callsigalt  11720/tcp           # H323 Call Signal Alternate
h323callsigalt  11720/udp           # H323 Call Signal Alternate

bprd            13720/tcp           # BPRD (VERITAS NetBackup)
bprd            13720/udp           # BPRD (VERITAS NetBackup)
bpdbm           13721/tcp           # BPDBM (VERITAS NetBackup)
bpdbm           13721/udp           # BPDBM (VERITAS NetBackup)
bpjava-msvc     13722/tcp           # BP Java MSVC Protocol
bpjava-msvc     13722/udp           # BP Java MSVC Protocol
vnetd           13724/tcp           # Veritas Network Utility
vnetd           13724/udp           # Veritas Network Utility
bpcd            13782/tcp           # VERITAS NetBackup
bpcd            13782/udp           # VERITAS NetBackup
vopied          13783/tcp           # VOPIED Protocol
vopied          13783/udp           # VOPIED Protocol

# This port is registered as wnn6, but also used under the unregistered name
# "wnn4" by the FreeWnn package.
wnn6            22273/tcp   wnn4
wnn6            22273/ucp   wnn4

quake           26000/tcp
quake           26000/udp
wnn6-ds         26208/tcp
wnn6-ds         26208/udp
traceroute      33434/tcp
traceroute      33434/udp

#
# Datagram Delivery Protocol services
#
rtmp            1/ddp               # Routing Table Maintenance Protocol
nbp             2/ddp               # Name Binding Protocol
echo            4/ddp               # AppleTalk Echo Protocol
zip             6/ddp               # Zone Information Protocol

#
# Kerberos (Project Athena/MIT) services
# Note that these are for Kerberos v4, and are unregistered/unofficial.  Sites
# running v4 should uncomment these and comment out the v5 entries above.
#
kerberos_master 751/udp             # Kerberos authentication
kerberos_master 751/tcp             # Kerberos authentication
passwd_server   752/udp             # Kerberos passwd server
krbupdate       760/tcp     kreg    # Kerberos registration
kpop            1109/tcp            # Pop with Kerberos
knetd           2053/tcp            # Kerberos de-multiplexor

#
# Kerberos 5 services, also not registered with IANA
#
krb5_prop       754/tcp             # Kerberos slave propagation
eklogin         2105/tcp            # Kerberos encrypted rlogin

#
# Unregistered but necessary(?) (for NetBSD) services
#
supfilesrv      871/tcp             # SUP server
supfiledbg      1127/tcp            # SUP debugging

#
# Unregistered but useful/necessary other services
#
netstat         15/tcp              # (was once asssigned, no more)
linuxconf       98/tcp              # Linuxconf HTML access
poppassd        106/tcp             # Eudora
poppassd        106/udp             # Eudora
smtps           465/tcp             # SMTP over SSL (TLS)
gii             616/tcp             # gated interactive interface
omirr           808/tcp     omirrd      # online mirror
omirr           808/udp     omirrd      # online mirror
swat            901/tcp             # Samba Web Administration Tool
rndc            953/tcp             # rndc control sockets (BIND 9)
rndc            953/udp             # rndc control sockets (BIND 9)
skkserv         1178/tcp            # SKK Japanese input method
xtel            1313/tcp            # french minitel
support         1529/tcp    prmsd gnatsd    # GNATS, cygnus bug tracker
cfinger         2003/tcp            # GNU Finger
ninstall        2150/tcp            # ninstall service
ninstall        2150/udp            # ninstall service
afbackup        2988/tcp            # Afbackup system
afbackup        2988/udp            # Afbackup system
squid           3128/tcp            # squid web proxy
prsvp           3455/tcp            # RSVP Port
prsvp           3455/udp            # RSVP Port
postgres        5432/tcp            # POSTGRES
postgres        5432/udp            # POSTGRES
fax             4557/tcp            # FAX transmission service        (old)
hylafax         4559/tcp            # HylaFAX client-server protocol  (new)
sgi-dgl         5232/tcp            # SGI Distributed Graphics
sgi-dgl         5232/udp
noclog          5354/tcp            # noclogd with TCP (nocol)
noclog          5354/udp            # noclogd with UDP (nocol)
hostmon         5355/tcp            # hostmon uses TCP (nocol)
hostmon         5355/udp            # hostmon uses TCP (nocol)
canna           5680/tcp
x11-ssh-offset  6010/tcp            # SSH X11 forwarding offset
ircd            6667/tcp            # Internet Relay Chat
ircd            6667/udp            # Internet Relay Chat
xfs             7100/tcp            # X font server
tircproxy       7666/tcp            # Tircproxy
http-alt        8008/tcp
http-alt        8008/udp
webcache        8080/tcp            # WWW caching service
webcache        8080/udp            # WWW caching service
tproxy          8081/tcp            # Transparent Proxy
tproxy          8081/udp            # Transparent Proxy
jetdirect       9100/tcp    laserjet hplj
mandelspawn     9359/udp    mandelbrot  # network mandelbrot
kamanda         10081/tcp           # amanda backup services (Kerberos)
kamanda         10081/udp           # amanda backup services (Kerberos)
amandaidx       10082/tcp           # amanda backup services
amidxtape       10083/tcp           # amanda backup services
isdnlog         20011/tcp           # isdn logging system
isdnlog         20011/udp           # isdn logging system
vboxd           20012/tcp           # voice box system
vboxd           20012/udp           # voice box system
wnn4_Kr         22305/tcp           # used by the kWnn package
wnn4_Cn         22289/tcp           # used by the cWnn package
wnn4_Tw         22321/tcp           # used by the tWnn package
binkp           24554/tcp           # Binkley
binkp           24554/udp           # Binkley
asp             27374/tcp           # Address Search Protocol
asp             27374/udp           # Address Search Protocol
tfido           60177/tcp           # Ifmail
tfido           60177/udp           # Ifmail
fido            60179/tcp           # Ifmail
fido            60179/udp           # Ifmail
================================================================


================================================================
-- 마스터 smb.conf 소스 ----------------------------------------
================================================================
# This is the main Samba configuration file. You should read the
# smb.conf(5) manual page in order to understand the options listed
# here. Samba has a huge number of configurable options (perhaps too
# many!) most of which are not shown in this example
#
# Any line which starts with a ; (semi-colon) or a # (hash) 
# is a comment and is ignored. In this example we will use a #
# for commentry and a ; for parts of the config file that you
# may wish to enable
#
# NOTE: Whenever you modify this file you should run the command "testparm"
# to check that you have not made any basic syntactic errors. 
#
#======================= Global Settings =====================================
[global]

# workgroup = NT-Domain-Name or Workgroup-Name
# 작업 그룹 이름을 넣는다. 되도록이면 영문 사용
   workgroup = sorii-lan

# server string is the equivalent of the NT Description field
# 이부분에 적당한 서버 이름과 NetBIOS이름을 넣는다
# 서버이름은 한글 사용 가능
   server string = Home Server
   netbios name = HOME

# This option is important for security. It allows you to restrict
# connections to machines which are on your local network. The
# following example restricts access to two C class networks and
# the "loopback" interface. For more examples of the syntax see
# the smb.conf man page
;   hosts allow = 192.168.1. 192.168.2. 127.

# if you want to automatically load your printer list rather
# than setting them up individually then you'll need this
   printcap name = /etc/printcap
   load printers = yes

# It should not be necessary to spell out the print system type unless
# yours is non-standard. Currently supported print systems include:
# bsd, sysv, plp, lprng, aix, hpux, qnx
   printing = lprng

# Uncomment this if you want a guest account, you must add this to /etc/passwd
# otherwise the user "nobody" is used
;  guest account = pcguest

# this tells Samba to use a separate log file for each machine
# that connects
   log file = /var/log/samba/%m.log

# Put a capping on the size of the log files (in Kb).
   max log size = 0

# code page
# 코드 페이지 한글로 설정
   client code page = 949
#   character set = ISO8859-1

# Security mode. Most people will want user level security. See
# security_level.txt for details.
# user 인증 모드, 로컬의 사용자 아이디와 암호로 인증한다.
   security = user

# Use password server option only with security = server
# The argument list may include:
#   password server = My_PDC_Name [My_BDC_Name] [My_Next_BDC_Name]
# or to auto-locate the domain controller/s
#   password server = *
;   password server = <NT-Server-Name>

# Password Level allows matching of _n_ characters of the password for
# all combinations of upper and lower case.
;  password level = 8
;  username level = 8

# You may wish to use password encryption. Please read
# ENCRYPTION.txt, Win95.txt and WinNT.txt in the Samba documentation.
# Do not enable this option unless you have read those documents
   encrypt passwords = yes
   smb passwd file = /etc/samba/smbpasswd

# The following is needed to keep smbclient from spouting spurious errors
# when Samba is built with support for SSL.
;   ssl CA certFile = /usr/share/ssl/certs/ca-bundle.crt

# The following are needed to allow password changing from Windows to
# update the Linux sytsem password also.
# NOTE: Use these with 'encrypt passwords' and 'smb passwd file' above.
# NOTE2: You do NOT need these to allow workstations to change only
#        the encrypted SMB passwords. They allow the Unix password
#        to be kept in sync with the SMB password.
   unix password sync = Yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *New*password* %n\n *Retype*new*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*

# You can use PAM's password change control flag for Samba. If
# enabled, then PAM will be used for password changes when requested
# by an SMB client instead of the program listed in passwd program.
# It should be possible to enable this without changing your passwd
# chat parameter for most setups.

   pam password change = yes

# Unix users can map to different SMB User names
;  username map = /etc/samba/smbusers

# Using the following line enables you to customise your configuration
# on a per machine basis. The %m gets replaced with the netbios name
# of the machine that is connecting
;   include = /etc/samba/smb.conf.%m

# This parameter will control whether or not Samba should obey PAM's
# account and session management directives. The default behavior is
# to use PAM for clear text authentication only and to ignore any
# account or session management. Note that Samba always ignores PAM
# for authentication in the case of encrypt passwords = yes

  obey pam restrictions = yes

# Most people will find that this option gives better performance.
# See speed.txt and the manual pages for details
   socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

# Configure Samba to use multiple interfaces
# If you have multiple network interfaces then you must list them
# here. See the man page for details.
;   interfaces = 192.168.12.2/24 192.168.13.2/24 

# Configure remote browse list synchronisation here
#  request announcement to, or browse list sync from:
#   a specific host or from / to a whole subnet (see below)
;   remote browse sync = 192.168.3.25 192.168.5.255
# Cause this host to announce itself to local subnets here
;   remote announce = 192.168.1.255 192.168.2.44

# Browser Control Options:
# set local master to no if you don't want Samba to become a master
# browser on your network. Otherwise the normal election rules apply
;   local master = no

# OS Level determines the precedence of this server in master browser
# elections. The default value should be reasonable
;   os level = 33

# Domain Master specifies Samba to be the Domain Master Browser. This
# allows Samba to collate browse lists between subnets. Don't use this
# if you already have a Windows NT domain controller doing this job
   domain master = yes 

# Preferred Master causes Samba to force a local browser election on startup
# and gives it a slightly higher chance of winning the election
;   preferred master = yes

# Enable this if you want Samba to be a domain logon server for 
# Windows95 workstations. 
# 윈95를 위한 도메인 로그온이 가능하게 한다.
   domain logons = yes

# if you enable domain logons then you may want a per-machine or
# per user logon script
# run a specific logon batch file per workstation (machine)
;   logon script = %m.bat
# run a specific logon batch file per username
;   logon script = %U.bat

# Where to store roving profiles (only for Win95 and WinNT)
#        %L substitutes for this servers netbios name, %U is username
#        You must uncomment the [Profiles] share below
;   logon path = \\%L\Profiles\%U

# Windows Internet Name Serving Support Section:
# WINS Support - Tells the NMBD component of Samba to enable it's WINS Server
# WINS서버가 되도록 한다
   wins support = yes

# WINS Server - Tells the NMBD components of Samba to be a WINS Client
#   Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
;   wins server = w.x.y.z

# WINS Proxy - Tells Samba to answer name resolution queries on
# behalf of a non WINS capable client, for this to work there must be
# at least one  WINS Server on the network. The default is NO.
;   wins proxy = yes

# DNS Proxy - tells Samba whether or not to try to resolve NetBIOS names
# via DNS nslookups. The built-in default for versions 1.9.17 is yes,
# this has been changed in version 1.9.18 to no.
   dns proxy = no 

# Case Preservation can be handy - system default is _no_
# NOTE: These can be set on a per share basis
;  preserve case = no
;  short preserve case = no
# Default case is normally upper case for all DOS files
;  default case = lower
# Be very careful with case sensitivity - it can break things!
;  case sensitive = no

#============================ Share Definitions ==============================
[homes]
   comment = 사용자 홈
   browseable = no
   writable = yes
   valid users = %S
   create mode = 0640
   directory mode = 0750
# If you want users samba doesn't recognize to be mapped to a guest user
; map to guest = bad user

[manage]
   comment = 기획/관리자 그룹. 기획/관리자만 쓰기가 가능
   path = /home/manage
   public = yes
   writable = yes
   create mode = 0664
   directory mode = 0775

[develop]
   comment = 개발자 그룹. 개발자만 쓰기가 가능
   path = /home/develop
   public = yes
   writable = yes
   create mode = 0664
   directory mode = 0775

[design]
   comment = 디자이너 그룹. 디자이너만 쓰기가 가능
   path = /home/design
   public = yes
   writable = yes
   create mode = 0664
   directory mode = 0775

[sorii]
   comment = 소리아이 공유. ftp://ftp.sorii.com/으로 접속, 아이디 sorii. 공용의 목적으로 사용
   path = /home/sorii
   public = yes
   writable = yes
   create mode = 0660
   directory mode = 0770

[public_html]
   comment = 홈페이지 공간. 여기에 폴더를 만들어 두면 http://폴더이름.sorii.com/으로 홈페이지 운영이 가능
   path = /home/public_html
   public = yes
   writable = yes
   create mode = 0644
   directory mode = 0755

# Un-comment the following and create the netlogon directory for Domain Logons
; [netlogon]
;   comment = Network Logon Service
;   path = /usr/local/samba/lib/netlogon
;   guest ok = yes
;   writable = no
;   share modes = no


# Un-comment the following to provide a specific roving profile share
# the default is to use the user's home directory
;[Profiles]
;    path = /usr/local/samba/profiles
;    browseable = no
;    guest ok = yes


# NOTE: If you have a BSD-style print system there is no need to 
# specifically define each individual printer
[printers]
   comment = All Printers
   path = /var/spool/samba
   browseable = no
# Set public = yes to allow user 'guest account' to print
   guest ok = no
   writable = no
   printable = yes

# This one is useful for people to share files
;[tmp]
;   comment = Temporary file space
;   path = /tmp
;   read only = no
;   public = yes

# A publicly accessible directory, but read only, except for people in
# the "staff" group
;[public]
;   comment = Public Stuff
;   path = /home/samba
;   public = yes
;   writable = yes
;   printable = no
;   write list = @staff

# Other examples. 
#
# A private printer, usable only by fred. Spool data will be placed in fred's
# home directory. Note that fred must have write access to the spool directory,
# wherever it is.
;[fredsprn]
;   comment = Fred's Printer
;   valid users = fred
;   path = /home/fred
;   printer = freds_printer
;   public = no
;   writable = no
;   printable = yes

# A private directory, usable only by fred. Note that fred requires write
# access to the directory.
;[fredsdir]
;   comment = Fred's Service
;   path = /usr/somewhere/private
;   valid users = fred
;   public = no
;   writable = yes
;   printable = no

# a service which has a different directory for each machine that connects
# this allows you to tailor configurations to incoming machines. You could
# also use the %U option to tailor it by user name.
# The %m gets replaced with the machine name that is connecting.
;[pchome]
;  comment = PC Directories
;  path = /usr/local/pc/%m
;  public = no
;  writable = yes

# A publicly accessible directory, read/write to all users. Note that all files
# created in the directory by users will be owned by the default user, so
# any user with access can delete any other user's files. Obviously this
# directory must be writable by the default user. Another user could of course
# be specified, in which case all files would be owned by that user instead.
;[public]
;   path = /usr/somewhere/else/public
;   public = yes
;   only guest = yes
;   writable = yes
;   printable = no

# The following two entries demonstrate how to share a directory so that two
# users can place files there that will be owned by the specific users. In this
# setup, the directory should be writable by both users and should have the
# sticky bit set on it to prevent abuse. Obviously this could be extended to
# as many users as required.
;[myshare]
;   comment = Mary's and Fred's stuff
;   path = /usr/somewhere/shared
;   valid users = mary fred
;   public = no
;   writable = yes
;   printable = no
;   create mask = 0765
================================================================


================================================================
-- 슬레이브 smb.conf 소스 --------------------------------------
================================================================
# This is the main Samba configuration file. You should read the
# smb.conf(5) manual page in order to understand the options listed
# here. Samba has a huge number of configurable options (perhaps too
# many!) most of which are not shown in this example
#
# Any line which starts with a ; (semi-colon) or a # (hash)
# is a comment and is ignored. In this example we will use a #
# for commentry and a ; for parts of the config file that you
# may wish to enable
#
# NOTE: Whenever you modify this file you should run the command "testparm"
# to check that you have not made any basic syntactic errors.
#
#======================= Global Settings =====================================
[global]

# workgroup = NT-Domain-Name or Workgroup-Name
# 작업 그룹 이름을 넣는다. 되도록이면 영문 사용
   workgroup = sorii-lan

# server string is the equivalent of the NT Description field
# 이부분에 적당한 서버 이름과 NetBIOS이름을 넣는다
# 서버이름은 한글 사용 가능
   server string = Name Server
   netbios name = NAME

# This option is important for security. It allows you to restrict
# connections to machines which are on your local network. The
# following example restricts access to two C class networks and
# the "loopback" interface. For more examples of the syntax see
# the smb.conf man page
;   hosts allow = 192.168.1. 192.168.2. 127.

# if you want to automatically load your printer list rather
# than setting them up individually then you'll need this
   printcap name = /etc/printcap
   load printers = yes

# It should not be necessary to spell out the print system type unless
# yours is non-standard. Currently supported print systems include:
# bsd, sysv, plp, lprng, aix, hpux, qnx, cups
   printing = cups

# Uncomment this if you want a guest account, you must add this to /etc/passwd
# otherwise the user "nobody" is used
;  guest account = pcguest

# this tells Samba to use a separate log file for each machine
# that connects
   log file = /var/log/samba/%m.log

# Put a capping on the size of the log files (in Kb).
   max log size = 0

# code page
# 코드 페이지 한글로 설정
   client code page = 949
#   character set = ISO8859-1


# Security mode. Most people will want user level security. See
# security_level.txt for details.
# server 인증 모드, NetBIOS이름과 일치하는 다른 삼바 서버를 통해 사용자 모드와 같이 인증한다.
   security = server

# Use password server option only with security = server
# The argument list may include:
#   password server = My_PDC_Name [My_BDC_Name] [My_Next_BDC_Name]
# or to auto-locate the domain controller/s
# 보안 레벨을 server로 했을 때 사용할 인증 서버의 NetBIOS 이름을 지정
;   password server = *
   password server = HOME

# Password Level allows matching of _n_ characters of the password for
# all combinations of upper and lower case.
;  password level = 8
;  username level = 8

# You may wish to use password encryption. Please read
# ENCRYPTION.txt, Win95.txt and WinNT.txt in the Samba documentation.
# Do not enable this option unless you have read those documents
   encrypt passwords = yes
   smb passwd file = /etc/samba/smbpasswd

# The following is needed to keep smbclient from spouting spurious errors
# when Samba is built with support for SSL.
;   ssl CA certFile = /usr/share/ssl/certs/ca-bundle.crt

# The following are needed to allow password changing from Windows to
# update the Linux system password also.
# NOTE: Use these with 'encrypt passwords' and 'smb passwd file' above.
# NOTE2: You do NOT need these to allow workstations to change only
#        the encrypted SMB passwords. They allow the Unix password
#        to be kept in sync with the SMB password.
   unix password sync = Yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *New*password* %n\n *Retype*new*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*

# You can use PAM's password change control flag for Samba. If
# enabled, then PAM will be used for password changes when requested
# by an SMB client instead of the program listed in passwd program.
# It should be possible to enable this without changing your passwd
# chat parameter for most setups.

   pam password change = yes

# Unix users can map to different SMB User names
;  username map = /etc/samba/smbusers

# Using the following line enables you to customise your configuration
# on a per machine basis. The %m gets replaced with the netbios name
# of the machine that is connecting
;   include = /etc/samba/smb.conf.%m

# This parameter will control whether or not Samba should obey PAM's
# account and session management directives. The default behavior is
# to use PAM for clear text authentication only and to ignore any
# account or session management. Note that Samba always ignores PAM
# for authentication in the case of encrypt passwords = yes

  obey pam restrictions = yes

# Most people will find that this option gives better performance.
# See speed.txt and the manual pages for details
   socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

# Configure Samba to use multiple interfaces
# If you have multiple network interfaces then you must list them
# here. See the man page for details.
;   interfaces = 192.168.12.2/24 192.168.13.2/24

# Configure remote browse list synchronisation here
#  request announcement to, or browse list sync from:
#       a specific host or from / to a whole subnet (see below)
;   remote browse sync = 192.168.3.25 192.168.5.255
# Cause this host to announce itself to local subnets here
;   remote announce = 192.168.1.255 192.168.2.44

# Browser Control Options:
# set local master to no if you don't want Samba to become a master
# browser on your network. Otherwise the normal election rules apply
;   local master = no

# OS Level determines the precedence of this server in master browser
# elections. The default value should be reasonable
;   os level = 33

# Domain Master specifies Samba to be the Domain Master Browser. This
# allows Samba to collate browse lists between subnets. Don't use this
# if you already have a Windows NT domain controller doing this job
;   domain master = yes

# Preferred Master causes Samba to force a local browser election on startup
# and gives it a slightly higher chance of winning the election
;   preferred master = yes

# Enable this if you want Samba to be a domain logon server for
# Windows95 workstations.
# 윈95를 위한 도메인 로그온이 가능하게 한다.
   domain logons = yes

# if you enable domain logons then you may want a per-machine or
# per user logon script
# run a specific logon batch file per workstation (machine)
;   logon script = %m.bat
# run a specific logon batch file per username
;   logon script = %U.bat

# Where to store roving profiles (only for Win95 and WinNT)
#        %L substitutes for this servers netbios name, %U is username
#        You must uncomment the [Profiles] share below
;   logon path = \\%L\Profiles\%U

# Windows Internet Name Serving Support Section:
# WINS Support - Tells the NMBD component of Samba to enable it's WINS Server
;   wins support = yes

# WINS Server - Tells the NMBD components of Samba to be a WINS Client
#       Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
# 지정된 주소의 서버를 사용하는 WINS클라이언트가 되도록 한다
   wins server = 218.235.99.63

# WINS Proxy - Tells Samba to answer name resolution queries on
# behalf of a non WINS capable client, for this to work there must be
# at least one  WINS Server on the network. The default is NO.
;   wins proxy = yes

# DNS Proxy - tells Samba whether or not to try to resolve NetBIOS names
# via DNS nslookups. The built-in default for versions 1.9.17 is yes,
# this has been changed in version 1.9.18 to no.
   dns proxy = no

# Case Preservation can be handy - system default is _no_
# NOTE: These can be set on a per share basis
;  preserve case = no
;  short preserve case = no
# Default case is normally upper case for all DOS files
;  default case = lower
# Be very careful with case sensitivity - it can break things!
;  case sensitive = no

#============================ Share Definitions ==============================
;[homes]
;   comment = Home Directories
;   browseable = no
;   writable = yes
;   valid users = %S
;   create mode = 0664
;   directory mode = 0775
# If you want users samba doesn't recognize to be mapped to a guest user
; map to guest = bad user

[share]
   comment = 공유 폴더
   path = /home/sorii
   writable = yes
   create mode = 0640
   directory mode = 0750
   write list = @sorii


# Un-comment the following and create the netlogon directory for Domain Logons
; [netlogon]
;   comment = Network Logon Service
;   path = /usr/local/samba/lib/netlogon
;   guest ok = yes
;   writable = no
;   share modes = no

# Un-comment the following to provide a specific roving profile share
# the default is to use the user's home directory
;[Profiles]
;    path = /usr/local/samba/profiles
;    browseable = no
;    guest ok = yes


# NOTE: If you have a BSD-style print system there is no need to
# specifically define each individual printer
[printers]
   comment = All Printers
   path = /var/spool/samba
   browseable = no
# Set public = yes to allow user 'guest account' to print
   guest ok = no
   writable = no
   printable = yes

# This one is useful for people to share files
;[tmp]
;   comment = Temporary file space
;   path = /tmp
;   read only = no
;   public = yes

# A publicly accessible directory, but read only, except for people in
# the "staff" group
;[public]
;   comment = Public Stuff
;   path = /home/samba
;   public = yes
;   writable = yes
;   printable = no
;   write list = @staff

# Other examples.
#
# A private printer, usable only by fred. Spool data will be placed in fred's
# home directory. Note that fred must have write access to the spool directory,
# wherever it is.
;[fredsprn]
;   comment = Fred's Printer
;   valid users = fred
;   path = /home/fred
;   printer = freds_printer
;   public = no
;   writable = no
;   printable = yes

# A private directory, usable only by fred. Note that fred requires write
# access to the directory.
;[fredsdir]
;   comment = Fred's Service
;   path = /usr/somewhere/private
;   valid users = fred
;   public = no
;   writable = yes
;   printable = no

# a service which has a different directory for each machine that connects
# this allows you to tailor configurations to incoming machines. You could
# also use the %U option to tailor it by user name.
# The %m gets replaced with the machine name that is connecting.
;[pchome]
;  comment = PC Directories
;  path = /usr/local/pc/%m
;  public = no
;  writable = yes

# A publicly accessible directory, read/write to all users. Note that all files
# created in the directory by users will be owned by the default user, so
# any user with access can delete any other user's files. Obviously this
# directory must be writable by the default user. Another user could of course
# be specified, in which case all files would be owned by that user instead.
;[public]
;   path = /usr/somewhere/else/public
;   public = yes
;   only guest = yes
;   writable = yes
;   printable = no

# The following two entries demonstrate how to share a directory so that two
# users can place files there that will be owned by the specific users. In this
# setup, the directory should be writable by both users and should have the
# sticky bit set on it to prevent abuse. Obviously this could be extended to
# as many users as required.
;[myshare]
;   comment = Mary's and Fred's stuff
;   path = /usr/somewhere/shared
;   valid users = mary fred
;   public = no
;   writable = yes
;   printable = no
;   create mask = 0765
================================================================


================================================================
-- perl 정규식 참고 --------------------------------------------
================================================================
정규식에 사용되는 특수문자의 의미
------------------+-----------------------------------------------------
^ (caret)         | 라인의 처음이나 문자열의 처음을 표시
          | ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
------------------+-----------------------------------------------------
$ (dollar)        | 라인의 끝이나 문자열의 끝을 표시
          | aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
------------------+-----------------------------------------------------
. (period)        | 임의의 한 문자를 표시
          | ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
          | a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)
------------------+-----------------------------------------------------
[] (bracket)      | 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄
          | []내에서 "^"이 선행되면 not을 나타냄
------------------+-----------------------------------------------------
{} (brace)        | {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄
          | a{3} ('a'의 3번 반복인 aaa만 해당됨)
------------------+-----------------------------------------------------
* (asterisk)      | "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열
          | ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등)
------------------+-----------------------------------------------------
+                 | "+" 직전의 선행문자가 1번 이상 나타나는 문자열
          | ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨)
------------------+-----------------------------------------------------
?                 | "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
          | ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)
------------------+-----------------------------------------------------
() (parenthesis)  | ()는 정규식내에서 패턴을 그룹화 할 때 사용
------------------+-----------------------------------------------------
| (bar)           | or를 나타냄
          | a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
------------------+-----------------------------------------------------
\ (backslash)     | 위에서 사용된 특수 문자들을 정규식내에서 문자로 취급하고 싶을 때
          | '\'를 선행시켜서 사용하면됨
          | filename\.ext ("filename.ext"를 나타냄).
------------------+-----------------------------------------------------

정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함 
위의 정규식 연산자 가운데 vi에서는 지원하지 않는 연산자가 있습니다. vi의 경우 +연산자도 
없습니다. regular expression library에 따라 지원하는 연산자의 종류가 상당히 다릅니다. 요즘은 
perl-style regular expression이 표준으로 자리잡아가는 것이 대체적인 추세이고, perl의 regular 
expression은 가장 복합하고 기능이 많은 편입니다. 

· [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일) 
· [Yy] (Y 또는 y) 
· [A-Za-z0-9] (모든 알파벳과 숫자) 
· [-A-Z]. ("-"(hyphen)과 모든 대문자) 
· [^a-z] (소문자 이외의 문자) 
· [^0-9] (숫자 이외의 문자) 
· [[:digit:]] ([0-9]와 동일) 
· a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄) 
· a{3,5} (aaa, aaaa, aaaaa 만 해당됨) 
· ab{2,3} (abb와 abbb 만 해당됨) 
· [0-9]{2} (두 자리 숫자) 
· doc[7-9]{2} (doc77, doc87, doc97 등이 해당) 
· [^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당) 
· .{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당) 
· * (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨) 
· .* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨) 
· ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등) 
· a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등) 
· doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당) 
· [A-Z].* (대문자로만 이루어진 문자열) 
· like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이 됨, like, likely, liker, likelihood 등) 
· ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등) 
· like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨) 
· [A-Z]+ (대문자로만 이루어진 문자열) 
· yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함) 
· korea|japan|chinese (korea, japan, chinese 중 하나) 
· [\?\[\\\]] ('?', '[', '\', ']' 중 하나) 
================================================================


================================================================
-- SoriiMilter.pl 소스 -----------------------------------------
================================================================
#!/usr/bin/perl
# 소리아이 메일 필터
#   기본적으로 제목의 '광고','홍보'와
#   첨부파일의 확장자가 scr,pif,bat,com인 것을 차단한다.

use Sendmail::Milter;
use Socket;
use MIME::Base64;

$logfile = "/var/log/milterlog";

sub connect_callback {
    my ($ctx, $hostname, $sockaddr_in) = @_;

    open LOG,">>$logfile";
        $date = `echo -n \`date '+\%Y-\%m-\%d \%H:\%M:\%S'\``;
        print LOG "[connect $date] hostname: '$hostname'\n";
    close LOG;

    return SMFIS_CONTINUE;
}

sub helo_callback {
    my ($ctx, $helohost) = @_;

    open LOG,">>$logfile";
    print LOG "    [helo] helohost: '$helohost'\n";

    # 송신 도메인이 확실치 않은 메일 제거
    if ($helohost =~ /.*([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/) {
        print LOG "    ! helo invalid: $helohost\n";
        return SMFIS_REJECT;
    }
    close LOG;

    return SMFIS_CONTINUE;
}

sub envfrom_callback {
    my ($ctx, $from, @args) = @_;

    open LOG,">>$logfile";
    print LOG "    [envfrom] args: '$from','" . join("','", @args) . "'\n";
    
    # 익명 송신자 제거
    if ($from !~ /.*\@.*/) {
        print LOG "    ! from nobody: $from\n";
        return SMFIS_REJECT;
    }
    close LOG;

    return SMFIS_CONTINUE;
}

sub envrcpt_callback {
    my ($ctx, $rcpt, @args) = @_;

    open LOG,">>$logfile";
    print LOG "    [envrcpt] args: '$rcpt','" . join("','", @args) . "'\n";

    # 익명 수신자 제거
    if ($rcpt !~ /.*\@.*/) {
        print LOG "    ! rcpt nobody: $rcpt\n";
        return SMFIS_REJECT;
    }
    close LOG;

    return SMFIS_CONTINUE;
}

sub check_subject {
    my ($subject) = @_;

    open LOG,">>$logfile";
    # 광고 및 홍보 제거
    if ($subject =~ /[[(< ({].*((광|=B1=A4).*(고|=B0=ED)|(홍|=C8=AB).*(보|=BA=B8)).*[])>) }]/) {
        print LOG "    ! ad: $subject\n";
        return "bad";
    }
    # 포르노 제거
    if ($subject =~ /.*(포르노|porno).*/) {
        print LOG "    ! porno: $subject\n";
        return "bad";
    }
    close LOG;
    return "good";
}

sub header_callback {
    my ($ctx, $headerf, $headerv) = @_;

    # Subject: 헤더인 경우.
    if ($headerf eq "Subject") {
        $chk = &check_subject($headerv);
        if ($chk eq "bad") {
            return SMFIS_REJECT;
        }

        # base64 디코딩을 수행
        @decoded = split(/[\?+\n+ +\t+]/, $headerv);
        $headerv = "";
        foreach (@decoded) {
            $headerv .= decode_base64($_);
        }

        $chk = &check_subject($headerv);
        if ($chk eq "bad") {
            return SMFIS_REJECT;
        }
    }

    return SMFIS_CONTINUE;
}

sub eoh_callback {
    my ($ctx) = @_;

    return SMFIS_CONTINUE;
}

sub check_body {
    my ($body) = @_;

    open LOG,">>$logfile";
    # 광고 체크 : 정보통신부
    if ($body =~ /정보통신부 *권고 *사항에 *의거/) {
        print LOG "    ! ad: 정보통신부 권고 사항에 의거한 내용\n";
        return "bad";
    }
    close LOG;
    return "good";
}

sub body_callback {
    my ($ctx, $body_chunk, $len) = @_;

    open LOG,">>$logfile";
    print LOG "    [body] length: $len\n";
    close LOG;

    # 적당하지 않은 첨부파일 제거
    @decoded = split(/[\n+\r+]/, $body_chunk);
    foreach (@decoded) {
        if ($_ =~ /name=\"?.*\.(scr|pif|bat)\"?/) {
            open LOG,">>$logfile";
            print LOG "    ! virus?: $1 '$_'\n";
            close LOG;
            return SMFIS_REJECT;
        }
    }

    $chk = &check_body($body_chunk);
    if ($chk eq "bad") {
        return SMFIS_REJECT;
    }

    # base64 디코딩을 수행
    @decoded = split(/[\?+\n+ +\t+]/, $body_chunk);
    $body_chunk = "";
    foreach (@decoded) {
        $body_chunk .= decode_base64($_);
    }

    $chk = &check_body($body_chunk);
    if ($chk eq "bad") {
        return SMFIS_REJECT;
    }

    return SMFIS_CONTINUE;
}

sub eom_callback {
    my ($ctx) = @_;

    $ctx->addheader("X-SoriiMilter", "Spam,Virus Chk 1.01beta [Perl version]");

    return SMFIS_CONTINUE;
}

sub abort_callback {
    my ($ctx) = @_;

    open LOG,">>$logfile";
    print LOG "    ! mail rejected !\n";
    close LOG;

    return SMFIS_CONTINUE;
}

sub close_callback {
    my ($ctx) = @_;

    open LOG,">>$logfile";
    print LOG "    mail colsed\n";
    close LOG;

    return SMFIS_CONTINUE;
}

############################################
# 이하의 코드는 밀터 기본 코드로 수정 불가 #
############################################

my %my_callbacks = (
    'connect'   => \&connect_callback,
    'helo'      => \&helo_callback,
    'envfrom'   => \&envfrom_callback,
    'envrcpt'   => \&envrcpt_callback,
    'header'    => \&header_callback,
    'eoh'       => \&eoh_callback,
    'body'      => \&body_callback,
    'eom'       => \&eom_callback,
    'abort'     => \&abort_callback,
    'close'     => \&close_callback,
);

BEGIN:
{
    if (scalar(@ARGV) < 2) {
        print "Usage: perl $0 <name_of_filter> <path_to_sendmail.cf> [name_of_logfile]\n";
        exit;
    }

    my $conn = Sendmail::Milter::auto_getconn($ARGV[0], $ARGV[1]);

    print "Found connection info for '$ARGV[0]': $conn\n";

    if ($conn =~ /^local:(.+)$/) {
        my $unix_socket = $1;

        if (-e $unix_socket) {
            print "Attempting to UNIX socket '$conn' ...";

            if (unlink($unix_socket) == 0) {
                print "failed.\n";
                exit;
            }
            print "successful.\n";
        }
    }

    if (!Sendmail::Milter::auto_setconn($ARGV[0], $ARGV[1])) {
        print "Failed to detect connection information.\n";
        exit;
    }

    if (!Sendmail::Milter::register($ARGV[0], \%my_callbacks, SMFI_CURR_ACTS)) {
        print "Failed to register callbacks for $ARGV[0].\n";
        exit;
    }

    print("Starting Sendmail::Milter $Sendmail::Milter::VERSION engine.\n");
    if ($ARGV !~ /[ \t]*/) {
        $logfile = $ARGV[2];
    }
    print("Writing log '$logfile'.\n");

    open LOG,">>$logfile";
        $date = `echo -n \`date '+\%Y-\%m-\%d \%H:\%M:\%S'\``;
    print LOG "\n## Starting Milter ## $date\n";
    close LOG;

    if (Sendmail::Milter::main()) {
        print "Successful exit from the Sendmail::Milter engine.\n";
    }
    else {
        print "Unsuccessful exit from the Sendmail::Milter engine.\n";
    }
    open LOG,">>$logfile";
        $date = `echo -n \`date '+\%Y-\%m-\%d \%H:\%M:\%S'\``;
    print LOG "\n## Stoped Milter ## $date\n";
    close LOG;
}
================================================================


================================================================
-- userman 소스 ------------------------------------------------
================================================================
#!/bin/bash

# 사용자 정보 기본값
userid=""
fullname=""
password=""
initgrp="sorii"
grps=""
homedir=""
shelltype=""
skelcopy="no"
skeldir=""
mkusergrp="no"
setuid=""
mkhome="yes"
addsmb="yes"

ShowTitle() {
    clear
    echo "========================================"
    echo "=      NIS, SMB 통합 사용자 관리       ="
    echo "========================================"
    echo
}

ShowMainMenu() {
    echo "  1. 사용자 추가"
    echo "  2. 사용자 삭제"
    echo
    echo "  3. 그룹 추가"
    echo "  4. 그룹 삭제"
    echo
    echo "  5. NIS를 통해 사용자와 그룹 목록 보기"
    echo
    echo " [q] 종료"
}

ShowAddUserMenu() {
    clear
    echo "========================================"
    echo "=          새로운 사용자 추가          ="
    echo "========================================"
    echo
    echo "  1. 사용자 ID : $userid"
    echo "  2. 전체 이름 : $fullname"
    echo "  3. 암호      : 나중에 입력"
    echo "  4. 초기 그룹 : $initgrp"
    echo "  5. 추가 그룹 : $grps"
    echo -n "  6. 홈 위치   : "
    if [ "$homedir" = "" ]; then
        echo "기본 위치 사용"
    else
        echo "$homedir"
    fi
    echo -n "  7. 쉘 종류   : $shelltype"
    if [ "$shelltype" = "" ]; then
        echo "기본 쉘 사용"
    else
        echo "$shelltype"
    fi
    echo -n "  8. 뼈대 복사 : $skelcopy 스켈렉톤 디렉토리를 복사"
    if [ "$skelcopy" = "yes" ]; then
        echo "합니다."
    else
        echo "하지 않습니다."
    fi
    echo -n "  9. 뼈대 위치 : "
    if [ "$skeldir" = "" ]; then
        echo "기본 위치 사용"
    else
        echo "$skeldir"
    fi
    echo -n " 10. 새 그룹   : $mkusergrp 사용자 ID와 같은 이름의 새 그룹을 만"
    if [ "$mkusergrp" = "yes" ]; then
        echo "듭니다."
    else
        echo "들지 않습니다."
    fi
    echo -n " 11. UID       : "
    if [ "$setuid" = "" ]; then
        echo "기본값 사용"
    else
        echo "$setuid"
    fi
    echo -n " 12. 홈 생성   : $mkhome 홈 디렉토리를 생성"
    if [ "$mkhome" = "yes" ]; then
        echo "합니다."
    else
        echo "하지 않습니다."
    fi
    echo -n " 13. 삼바 추가 : $addsmb 삼바 계정에 추가"
    if [ "$addsmb" = "yes" ]; then
        echo "합니다."
    else
        echo "하지 않습니다."
    fi
    echo
    echo " [q] 생성 취소"
}

InputID() {
    input=""
    echo -e -n "    사용자 ID를 입력하십시오. (영문 소문자와 숫자로만 구성)\n    ID : "
    read input
    if [ "$input" = "" ]; then
        echo "! 입력이 되지 않았습니다."
    else
        userid="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputFullName() {
    input=""
    echo -e -n "    사용자의 전체이름을 입력하십시오. (한글 및 2바이트 문자를 삼가해 주십시오)\n    전체 이름 : "
    read input
    if [ "$input" = "" ]; then
        echo "! 입력이 되지 않았습니다."
    else
        fullname="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputPasswd() {
    passwd=""
    input1=""
    input2=""
    attempt=2
    stty -echo
    while [ $attempt -ne 0 ]
    do
        let "attempt -= 1"
        echo -e -n "    암호를 입력하십시오.\n    암호 : "
        read input1
        echo
        echo -e -n "    다시 한번 더 입력하십시오.\n    암호 : "
        read input2
        echo
        if [ "$input1" = "" ] || [ "$input2" = "" ] || [ "$input1" != "$input2" ]; then
            echo -e -n "! 서로 같지 않거나 입력되지 않았습니다."
            if [ $attempt = 1 ]; then
                echo "  다시 입력해 주십시오. (마지막 시도!)"
            elif [ $attempt != 0 ]; then
                echo "  다시 입력해 주십시오. ($attempt번 시도 남음)"
            fi
        else
            password="$input1"
            break
        fi
    done
    stty echo
    if [ "$password" = "" ]; then
        echo "! 암호가 입력되지 않았습니다."
    fi
}

InputInitGrp() {
    input=""
    echo -e -n "    사용자의 주요 그룹 지정 (먼저 해당 그룹이 만들어져 있어야 합니다)\n    초기 그룹 : "
    read input
    if [ "$input" = "" ]; then
        echo "! 입력이 되지 않았습니다."
    else
        initgrp="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputGroups() {
    input=""
    echo -e -n "    사용자의 기타 소속 그룹 지정 (,(콜론)으로 여러개의 그룹을 지정할 수 있습니다)\n    그룹 목록 : "
    read input
    if [ "$input" = "" ]; then
        echo "! 입력이 되지 않았습니다."
    else
        grps="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputHomeDir() {
    input=""
    echo "    사용자의 홈 디렉토리 위치 지정 (엔터 입력시 /home/<초기그룹명>/<사용자id>의 기본 값 사용)"
    echo -n "    현재 위치 = "
    if [ "$homedir" = "" ]; then
        echo "시스템 디폴트"
    else
        echo "$homedir"
    fi
    echo -n "    새로운 위치 : "
    read input
    if [ "$input" = "" ]; then
        homedir=""
        echo "  입력이 되지 않았습니다. 시스템 디폴트 쉘을 사용하게 됩니다."
    else
        homedir="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputShell() {
    input=""
    echo "    사용자의 기본 쉘 지정 (엔터 입력시 디폴트 쉘 사용)"
    echo -n "    현재 쉘 = "
    if [ "$shelltype" = "" ]; then
        echo "시스템 디폴트"
    else
        echo "$shelltype"
    fi
    echo -n "    새로운 쉘 : "
    read input
    if [ "$shelltype" = "" ]; then
        shelltype=""
        echo "  입력이 되지 않았습니다. 시스템 디폴트 쉘를 사용하게 됩니다."
    else
        shelltype="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputSkelCopy() {
    input=""
    echo "    사용자의 기본적인 정보를 구성하기 위해 스켈렉톤 디렉토리를 복사하시겠습니까?"
    echo -n "    y = 예, 복사합니다 / n = 아니오, 복사하지 않습니다 [y/n] : "
    read input
    if [ "$input" = "y" ] || [ "$input" = "Y" ]; then
        echo "예, 복사합니다."
        skelcopy="yes"
    elif [ "$input" = "n" ] || [ "$input" = "N" ]; then
        echo "아니오, 복사하지 않습니다."
        skelcopy="no"
    else
        echo "! 잘못 입력 되었습니다. 입력이 되지 않았습니다."
    fi
}

InputSkelDir() {
    input=""
    echo "    복사될 기본 스켈렉톤 디렉토리 지정"
    echo -n "    현재 위치 = "
    if [ "$skeldir" = "" ]; then
        echo "시스템 디폴트"
    else
        echo "$skeldir"
    fi
    echo -n "    새로운 위치 : "
    read input
    if [ "$input" = "" ]; then
        skeldir=""
        echo "  입력이 되지 않았습니다. 시스템 디폴트 위치를 사용하게 됩니다."
    else
        skeldir="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputMkUserGrp() {
    input=""
    echo "    사용자의 ID와 같은 이름의 새로운 그룹을 자동 생성하시겠습니까?"
    echo -n "    y = 예, 생성합니다 / n = 아니오, 생성하지 않습니다 [y/n] : "
    read input
    if [ "$input" = "y" ] || [ "$input" = "Y" ]; then
        echo "예, 생성합니다."
        mkusergrp="yes"
    elif [ "$input" = "n" ] || [ "$input" = "N" ]; then
        echo "아니오, 생성하지 않습니다."
        mkusergrp="no"
    else
        echo "! 잘못 입력 되었습니다. 입력이 되지 않았습니다."
    fi
}

InputSetUID() {
    input=""
    echo "    사용자의 UID를 직접 지정합니다. (숫자만 사용, 그냥 엔터시 기본값 사용)"
    echo -n "    현재 UID = "
    if [ "$skeldir" = "" ]; then
        echo "시스템 디폴트"
    else
        echo "$setuid"
    fi
    echo -n "    새로운 UID : "
    read input
    if [ "$input" = "" ]; then
        setuid=""
        echo "  입력이 되지 않았습니다. 시스템 디폴트 UID를 사용하게 됩니다."
    else
        setuid="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputMkHome() {
    input=""
    echo "    사용자의 홈 디렉토리를 자동 생성하시겠습니까?"
    echo "    (자동 생성시 홈 디렉토리가 기본 값이 아니라면 가장 하위 단계만 제외하고 미리 생성되어 있어야 합니다)"
    echo -n "    y = 예, 생성합니다 / n = 아니오, 생성하지 않습니다 [y/n] : "
    read input
    if [ "$input" = "y" ] || [ "$input" = "Y" ]; then
        echo "예, 생성합니다."
        mkhome="yes"
    elif [ "$input" = "n" ] || [ "$input" = "N" ]; then
        echo "아니오, 생성하지 않습니다."
        mkhome="no"
    else
        echo "! 잘못 입력 되었습니다. 입력이 되지 않았습니다."
    fi
}

InputAddSMB() {
    input=""
    echo "    사용자의 암호를 삼바암호에도 추가 하시겠습니까?"
    echo "    (입력된 암호와 같은 값으로 smbpasswd에 추가됩니다)"
    echo -n "    y = 예, 추가합니다 / n = 아니오, 추가하지 않습니다 [y/n] : "
    read input
    if [ "$input" = "y" ] || [ "$input" = "Y" ]; then
        echo "예, 추가합니다."
        addsmb="yes"
    elif [ "$input" = "n" ] || [ "$input" = "N" ]; then
        echo "아니오, 추가하지 않습니다."
        addsmb="no"
    else
        echo "! 잘못 입력 되었습니다. 입력이 되지 않았습니다."
    fi
}

AddUser() {
    echo
    InputID
    while [ 0 ]
    do
        menunum=""
        ShowAddUserMenu
        echo
        echo "  내용을 점검하고 수정하십시오. 완료되면 엔터를 누르십시오."
        echo -n "  수정할 항목 번호 : "
        read menunum
        echo
        if [ "$menunum" = "q" ]; then
            break
        elif [ "$menunum" = "" ]; then
            addusercmd="useradd "
            if [ "$userid" = "" ]; then
                echo "! 잘못된 사용자 ID가 사용되었습니다."
                sleep 3
                break
            else
                addusercmd="$addusercmd $userid"
            fi
            if [ "$fullname" != "" ]; then
                addusercmd="$addusercmd -c \"$fullname\""
            fi
            if [ "$initgrp" != "" ]; then
                addusercmd="$addusercmd -g $initgrp"
            fi
            if [ "$grps" != "" ]; then
                addusercmd="$addusercmd -G $grps"
            fi
            if [ "$homedir" != "" ]; then
                addusercmd="$addusercmd -d $homedir -M"
            else
                addusercmd="$addusercmd -d /home/$initgrp/$userid -M"
            fi
            if [ "$shelltype" != "" ]; then
                addusercmd="$addusercmd -s $shelltype"
            fi
            if [ "$skelcopy" = "yes" ]; then
                addusercmd="$addusercmd -m"
                if [ "$skeldir" != "" ]; then
                    addusercmd="$addusercmd -k \"$skeldir\""
                fi
            fi
            if [ "$mkusergrp" = "yes" ]; then
                addusercmd="$addusercmd -n"
            fi
            if [ "$setuid" != "" ]; then
                addusercmd="$addusercmd -u $setuid"
            fi
            echo
            echo "Adding User..."
            `$addusercmd`
#           echo -e "$passwd\n$passwd\n" > /tmp/tmppass
#           passwd $userid --stdin < /tmp/tmppass
            echo "사용자 암호를 두 번 입력해 주십시오."
            passwd $userid
            if [ "$addsmb" = "yes" ]; then
#               echo -n "smbpasswd: "
#               smbpasswd -a $userid -s < /tmp/tmppass
                "삼바 암호를 두 번 입력해 주십시오."
                smbpasswd -a $userid
            fi
#           rm -f /tmp/tmppass
            if [ "$mkhome" = "yes" ]; then
                if [ "$homedir" = "" ] && [ "$initgrp" != "" ]; then
                    mkdir "/home/$initgrp/$userid" > /dev/null
                    chown $userid:$initgrp "/home/$initgrp/$userid" > /dev/null
                    chmod 750 "/home/$initgrp/$userid" > /dev/null
                elif [ "$homedir" != "" ]; then
                    mkdir "$homedir" > /dev/null
                    chown $userid:$initgrp "$homedir" > /dev/null
                    chmod 750 "$homedir" > /dev/null
                fi
            fi
            echo -n "Done! Press [Enter] key."
            read menunum
            break
        fi
        
        case "$menunum" in
            "1" )
                InputID;;
            "2" )
                InputFullName;;
            "3" )
#               InputPasswd;;
                echo "나중에 입력해야 합니다.";;
             "4" )
                InputInitGrp;;
            "5" )
                InputGroups;;
            "6" )
                InputHomeDir;;
            "7" )
                InputShell;;
            "8" )
                InputSkelCopy;;
            "9" )
                InputSkelDir;;
            "10" )
                InputMkUserGrp;;
            "11" )
                InputSetUID;;
            "12" )
                InputMkHome;;
            "13" )
                InputAddSMB;;
        esac
        sleep 1
    done
}


ShowAddGrpMenu() {
    echo "  1. 그룹 이름 : $userid"
    echo -n "  2. GID       : "
    if [ "$setuid" = "" ]; then
        echo "기본값 사용"
    else
        echo "$setuid"
    fi
    echo -n "  3. 홈 위치   : "
    if [ "$homedir" = "" ]; then
        echo "기본 위치 사용"
    else
        echo "$homedir"
    fi
    echo -n "  4. 홈 생성   : $mkhome 홈 디렉토리를 생성"
    if [ "$mkhome" = "yes" ]; then
        echo "합니다."
    else
        echo "하지 않습니다."
    fi
}

InputGrpName() {
    input=""
    echo -e -n "    그룹 이름를 입력하십시오. (영문 소문자와 숫자로만 구성)\n    이름 : "
    read input
    if [ "$input" = "" ]; then
        echo "! 입력이 되지 않았습니다."
    else
        userid="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputSetGID() {
    input=""
    echo "    그룹의 GID를 직접 지정합니다. (숫자만 사용, 그냥 엔터시 기본값 사용)"
    echo -n "    현재 GID = "
    if [ "$skeldir" = "" ]; then
        echo "시스템 디폴트"
    else
        echo "$setuid"
    fi
    echo -n "    새로운 GID : "
    read input
    if [ "$input" = "" ]; then
        setuid=""
        echo "  입력이 되지 않았습니다. 시스템 디폴트 GID를 사용하게 됩니다."
    else
        setuid="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputGrpDir() {
    input=""
    echo "    그룹의 홈 디렉토리 위치 지정 (엔터 입력시 /home/<그룹명>의 기본 값 사용)"
    echo -n "    현재 위치 = "
    if [ "$shelltype" = "" ]; then
        echo "시스템 디폴트"
    else
        echo "$shelltype"
    fi
    echo -n "    새로운 위치 : "
    read input
    if [ "$input" = "" ]; then
        homedir=""
        echo "  입력이 되지 않았습니다. /home/<그룹명>의 기본 값을 사용하게 됩니다."
    else
        homedir="$input"
        echo -n "  입력이 되었습니다."
    fi
}

InputMkGrpHome() {
    input=""
    echo "    그룹의 홈 디렉토리를 자동 생성하시겠습니까?"
    echo "    (자동 생성시 홈 디렉토리가 기본 값이 아니라면 가장 하위 단계만 제외하고 미리 생성되어 있어야 합니다)"
    echo -n "    y = 예, 생성합니다 / n = 아니오, 생성하지 않습니다 [y/n] : "
    read input
    if [ "$input" = "y" ] || [ "$input" = "Y" ]; then
        echo "예, 생성합니다."
        mkhome="yes"
    elif [ "$input" = "n" ] || [ "$input" = "N" ]; then
        echo "아니오, 생성하지 않습니다."
        mkhome="no"
    else
        echo "! 잘못 입력 되었습니다. 입력이 되지 않았습니다."
    fi
}

AddGroup() {
    echo
    userid=""
    setuid=""
    homedir=""
    mkhome="yes"
    InputGrpName
    while [ 0 ]
    do
        menunum=""
        ShowAddGrpMenu
        echo
        echo "  내용을 점검하고 수정하십시오. 완료되면 엔터를 누르십시오."
        echo -n "  수정할 항목 번호 : "
        read menunum
        echo
        if [ "$menunum" = "q" ]; then
            break
        elif [ "$menunum" = "" ]; then
            addusercmd="groupadd "
            if [ "$userid" = "" ]; then
                echo "! 잘못된 사용자 ID가 사용되었습니다."
                sleep 3
                break
            else
                addusercmd="$addusercmd $userid"
            fi
            if [ "$setuid" != "" ]; then
                addusercmd="$addusercmd -g $setuid"
            fi
            echo
            echo "Adding Group..."
            `$addusercmd`
            if [ "$mkhome" = "yes" ]; then
                if [ "$homedir" = "" ]; then
                    mkdir "/home/$initgrp" > /dev/null
                    chown root:$initgrp "/home/$initgrp" > /dev/null
                    chmod 770 "/home/$initgrp" > /dev/null
                else
                    mkdir "$homedir" > /dev/null
                    chown root:$initgrp "$homedir" > /dev/null
                    chmod 770 "$homedir" > /dev/null
                fi
            fi
            echo -n "Done! Press [Enter] key."
            read menunum
            break
        fi
        
        case "$menunum" in
            "1" )
                InputGrpName;;
            "2" )
                InputSetGID;;
            "3" )
                InputGrpDir;;
            "4" )
                InputMkGrpHome;;
        esac
        sleep 1
    done
}

while [ 0 ]
do
    menunum=""
    ShowTitle
    ShowMainMenu
    echo
    echo -n "  작업 번호 입력 : "
    read menunum
    case "$menunum" in
        "1" )
            AddUser
            ;;
        "2" )
            echo
            echo "  삭제할 사용자 ID를 입력하십시오."
            echo
            userid=""
            InputID
            if [ "$userid" != "" ]; then
                echo
                echo "홈 디렉토리는 직접 삭제하셔야 합니다."
                userdel $userid
                smbpasswd -x $userid
                echo -n "Done! Press [Enter] key."
                read menunum
            fi
            ;;
        "3" )
            AddGroup
            ;;
        "4" )
            echo
            echo "  삭제할 그룹 이름을 입력하십시오."
            echo
            userid=""
            InputGrpName
            if [ "$userid" != "" ]; then
                echo
                echo "홈 디렉토리는 직접 삭제하셔야 합니다."
                groupdel $userid
                echo -n "Done! Press [Enter] key."
                read menunum
            fi
            ;;
        "5" )
            ypcat group > /tmp/tmpgrp
            ypcat passwd > /tmp/tmpusr
            exec 6<&0
            exec < /tmp/tmpgrp
            echo "그룹 목록" > /tmp/tmplist
            read input
            while [ "$input" != "" ]
            do
                echo -e "  ${input%%:*}    \t${input##*:}" >> /tmp/tmplist
                read input
            done
            exec < /tmp/tmpusr
            echo -e "\n사용자 목록" >> /tmp/tmplist
            read input
            while [ "$input" != "" ]
            do
                fullname="${input#*:}"; fullname="${fullname#*:}"
                fullname="${fullname#*:}"; fullname="${fullname#*:}"
                fullname="${fullname%:*}"; fullname="${fullname%:*}"
                echo -e "  ${input%%:*}    \t$fullname" >> /tmp/tmplist
                read input
            done
            exec 0<&6
            rm -f /tmp/tmpusr
            rm -f /tmp/tmpgrp
            less /tmp/tmplist
            rm -f /tmp/tmplist
            ;;
        [qQ] )
            echo
            echo "NIS 사용자 DB 갱신중..."
            pushd . > /dev/null
            cd /var/yp
            make
            popd > /dev/null
            echo
            echo "  본 호스트를 제외한 NIS가 설치된 슬래이브 서버에서 다음과 같이 목록을 갱신하십시오."
            echo "    # cd /var/yp"
            echo "    # make"
            echo
            echo "  메일 서버가 설치된 곳에서는 메일링 그룹 목록을 갱신하는 것도 중요합니다."
            echo "    # mkgrpmail"
            echo
            echo "  종료합니다."
            echo
            break;;
    esac
done
================================================================


================================================================
-- mkgrpmail 소스 ----------------------------------------------
================================================================
#!/bin/bash

ypcat group > /tmp/tmpgrp

if [ $# -gt 0 ]; then
    let "i = 0"
    for grp in $*
    do
        exec < /tmp/tmpgrp
        read input
        while [ "$input" != "" ]
        do
            if [ "${input%%:*}" == "$grp" ]; then
                echo -n "" > "/etc/mail/group/$grp.list"
                comma=0
                input="${input##*:}"
                if [ "$input" != "" ]; then
                    if [ $comma -eq 1 ]; then
                        echo -n "," >> "/etc/mail/group/$grp.list"
                    fi
                    echo -n $input >> "/etc/mail/group/$grp.list"
                    comma=1
                fi
            fi
            read input
        done
    done
else
    exec < /tmp/tmpgrp
    read input
    while [ "$input" != "" ]
    do
        grp="${input%%:*}"
        echo -n "" > "/etc/mail/group/$grp.list"
        comma=0
        input="${input##*:}"
        if [ "$input" != "" ]; then
            if [ $comma -eq 1 ]; then
                echo -n "," >> "/etc/mail/group/$grp.list"
            fi
            echo -n $input >> "/etc/mail/group/$grp.list"
            comma=1
        fi
        read input
    done
fi

rm -f /tmp/tmpgrp
echo
================================================================
출처 : http://web.world.kr/

728x90

댓글