제 4 회 리눅스 공동체 세미나 B-6 세션

삼바,NFS,NIS,FTP 서버의 설정과 활용

차례

1. FTP 설치와 관리

2. 분산 환경을 위한 솔루션 - NIS 와 NFS

3. 윈도우즈와의 인티그레이션을 시도한다. - SAMBA

1. FTP 설치와 관리

리눅스에서 FTP를 설치하는 것은 그리 어려운 일이 아니다. RPM으로 리눅스에 제공이 되고, 설치시 다른 패키지들과 함께 설치할 수 있기 때문이다. 그러나, FTP에 대한 관리에 대해 얼마나 잘 알고 보안이 잘 이루어지고 있는 지에 대해서는 회의적이다. 그러므로, 여기에서는 FTP의 설치에 대한 설명과 관리에 대한 설명을 하기로 한다.

1-1. FTP 프로토콜

FTP 프로토콜에 대한 설명은 FTP 이용과 프로그램 개발에도 도움을 줄 것이다. 그래서, 설치와 관리법을 설명하기 전에 프로토콜에 대한 설명을 한다. FTP 프로토콜과 다음에 나오는 NFS의 파일 전송 방법과의 차이를 생각해 보기 바란다.

FTP는 한 컴퓨터에서 다른 컴퓨터로 파일을 전송하는 데 사용하는 것이다. 이것에 관한 가장 기본적인 문서는 RFC 959 "File Transfer Protocol(FTP)" 이다. 이것은 문자셋을 변환하는 기능도 수행하는데, 예를 들어 메인프레임에서는 텍스트가 EBCDIC 형식으로 저장되지만 PC에서는 ASCII로 저장된다. (NFS가 파일에 직접 접급할 수 있음에 비해 이것은 그렇게 할 수는 없다.) 이 FTP 또한 클라이언트/서버 구조를 가지고 있으며, 인티그레이션의 가장 기본적인 방법이 된다. 따라서, 이것을 위해서는 클라이언트와 서버를 위한 각각의 프로그램이 필요하다.

① FTP 연결

FTP도 또한 TCP를 사용하므로, OSI 레이어에 의존한다. 그리고, 연결 과정에서 소켓이라는 것을 통하여 연결을 관리하게 된다.

FTP 연결은 클라이언트의 FTP 프로그램에서 시작된다. 클라이언트에서 연결 요청을 보내면 요청을 기다리던 FTP 서버는 이에 응답하고 연결이 된다. 이러한 FTP의 연결 방식은 SMTP와 비슷하지만, 몇가지 면에서 다른 점이 있다. 특히, FTP는 다른 것들과 다르게 두 개의 연결을 유기적으로 취하는데, 하나가 데이터 연결이고, 하나는 제어 연결이다. 전자는 데이터 전송을 위해 사용되고, 후자는 연결을 제어하기 위해 사용된다.

A. 능동적 열기

a. 클라이언트는 FTP 서버의 제어 연결(21번 포트)에 연결한다.

b. 제어 채널이 열리면 클라이언트는 USER와 PASS 명령을 이용하여 사용자를 인증한다. 즉, 서버에 로그온하는 것이다.

c. 클라이언트가 파일을 업로드, 다운로드하거나 티렉토리 내용을 보려면, 우선 클라이언트는 데이터 연결에 사용할 소켓을 새로 생성한다. 이 때의 포토 번호는 운영체제로부터 임의로 할당받는다.

d. 클라이언트는 제어 채널을 통해 서버에 PORT 명령어를 보낸다. PORT 명령어는 여섯 개의 인자를 사용하는데, 이 인자들은 IP 주소와 포트 번호를 뜻하는 것이다. 네 번째 까지가 IP 주소이며 그 다음 두 개는 16비트 포트 번호의 상위, 하위 바이트이다.

e. 서버가 포트 번호를 받으면 서버는 포트 번호를 이용하여 데이터 연결을 설정한다.

f. 데이터 전송이 끝나면 데이터 연결을 종료되며, 또 다른 데이터 전송이 필요하면 다시 데이터 연결을 설정한다.

g. 제어 연결은 전체 FTP 세션 동안 계속 열려 있다. 클라이언트나 서버 둘 중의 하나가 FTP 세션을 종료하면제어 연결도 종료된다.

예] HLUG 서버에 접속하는 과정이며, 사용한 프로그램은 WS_FTP이다.

connecting to 166.104.90.152 ...

Connected to 166.104.90.152 port 21

220 ProFTPD 1.2.0pre3 Server (Welcome to Hanyang Linux User Group) [hlug.hanyang.ac.kr]

USER freekgb

331 Password required for freekgb.

PASS (hidden)

230 User freekgb logged in.

SYST

215 UNIX Type: L8

Host type (S): UNIX (standard)

PWD

257 "/home/freekgb" is current directory.

PORT 166,104,92,25,4,230

200 PORT command successful.

LIST

150 Opening ASCII mode data connection for file list.

Received 1046 bytes in 0.1 secs, (100.00 Kbps), transfer succeeded

226 Transfer complete.

B. 수동적 연결

a. 클라이언트는 FTP 서버의 제어 연결(21번 포트)에 연결한다.

b. 제어 채널이 열리면 클라이언트는 USER와 PASS 명령을 이용하여 사용자를 인증한다. 즉, 서버에 로그온하는 것이다.

c. 클라이언트가 파일을 업로드, 다운로드하거나 티렉토리 내용을 보려면, 서버에 PASV 명령을 보내야 한다. PASV 명령어에는 인자가 필요 없다.

d. PASV 명령을 받은 서버는 데이터 연결에 사용할 소켓을 생성하고 연결을 기다린다. PASV 명령에 대한 서버의 응답에는 연결을 기다리는 포트의 번호가 들어간다. 응답의 문법은 PORT 명령어와 비슷한 형식이다. 4개의 숫자가 IP 주소이며, 2개의 숫자가 포트 번호이다.

e. 클라이언트가 PASV 명령어에 대한 응답을 받으면, 서버에 데이터 연결 포트에 연결한다.

f. 데이터 전송이 끝나면 데이터 연결을 종료되며, 또 다른 데이터 전송이 필요하면 다시 데이터 연결을 설정한다.

g. 제어 연결은 전체 FTP 세션 동안 계속 열려 있다. 클라이언트나 서버 둘 중의 하나가 FTP 세션을 종료하면 제어 연결도 종료된다.

예)

connecting to 166.104.90.152 ...

Connected to 166.104.90.152 port 21

220 ProFTPD 1.2.0pre3 Server (Welcome to Hanyang Linux User Group) [hlug.hanyang.ac.kr]

USER freekgb

331 Password required for freekgb.

PASS (hidden)

230 User freekgb logged in.

Host type (I): UNIX (standard)

PWD

257 "/home/freekgb" is current directory.

PASV

227 Entering Passive Mode (166,104,90,152,10,118)

connecting to 166.104.90.152:2678

- -

connecting to 166.104.90.152 ...

Connected to 166.104.90.152 port 2678

LIST

150 Opening ASCII mode data connection for file list

Received 1046 bytes in 0.1 secs, (100.00 Kbps), transfer succeeded

226 Transfer complete.

C. Telnet에서 FTP 서버와의 제어 연결과 데이터 전송의 실제 모습

# telnet hlug.hanyang.ac.kr ftp

Trying 166.104.90.152...

Connected to hlug.hanyang.ac.kr.

Escape character is '^]'.

220 ProFTPD 1.2.0pre3 Server (Welcome to Hanyang Linux User Group) [hlug.hanyan]

usr freekgb

500 USR not understood.

user freekgb

331 Password required for freekgb.

pass hymailtest

230 User freekgb logged in.

pwd

257 "/home/freekgb" is current directory.

pasv

227 Entering Passive Mode (166,104,90,152,10,174)

다른 창에서 연결한다(포트번호는 10*256+174)

# telnet 166.104.90.152 2734

Trying 166.104.90.152...

Connected to 166.104.90.152.

Escape character is '^]'.

제어 연결창으로 열어둔 창에서

list

150 Opening ASCII mode data connection for file list

226 Transfer complete.

명령을 하면 데이터 연결창에서 다음과 같이 보인다.

drwx------   2 freekgb  hlug         4096 Nov  5 17:20 Mail

-rw-r--r--   1 freekgb  hlug          596 Feb 29 03:48 Ret

-rw-r--r--   1 freekgb  hlug        34132 Feb 15 13:51 faq1.hwp

-rw-r--r--   1 freekgb  hlug        28951 Jan 28 15:53 httpd.htm

-rw-r--r--   1 freekgb  hlug         1814 Jan 20 12:08 lilosojung.txt

연결할 때마다 제어 연결창에서 pasv 명령을 내려주고 다시 다른 창에서 접속한다.

1-2. FTP 서버의 설치

다운로드 : http://proftpd.oops.org/download.php3?item=official

소스 : proftpd-core-1.2.0pre10-1.i386.rpm,

proftpd-standalone-1.2.0pre10-1.i386.rpm(standalone 용)

proftpd-inetd-1.2.0pre10-1.i386.rpm(inetd용)

1) standalone 으로 설치하기

소스가 있는 ftp 서버에서 최신의 Proftp 의 데몬을 다운로드 받아서 다음과 같이 설치한다.

proftpd-core-1.2.0pre10-1.i386.rpm 와 proftpd-standalone-1.2.0pre10-1.i386.rpm를 다운받고 다음과 같이 설치를 한다.

rpm -Uvh proftpd*rpm

2) inetd 으로 설치하기

proftpd-core-1.2.0pre10-1.i386.rpm 와 proftpd-inetd-1.2.0pre10-1.i386.rpm를 다운받아 설치한다.

3) 소스파일일 때

소스파일일 때는 다음과 같이 설치한다.

① proftpd를 인스톨하기 위하여 user와 group을 결정해야 한다. 기본적으로 user는 root, group은 root로 되어 있다. 만약 간단하게 이 defaults를 사용하려면 프로그램의 top level directory로 부터 아래와 같은 명령을 실행한다.

$ ./configure

[옵션]

BSDI에서와 같이 다른 user와 group으로 install을 하기를 원한다면 install_user와 install_group이라는 환경변수로서 셋팅을 해 줄 필요가 있다. sh/ksh/bash를 사용한다면, BSDI system에서는 아래와 같이 무언가를 해 줘야 한다.

$ install_user=root install_group=wheel ./configure

기본적으로 gnu configure script는 모든 binary들을 /usr/local/bin 과 /usr/local/sbin 에 install을 한다. configure script의 command line에 "--prefix" 인자를 사용하면 이것을 바꿀수 있다. 예를 들어 /usr/sbin에 proftpd를 install하고 /usr/bin에 binary를 위치시키기 위해서는 아래와 같이 해 준다.

$ ./configure --prefix=/usr

"configure --help" 명령으로 실행할수 있는 모든 인자들의 목록을 얻을 수 있다.

$ ./configure --help

ProFTPD는 "--with-modules=LIST"인자로 module들을 추가할수 있다. 이 option들은 contrib directory에 있는 추가적인 module들만 해당한다. "--with-modules" 인자에 의해서 모든 것이 영향을 받지는 않는다.

② configure를 실행한 후에, configure script의 출력을 볼 수 있을 것이다. configure가 해당 platform을 scan한 것 중 잘못된 것을 찾기 위하여 config.h 파일을 scan하는 것이 좋다. 모든 것이 제대로 되었다면, 다음 단계를 계속한다.

③ 프로그램의 최상위 디랙토리에서 "make"를 실행한다. (BSDI와 같이)오래된 make utility를 사용하는 system에서는 대신에 GNU make (보통 gmake라 한다)를 사용할 필요가 있다. compile 진행의 출력을 보고 에러가 발생하지 않는지를 확인하라. 어떤 platfrom(특히 AIX와 IRIX)들에서 어떤 편집 또는 link 경고를 볼 수도 있다. 이것들은 일반적으로 무시하면 된다. make가 proftpd binary와, 관련된 utility들을 완벽하게 생성한 후, 4단계로 계속한다.

④ 프로그램의 최상위 디랙토리에서 "make install"을 실행한다. 이것은 /usr/local/sbin에 proftpd를 그리고 /usr/bin에 util들을 설치할 것이다. 마찬가지로 sample-configurations 디랙토리에서 볼 수 있는 "basic.conf" 파일을 /usr/local/etc/proftpd.conf로 복사할 것이다.

⑤ /usr/local/etc/proftpd.conf 를 수정한다. User/Group이 시스템에 실제로 존재하는 지 확인을 한다. 그렇지 않으면 proftpd는 작동하지 않는다.

⑥ proftpd를 실행할 때 inetd/xinetd 으로 할 지 standalone 으로 할 지 결정을 한다. 결정을 했으면 /etc/proftpd.conf의 ServerType 지시자를 결정한 것에 맞게 변경한다. (ServerType inetd 또는 ServerType standalone 중에 하나로 하면 된다) standalone으로 지정했다면 step 7은 건너뛰도록 한다.

⑦ inetd로 proftpd를 실행하기 위해서는 /etc/inetd.conf를 편집해 줘야 하며 바뀐 설정을 재적용하기 위하여 inetd를 재실행해야 한다. /etc/inetd.conf에서 아래와 같은 라인을 볼 수 있을 것이다.

ftp stream tcp nowait root   /usr/sbin/in.ftpd in.ftpd -l -a -u022

위의 라인을 아래와 같이 변경해 준다 :

ftp stream tcp nowait root   /usr/sbin/proftpd proftpd

ProFTPD는 또한 tcp_wrapper와 같이 사용할 수 있다 :

ftp stream tcp nowait root   /usr/sbin/tcpd    proftpd

⑧ standalone mode로 실행을 한다면 부팅시 proftpd를 실행하기 위해 boot script를 편집해 줘야 한다. shell로 부터 이것을 실행함으로서 즉시 간단하게 시작할 수 있다. (이것은 root로서 실행되도록 할 필요가 있다.)

⑨ system에서 ftp가 제대로 작동되는지와 모든 작업이 제대로 되는지를 확인하라. 실행에 문제가 있다면 syslog*를 체크하도록 한다.

⑩ MaxClients, MaxClientPerHost와 ftpwho/ftpcount 설정을 하기 위해서, proftpd의 scoreboard file을 위한 scoreboard path를 지정할 필요가 있다. scoreboard file의 path는 기본적으로 "/usr/local/var/proftpd"로 설정되어 있다.

proftpd.conf에서 다른 directory를 지정하기 위해 ScoreboardPath 지시자를 사용할 수 있다. 또는 이것이 존재하지 않는다면 mkdir로 /usr/local/var/proftpd를 할 수도 있다.

ALL user들이 ftpwho와 ftpcount를 실행하는 것을 원하지 않는 한, directory에 특별히 permission을 변경할 필요는 없다.

⑪ anonymous ftp를 추가하기를 원하거나 좀더 정교한 ftp 설정을 하기를 원한다면 http://www.proftpd.org/reference.html 에 있는 guide를 참조하기 바란다. 새로운 ftp 설정을 test하기 위해서 command line에서 proftpd -c <now_config_file>을 실행할 수 있다. 그리고 새로운 설정 file이 문법 오류를 발생한다면 오류 메세지를 볼 수 있을 것이다. inetd mode로 실행을 하고 설정이 오류가 없다면 안전하게 무시할 수 있는 "Fatal: Socket operation on non-socket" 를 보게 될 것이다. (이것은 inetd가 demon을 띄울 때 나타나지는 않는다.)

1-3. proftpd.conf 수정

RPM의 경우에는 미리 설정이 되어 나오기 때문에 확인만 하면 된다. 그러나, 소스 파일을 컴파일한 경우에는 다음을 참고하여 설정하기 바란다.

1) 일반적인 사항들

다음은 proftpd.conf 파일 예제이다. 이것을 보면 일반적인 사항에 대한 것을 알 수가 있다.

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

# vi proftpd.conf

ServerName                      "Oops Proftpd FTP Server"

# ServerType은 Server를 standalone mode로 할것인지 inet mode로 할 것

# 인지를 정한다. default로 inetd mode로 한다. standalone mode로 할 경우

# 아래 MaxInstances 지시자의 주석을 해제한다.

# inetd mode로 작동을 할 경우에는 /etc/inetd.conf 중에서

# ftp    stream  tcp     nowait  root    /usr/sbin/tcpd  in.ftpd -l -a

# 행을 아래와 같이

# ftp    stream  tcp     nowait  root    /usr/sbin/tcpd  in.ftpd

# 수정을 해 주고 Inet demon을 재실행 해 줘야 한다.

# ServerType	standalone

ServerType                      inetd

DefaultServer                   on

# ServerType이 standalone이면 이 항목의 주석을 풀어 줘야 한다.

# inetd로 작동을 시킬시에는 /etc/services에서 port를 지정한다.

#Port                            21

# root login을 허락할지의 여부를 지정한다. PAM modules를 사용한다.

# 먼저 /etc/proftpd/conf/ftpusers에서 root를 삭제해야 한다.

# RootLogin                     on

# Global section은 proftpd의 전체적인 설정에 모두 적용시킨다.

<Global>

# group과 world writable로 부터 새로운 dir과 file들을 생성하는 것을

# 막기 위하여 기본적으로 umask는 022로 설정을 한다.

Umask                           022

# ftpusers file을 이용하여 PAM인증을 하기를 원하면 이 지시자의

# 값을 on으로 한다. default 값은 off 이다.

AuthPAMAuthoritative	off

</Global>

# 회선의 Bandwidth를 특정 속도로 제한을 한다. 단위는 bps이다.

#RateReadBPS                     256

#RateReadFreeBytes               5120

#RateReadHardBPS                 on

# 접속 대기 시간을 설정한다. user 가 접속 후 아무 작동도 안할 때 일정 시간 후에

# 접속이 종료되게 한다

TimeoutIdle                     300

# DeferWelcome 는 client가 인증을 하기 전에 servername을 display하는

# 것을 방지한다.

DeferWelcome                  off

# 'welcome.msg는 login시에 보여지고, 'message'는 각 하위 디렉토리에 접속

# 했을 때 보여지게 된다.

DisplayLogin                /etc/proftpd/conf/welcome.msg

DisplayFirstChdir           .message

# DoS 공격을 막기 위해, 자식 process의 maximun number를 30으로 설정한다.

# 만약 30이상의 접속을 허락할 필요가 있다면 간단하게 이 치수를 증가시키도록

# 한다. 이것은 오직 standalone mode에서만 가능하다. inetd mode에서는

# service 당 maximun number를 제한하는 것을 허락하는 inetd server에서

# 설정을 해야 한다.(xintd 역시 마찬가지이다)

# MaxInstances                    30

User                            nobody

Group                           nobody

# 일반적으로 file들을 overwrite를 가능하게 한다.

<Directory /*>

AllowOverwrite                on

</Directory>

# ls 명령어의 -a option으로 hidden file을 볼 수 있게 한다.

# LsDefaultOptions              "-a"

<Anonymous ~ftp>

User                        ftp

Group                       ftp

# Anonymous user가 ftp로 접근하여 shell의 권한을 얻는 것을

# 방지한다.

RequireValidShell           off

# Anonymous 접근을 할 때 특정 password를 지정할 수 있다.

# 단 위의 User 지시자의 name이 passwd file에 등록이 되어져

# 있어야 한다. 이 지시자가 on일 경우 이메일 주소로 login을

# 할 수 없다.

# AnonRequirePassword          on

# ShowSymlinks                 off

# User name "ftp"로 anonymous login을 할수 있도록 한다

UserAlias                   anonymous ftp

<Limit LOGIN>

AllowAll

</Limit>

DisplayLogin                welcome.msg

DisplayFirstChdir           .message

# 최대 접속 인원수를 지정한다.

MaxClients                  10

# 하나의 호스트로부터 동시에 접근할 수 있는 수를 지정한다.

# 아래의 기본 설정으로는 하나의 호스트에서 한번의 접근만 허용한다.

MaxClientsPerHost             3 "Sorry, one connection allow per one host"

# 소유권이 root인 file이나 directory들을 보여주지 않는다

HideUser                    root

# 그룹권한이 root인 file이나 directory들을 보여주지 않는다

HideGroup                   root

# upload/download 비율을 지원한다.

# /usr/doc/proftpd-1.2pre7/mod_ratio.c를 참조하라

#

# Ratios on

# HostRatio foobar.net 100 10 5 100000

# 서버를 시간대로 운영하는 것을 지정한다.

# 아래의 예는 오후 3시 부터 오후 6시까지만

# 서버의 접속을 가능하게 한다.

#

# UpTime 15

# DownTime 18

<Limit WRITE>

DenyAll

</Limit>

# Upload directory, allow upload and mkdir, deny download.

# Upload directory 설정이다. upload와 mkdir은 허락하며,

# download는 거절한다

#

# <Directory incoming>

#   <Limit READ>

#     DenyALL

#   </Limit>

#   <Limit STOR MKD>

#     AllowALL

#   </Limit>

# </Directory>

# 사용자가 접근하기를 원하지 않는 private directory

#  <Directory logs>

#    <Limit READ WRITE DIRS>

#      DenyAll

#    </Limit>

#  </Directory>

</Anonymous>

2] 가상 서버의 FTP

가상 서버를 만들기 위한 설정의 예제이다.

# 이 예제 설정 file은 두개의 가상 server와  anonymous login를 결합하는

# 것을 설명하고 있다.

ServerName                      "ProFTPD"

ServerType                      inetd

# Port 21 은 FTP 의 기본 port이다.

Port                            21

# Global은 main server와 모든 virtualhosts에 의해 공유되는 "global" 설정

# 을 생성한다.

<Global>

# Umask 022는 group과 world writable로 부터 새로운 dir과 file들을 막기

# 위한 훌륭한 기본 umask이다.

Umask                         022

</Global>

# Server가 실행하는데 일반적인 user와 group을 설정한다.

User                            nobody

Group                           nogroup

# DoS 공격을 막기 위해, 자식 process의 maximun number를 30으로 설정한다.

# 만약 30이상의 접속을 허락할 필요가 있다면 간단하게 이 치수를 증가시키도록

# 한다. 이것은 오직 standalone mode에서만 가능하다. inetd mode에서는

# service 당 maximun number를 제한하는 것을 허락하는 inetd server에서

# 설정을 해야 한다.(xintd 역시 마찬가지이다)

MaxInstances                    30

# 접속에 stall이 될 때 끊어지지 않는 최대 시간을 지정한다.

TimeoutIdle                     300

<VirtualHost ftp.virtual.com>

ServerName                    "Virtual.com's FTP Server"

MaxClients                    10

MaxLoginAttempts              1

# DeferWelcome 는 client가 인증을 하기 전에 servername을 display하는

# 것을 방지한다.

DeferWelcome                  on

# guest login만 허락하기를 위하여

# nomal user login을 제한한다.

<Limit LOGIN>

DenyAll

</Limit>

# 다음, 자신들의 web site 등에 개인적으로 접근하기 위한 customer에

# 의해 사용되어 지는 "guest" 계정을 만든다.

<Anonymous ~cust1>

User                        cust1

Group                       cust1

AnonRequirePassword         on

<Limit LOGIN>

AllowAll

</Limit>

HideUser                    root

HideGroup                   root

# 사용자가 접근하기를 원하지 않는 private directory

<Directory logs>

<Limit READ WRITE DIRS>

DenyAll

</Limit>

</Directory>

</Anonymous>

</VirtualHost>

# primary address에서 작동을 하지만 port는 4000번을 사용하는 또 다른

# virtual host 이다. access는 하나의 anonymous login만 된다.

<VirtualHost our.ip.address>

ServerName                    "Our private FTP server"

Port                          4000

Umask                         027

<Limit LOGIN>

DenyAll

</Limit>

<Anonymous /usr/local/ftp/virtual/a_customer>

User                        ftp

Group                       ftp

UserAlias                   anonymous ftp

<Limit LOGIN>

AllowAll

</Limit>

<Limit WRITE>

DenyAll

</Limit>

<Directory incoming>

<Limit WRITE>

AllowAll

</Limit>

</Directory>

</Anonymous>

</VirtualHost>

1-4. ftp 서버 관리하기

ftp도 보안을 위해서는 일정한 모니터링이 필요하고, 그것의 가장 단순하고 유용한 작업은 로그 파일을 읽는 것과 현재의 접속 상태를 점검해 보는 것이다. 그러므로, ftp 서버를 관리하기 위한 명령어 등을 알아보기로 한다.

[proftp 의 중요 파일들]

/usr/sbin/proftpd

/usr/bin/ftpwho

/usr/bin/ftpcount

/usr/sbin/ftpshut

/var/log/xferlog

/var/run/proftpd-[pid]

/var/run/proftpd-inetd

1) proftp 설정을 위한 명령 proftpd

① 사용법

proftpd [ -hlnv ] [ -d debuglevel ] [ -c config-file  ]  [ -p 0|1 ]

② 설명

proftpd는  전문적인  File Transfer Protocol (FTP) server daemon이다.    server는  FTP service가 이루어지기 위해 접속될 때마다 또는 stand-alone daemon으로서 실행되는 것을 대체될 때, Internet "super-server" inetd에 의하여 시작된다. proftp가 standalone mode로 작동할 때, 그리고 SIGHUP를 받을 때 proftp는 config file을 다시 읽을 것이다.

③ 옵션

-h,--help  간단한 사용설명을 보여주며, 가능한 모든 option들을 포함하고 있다.

-n,--nodaemon

standalone mode로 proftpd process를 실행한다.(configuration                          file에서 처럼 설정되어 있어야 한다) but does not background                          the process or disassociate it from the controlling tty. 게다가                        모든 output (log 또는 debug  메세지들)은 syslog maechanism 보다                     오히려 stout으로 보내지게 된다. debugging을 위해서는 -d option 을                     가장 자주 사용하게 된다.

-v,--version

stdout으로 ProFTPD의 version number를 출력한다.

-d,--debug debuglevel

proftpd의 내부 debug lovel을 설정한다.(일반적으로 0이다)                              debuglevel은 0에서 5 사이의 정수값을 가지며, debug stdout 보다 더                     높은 숫자로서 가지게 된다. 일반적으로 debug message들은 DEBUG                     facility를 이용하여 syslog로  보내지게 된다. 하지만 -n option 을                       이용하면 모든 output들은 stdout으로 보내지게 된다.

-c,--config config-file

시작시에 /etc/proftpd.conf 에서 발견되는 기본 설정 file을 무시하고                     다른 config-file로 지정할 수 있다.

-p,--persistent 0|1

default persistent password를 지원한다. Dis-ables는 0, enable은 1                     이며 각 platform을 통해 설정 시간을 결정한다. 이 option은 오직                        default support에만 영향을 미치며, 실행시에 Persis-tentPasswd                        지시자에 의해서 무시되어 질 수 있다.

-l,--list   proftpd에 compile되어진 module들의 list를 보여 준다.

2) 유저 정보 보기

① 유저 프로세스 정보 보기 - ftpwho

이 명령을 내리면 ftp 유저들의 현재 process 정보를 보여준다. 그래서, 모든 proftpd에 연결되어 있는 process의 정보를 보여주며, 각 server 의 접속되어 있는 수를 보여준다. inetd로 부터 생성된 proftpd session들은 standalone server에 의해 생성된 것들과는 구분하여 count된다.

[옵션 설명]

-h,--help   모든 사용가능한 옵션들의 간단한 사용 설명을 보여준다.

-p,--path scoreboard-path

proftpd.conf 에서 ScoreboardPath 지시자를 통해 설정하는 proftpd의                     동적 scoreboard file의 full path를 지정한다. 만약 proftpd의 기본                       directory가 이 지시자에 의해서 변경되었다면, ftpwho를 다시                            compile을 하여야 하거나 이 option을 사용하여 proftpd scoreboard                      file을 지정해야만 한다.

-v,--verbose

remote host와 현재 작업 directory와 같이 각 connection에 대한                        추가적인 정보를 보고한다.

② 서버에 접속한 유저 숫자 보기 - ftpcount

이것은 각 proftpd server 설정에 접속되어 있는 user의 숫자를 보여준다. 이것은 proftpd.conf file에 정의되어 있는 각 server와 virtualhost/anonymous 설정에 접속해  있는 현재 숫자를 보여 준다. inetd에 의해 생성된 접속은 proftpd standalone server에  의해 생성된 것들로 부터 구분되어 count되어 진다.

[옵션 설명]

-h,--help   모든 사용가능한 옵션들의 간단한 사용 설명을 보여준다.

-p,--path scoreboard-path

proftpd.conf 에서 ScoreboardPath 지시자를 통해 설정하는 proftpd의                    동적 scoreboard file의 full path를 지정한다. 만약 proftpd의 기본                       directory가 이 지시자에 의해서 변경되었다면, ftpcount를 다시                          compile을 하여야 하거나 이 option을 사용하여 proftpd scoreboard                      file을 지정해야만 한다.

3) 지정한 시간에 서버를 끄자. - ftpshut

① 사용법

ftpshut [ -l min ] [ -d min ] time [ warning-message ]

② 설명

지정한 시간에 모든 proftd server들을 shutdown 한다. 이 명령은 자동으로 shtudown 진행을 준비하고, 자동으로 현재 proftpd connection을 끊을 수 있으며, 새로운 연결을 거부하도록 할 수 있다. 명령은 suhtdown이 임박함을 proftpd process에 알리기 위하여 /etc/shutmsg와 같은  control file을 이용하여 사용할 수 있다.

③ 옵션

time      time은 ftp server를 down시킬 시간을 말한다. now'라는 단어는 즉시                    shutdown을 지시하며 +number 또는  HHMM. 이라는 두 개의 형식 중                   하나는 미래의 시간에 shut down을 지시한다. 첫번째 형식은 number 분                   후에 server를 down 하며  두번째 지시자는 하루 중 정확한 시간을                      지시하며 24시간 clock 형식을 사용한다. (예 오후3시 30분 : 1530 )

-l min    shutdown 전에 새로운 ftp access를 거부하는 것을 분단위의 숫자로                     지정한다. 만약 -l 옵션을 지정하지 않으면, 기본으로 10분이 적용된다.                    (만약 shutdown  까지 10분이 채 남지 않는다면 즉시 적용된다.)

-d min   shutdown 전에 현재 ftp connection들을 종료하는 것을 분 단위의                        숫자로 지정한다. -d 옵션을 지정하지 않으면 기본으로 5분이 적용된다.                   shutdown이 5분 이내로 남았다면 즉시 접속이 종료된다.

warning-message(경고 메세지)

새로운 접속을 거부하거나 현재 연결되어 있는 session을 종료시킬 때                    부가적으로 메세지를 준비할 수 있다. 메시지는 아래와 같은 변수를                       이용해서 작성할 수 있다.

%s  proftpd가 종료하는 시간

%r  새로운 접속이 거부되기 시작하는 시간

%d  현재 접속이 종료되는 시간

%C  현재 작업중인 directory (where applicable)

%L  local host name (of virtualhost name)

%R  remote host name

%T  local time (형식 : Thu Nov 15 17:12:42 1990)

%U  login time 시에 주어진 username

④ 주의할 점

a. Proftpd server는 master demon이 standalone mode로 동작시에는  ftpshut을  통해서만 shutdown을 할 수가 있다. Server가 inetd mode로 샐행이 된다면 ftpshut에 의해 생성된 shutdown message file을 사용할 수 있다. 하지만 현재 동작중인 server는  chroot되어 질 것이며, shutdown message control file을 읽지 못한다.

b. 현재 시간보다 이전의 시간을 절대적 shutdown 시간으로 지정할 수도 있는데, 이  경우에는 다음날 지정한 시간이 되어야지 shutdown이 된다.

4) 보안을 위해 로그 파일을 읽는다. - XFERLOG(FTP server logfile)

① 설명

xferlog file은 FTP server daemon ( ftpd(8) ) 의 logging 정보를 포함한다. 이 file은 보통 /usr/adm 에서 볼 수 있으나, ftpd(8) 의 options을 사용함에 따라 어디든지 위치되어 질 수 있다. Each server entry is composed of a single line of the following form, with all fields being separated by spaces. 각 server 항목은 아래의 form으로 이루어진 한 줄로 구성되어 지며, 모든 field는 space로 구분되어 진다.

② 로그 설명

current-time transfer-time remote-host file-size filename transfer-type special-action-flag direction access-mode username service-name authentication-method authenticated-user-id completion-status

current-time

"DDD MMM dd hh:mm:ss YYYY" 형식의 현재 local 시간이다. DDD는 주중의 요일을, MMM은 월을, dd는 날짜를, hh는 시를, mm은 분을, ss는 초를, 그리고 YYYY는 년도를 나타낸다.

transfer-time

전송을 위한 총 시간을 말하며 초단위로 표시한다.

remote-host

원격 host 이름이다.

file-size

byte단위의 전송된 file의 크기이다.

filename

전송된 file의 이름이다.

transfer-type

전송의 형태를 나타내는 하나의 character이다.

a 는 ascii 전송을 뜻한다.

b 는 binary 전송을 뜻한다.

special-action-flag

어떤 특정한 action이 발생하는 것을 나타내는 하나 또는 그 이상의 character flag 이다. 아래에 나열된 것 중의 하나 또는 그 이상으로 사용할수 있다.

C file은 압축되어져 있다.

U file은 압축이 되어져 있지 않다.

T file이 tar로 묶여져 있다.

_ 아무런action이 발생하지 않았다.

direction

전송의 지시이다.

o outgoing

i incoming

access-mode

user가 어떻게 login을 하는가에 대한 방법이다.

a (anonymous) 는 익명 손님 user들을 위한 것이다.

g (guest) is for an passworded guest user (see the (guest) 는 password를 소유한 손님 user들을 위한 것이다. ( ftpaccess(5) 의 guestgroup 명령을 참조하라)

r (real) 은 인증이 가능한 local user를 위한 것이다.

username

local username 이다. 만약 손님 이라면, 주어진 ID 문자열을 뜻한다.

service-name

발생되어지는 service의 이름이며 보통은 FTP이다.

authentication-method

인증에 사용되어 지는 방법이다. 아래중의 하나를 사용한다.

0 none

1 RFC931 Authentication

authenticated-user-id

인증 방법에 의해 되돌려지는 user id 이다. 인증되어진 user id가 사용불가 하다면 * 이 사용되어 진다.

completion-status

전송 상태를 나타내는 하나의 character이다.

c 완전한 전송

i 불완전한 전송

[실제 로그 파일 예제]

Sun Nov 14 00:27:54 1999 0 166.104.37.130 3495 /usr/local/apache/htdocs/h3.htm a

_ i r webmaster ftp 0 *

Mon Nov 15 20:42:19 1999 0 166.104.53.121 304242 /home/xenus/photo-1.tif b _ i r

xenus ftp 0 *

Mon Nov 15 20:42:25 1999 0 166.104.53.121 304242 /home/xenus/photo-2.tif b _ i r

xenus ftp 0 *

Wed Nov 17 08:14:24 1999 1 210.114.253.140 46819 /home/xenus/gtk-apdx-c.hwp b _

i r xenus ftp 0 *

2. 분산 환경을 위한 솔루션 - NIS 와 NFS

NIS는 네트워크 정보 서비스이다. 이것을 풀이하면, 네트워크 정보를 가지고 이것을 제공해 주는 서비스라는 뜻이다. 여기에서 네트워크 정보의 정확한 의미는 한 무리의 네트웍과 그 무리를 묶어주는 아이디와 패스워드를 말한다. 말하자면, 분산 컴퓨팅 환경, 즉 데이터 베이스 서버 등을 따로 두었을 때, NFS를 사용할 때 등 전체 네트워크를 하나로 묶어 줄 필요가 있을 때 사용하는 것이다. NIS가 있을 때, 사용자는 연결된 여러 컴퓨터를 사용할 때 한번의 로그인만 하면 된다. 그리고, 이 NIS는 NFS를 사용하기 위한 전제조건이 되기도 한다.

그리고, NFS는 여러 컴퓨터 상호간에 서로의 파일 등의 자원을 공유할 때 사용한다. 하나의 컴퓨터에 하드 디스크 공간이 부족하거나 일정한 디랙토리 등을 여러 컴퓨터에서 공유할 필요가 있을 때 이것을 사용한다. 심지어는 이 NFS는 하드 디스크 없는 시스템이 가능하게 하기도 한다. 그러나, 공유를 위해서는 다른 컴퓨터에 접속해야 하고 이 때마다 인증을 받아야할 필요가 있다. 이것을 해소하기 위해 NIS 서버를 도입하게 되고, 그것으로 NFS는 무리없이 동작한다.

2-1. NIS와 NFS와 ISO 네트워크 7 레이어

Layer	Name	Physical Layer
7	Application		NFS 와 NIS
6	Pesentation		XDR
5	Session		RPC
4	Transport		TCP 또는 UDP
3	Network		IP
2	Data Link		Ethernet
1	Physical

위 그림은 ISO 네트워크 7 레이어를 나타낸다. 위의 Physical Layer의 경우는 NFS와 NIS가 동작할 때 작동하는 프로토콜과 물리적 요소들을 나타낸다. NFS와 NIS는 RPC와 XDR이라는 프로토콜을 사용하며, 이것이 TCP나 UDP 프로토콜의 형태로 IP 정보를 가지고 Ethernet을 통하여 네트웍상으로 나가게 된다. 당연히 다른 서버에서는 그것을 반대의 형태로 받아들이게 된다.

여기에서 RPC(Remote Procedure call: 함수호출)라는 것은 RPC를 지원하는 다른 시스템을 찾아서 데이터를 번들하여(가지고) 그곳에서 프로세스를 할 수 있도록 하나의 세션을 열어준다. 그리고 상대 서버는 그것을 프로세스하고 그 결과를 클라이언트로 돌려 준다. 그리고, 클라이언트에서 결과값이 디코딩된다. 이 RPC는 TCP와 UDP를 모두 쓰지만 대체적으로 UDP를 쓰게 된다.

XDR이라는 것은 외부데이터 표현을 위한 라이브러리 루틴으로 사용자 프로그램을 일정한 플렛폼에 의존하지 않는 형태(Canonical Form)로 기술하는 것을 가능하도록 한다. 그리고, 네트워크 호스트들에게 일정한 데이터를 교환할 수 있도록 해 준다. 이 폼에서 각 호스트끼리 네트웍을 하게 되는 것이다. 이 기술은 각각 다른 플렛폼 사이의 통신을 원할하게 하여 준다. 만약 플랫폼이 동일하다면 이것이 필요하지 않을 수도 있다.

다시 RPC에 대해 설명한다. RPC는 데이터 베이스를 옮기는 일같이 큰 데이터를 옮겨야 하는 경우를 제외하고는 UDP를 쓴다. 그것은 RPC라는 것은 바이트 중심의 서비스이기 때문이다. RPC는 포트를 사용하지 않고 서비스 번호를 쓰며, 포트맵에 의해서 포트로 변환이 된다. 이 RPC의 기능은 실행되는 함수가 제공하는 서비스를 위한 라이브러리의 충실도에 따라 좌우되는데, SUN 마이크로시스템사에서는 NFS 등의 라이브러리도 제공하고 있다.

2-2. NIS(Network Information System)

NFS 서비스를 알아보기 전에 먼저 NIS 서비스를 알아야 한다. 각 시스템에 접속하기 위해서는 일정한 인증 절차가 필요하고 이 NFS 도 예외는 아니기 때문에 NIS 서버에서 그것을 관리해 주는 것이 필요하게 된다. 한마디로 분산된 시스템들의 중요한 정보들(그룹 정보, 아이디, 패스워드 등)을 한 곳에서 관리하는 것이다.

NIS는 원래 YP(Yellow Page)라고 불렸다. 현재 NIS+도 나왔는데, 이것은 NYP라고도 불린다. 이것들의 구성은 크게 차이가 나지 않지만 기능면이나 보안의 차원에서 차이가 난다. 보안의 측면에서 안정적고, 서버에서의 운영 또한 NIS가 더 쉬워 보통 NIS를 사용하는데, NIS+를 사용하지 않아도 무리가 없다. 앞으로의 설명은 전통적인 NIS에 대한 설명이다. 그러나, 서버 구성을 하는 방법에는 큰 차이가 없다.

2-2-1. NIS의 역사

1980년대 중반, Sun Microsystem에서는 두가지 protocol을 내놓았는데, 바로 NFS (Network File System)와 NIS이다. 이들은 Network를 통해 여러 개의 Workstation들을 하나의  시스템을 사용하는 것처럼 작동시켜주는 핵심적인 방법이다. 즉, NFS는 사용자들의 home디렉토리들이 어느 시스템에서나 동일하게 보여지도록 하며, NIS는 passwd나 group등의 네트워크 정보 파일들을 하나의 서버에서 관리하도록 하여 나머지 시스템에서 서버에서 제공하는 새로운 정보를 받을 수 있도록 하는 것이다.

현재 Sun Microsystem에서는 NIS+도 제공하고 있다. 이것과 NIS의 가장 큰 차이점은 NIS+에서 rpc에서의 인증과 암호화를 지원한다는 것이다. 보통 한대의 서버로 모든 서비스를 제공하는 곳은 그리 많지 않다. 더구나 리눅스로 구축하면 비용이 10분지 1정도로 줄기 때문에 여러 대의 서버를 두어서 시스템 보안과 효율을 극대화 할 수가 있다. 한대의 시스템만으로 모든 서비스를 제공한다면, 이 글은 그리 필요하지 않다. 그러나, 2대 이상의 서버를 운영하고 있고 각 사용자가 중복되거나 할 경우 NIS와 NFS로 시스템을 효율적으로 관리 할 수 있다.

정리하자면 NFS나 NIS는 서로 다른 시스템의 자원을 공유하는 것이며, NIS는 그 중에 사용자 패스워드, 그룹 등을 공유하는 시스템인 것이다.

※ NIS가 어떻게 작동하는가?

네트워크 상에서, 적어도 하나의 NIS 서버가 있을 것이다. 여러분의 머신은 여러 개의 다른 NIS  "도메인들"의 여러 개의 NIS 서버를 사용할 수 있다. 혹은 하나는 master NIS 서버로, 다른 것들은 slave NIS 서버(특정한 NIS "domain"을 위한..)라 불리는 것들로서 협동적인 NIS 서버들을 사용할 수가 있다. 혹은 그것들의 혼합형을 사용 할 수도 있다. Slave 서버는 단지 NIS 데이터베이스의 카피를 가지고 있으며, 이것들이 갱신될 때마다, Master 서버로부터 이 COPY들을 받는다. 여러분 네트워크 상의 머신 수와 네트워크의 유연성에 따라서, 하나 혹은 여러 개의 slave 서버를 설치할 것인지를 결정하면 된다. NIS서버가 다운 되거나, 클라이언트에 대한 요구가 지연될 때마다, NIS클라이언트는 돌아가고 있거나 혹은 더 빠른 slave에 접속된다.

NIS 데이터베이스들은 ASCII 데이터베이스로부터 추출된, 소위 DBM 포맷으로 되어 있다. 예를 들어, /etc/passwd 와 /etc/group 파일은 직접적으로 ASCII-to-DBM 번역 소프트웨어(서버 소프트웨어에 포함된, "makedbm")를 사용하여 DBM포맷으로 만들어질 수 있다. NIS master 서버는 ASCII 데이터베이스와 DBM 데이터베이스를 동시에 가지고 있어야 한다.

Slave 서버들은 NIS 맵을 통해("yppush"프로그램을 통해) 변경 사항을 알 수 있다. 그리고는 그것들의 데이터베이스에 동조되기 위해 자동적으로 필요한 변경사항들을 갱신한다. NIS 클라이언트들은 항상 서버로부터 서버의 DBM 데이터베이스에 저장된 정보들을 읽기 때문에, 이러한 것들이 필요가 없다.

옛 버전의 ypbind 프로그램들은 NIS 서버를 찾기 위해 broadcast를 한다. 이것은 누구나 NIS서버를 설치하여 그 broadcast 쿼리에 응답을 할 수 있으므로 안전하지 못하다. 새로운 버전의 ypbind (yp-bind-3.3 or ypbind-mt)는 configuration파일로부터 서버를 찾기 때문에 broadcast를 할 필요가  없어 보다 안전하다.

* DBM(DataBase Management) : 데이터베이스에서 key-contents의 쌍을 유지하는 함수 라이브러리이다.

2-2-2. NIS Server의 구성

NIS system은 네트워크 기반 위에 구축이 되기 때문에 네트워크 상태가 안정적이어야 된다. 네트워크 상태가 불안정하면 data의 손실 및 클라이언트들의 오작동 등 여러 가지 안 좋은 현상들이 일어나게 된다. 보통 하나의 서브넷에 서버와 클라이언트들이 같이 물려있으면 괜찮다. 추천해주고 싶은 환경은 NIS system을 위한 하나의 네트워크 덩어리를 만들어 주는 것이다. 외부 네트워크와 별개로 돌아가게 만들고, 그리고 외부와 내부를 이어줄 수 있는 환경을 만들어 주면 NIS system은 최상의 상태를 유지하게 된다.

※ NIS서버와 클라이언트에서 공통으로 해주어야 할 일

NIS는 기본적으로 DNS를 사용하지 않는 것으로 되어 있다. 굳이 dns를 이용하고 싶다면 NIS 설정에서 변경하지 말고 /etc/host.conf에서 바꿔주는 것이 좋다.

order hosts,bind

multi on

그렇기 때문에 /etc/hosts파일에 각각의 서버 클라이언트의 호스트들을 등록을 해두는 것이 사용이 원할하다.

----------------/etc/hosts--------------------------

127.0.0.1               localhost localhost.localdomain

210.122.59.1            nis.cyberlaw.net nis

210.122.59.25           nis_client1.cyberlaw.net nis_client1

210.122.59.26           nis_client2.cyberlaw.net nis_client2

2-2-2-1. 구성에 필요한 준비

♥ 필요한 패키지 : ypserv-1.3.7-3.i386.rpm

(레드햇 6.2 베타버전 : ypserv-1.3.9-2.i386.rpm)

♥ ftp 사이트 : ftp://ftp.redhat.com/redhat/  또는 각 국내 배포판 FTP 사이트

♥ 관련 Homepage : http://www.suse.de/~kukuk/

2-2-2-2 서버 구성하기

① 패키지 설치

서버 구성에 필요한 패키지를 설치하도록 하자.

$ rpm -Uvh ypserv-1.3.7-3.i386.rpm

② nisdomaninname 결정

설치가 되었다면 다음으로 해야할 일은, nisdomaninname을 결정하는 것이다. nisdomainname은 NIS 를 사용하는 시스템들의 그룹을 나타내는 이름으로 hostname과는 다르다. 필자는 cyberlaw라는 이름으로 구성하겠다. 일단 nisdomainname이 결정되었으면 다음의 명령어를 쳐주자.

$ nisdomainname cyberlaw

다음 부팅시부터는 자동으로 nisdomainname을 인식하게 하기 위해서

/etc/sysconfig/network에 다음 줄을 추가하도록 하자.

NISDOMAIN=cyberlaw

이렇게 해 놓으면 부팅시에 ypserv가 시작되면서 nisdomainname을 자동으로 인식한다. /etc/rc.d/init.d/ypserv 파일을 살펴보면 그 이유를 알 수 있다.

--------------------- /etc/rc.d/init.d/ypserv -----------------------

....중략...

# getting the YP-Domainname

. /etc/sysconfig/network

...중략....

이 부분이 nisdomainname을 가져오는 부분이다.

③ shadow 패스워드 인식시키기

지금까지의 설정만으로도 기본적인 사용은 가능하게 되었다. 그런대, 지금 설정에서는 shadow 패스워드 시스템은 인식이 되지 않는다. shadow 패스워드를 인식하게 하기 위해서 /var/yp/Makefile에 다음의 부분을 찾는다.

all:  passwd group hosts rpc services netid protocols netgrp mail \

#shadow publickey # networks ethers bootparams amd.home \

auto.master auto.home passwd.adjunct

위의 부분을 다음과 같이 바꿔준다.

all:  passwd group hosts rpc services netid protocols netgrp mail \

shadow publickey # networks ethers bootparams amd.home \

#auto.master auto.home passwd.adjunct

이제는 쉐도우 패스워드를 인식하도록 설정이 되었다.

④ 테스트용 계정 만들기

이제는 테스트용 계정을 하나 생성해 두자.

$ adduser yptest

계정의 패스워드를 생성하는 것도 물론 잊지 말아야 한다.

⑤ 부팅시 ypserv 시작

이제는 ypserv를 초기 부팅시에 시작하도록 설정을 해준 후 ypserv와 yppasswd를 시작한다.

$ ntsysv

ypserv와 yppasswdd에 체크 표시를 하고 확인을 누른다.

⑥ ypserv와 yppasswdd 시작

$ /etc/rc.d/init.d/ypserv start

$ /etc/rc.d/init.d/yppasswdd start

ypserv와 yppasswdd를 시작한다. 데몬이 정상적으로 실행되어 있는 지 확인해 보자.

$ ps aux|grep yp

root     30450  0.0  0.1  4856  896 ?        S    Aug09   0:00 rpc.yppasswdd

root     30847  0.0  0.5  7480 2776 ?        S    10:34   0:00 ypserv

root     30858  0.0  0.1  3704  952 pts/16   S    10:35   0:00 grep yp

위와 같이 나온다면 정상적으로 데몬이 시작된 것이다.

⑦ 정보 갱신

이제 마지막으로 설정된 정보를 갱신해야 한다.

$ make -C /var/yp

아마도 이런 에러를 만날 것이다.

gmake[1]: *** No rule to make target `/etc/gshadow', needed by `group.byname'.  Stop.

gmake[1]: Leaving directory `/var/yp/icm'

/etc/gshadow파일이 존재하지 않기 때문에 나오는 것인데 만들어 주도록 하자.

$ echo cyberlaw > /etc/gshadow

만들고 나면 다시 아래와 같이 실행해 주는 것도 잊으면 안된다.

$ make -C /var/yp

변경된 정보는 항상 적용을 해 줘야 하는데, 이런 경우를 생각해 보자. 사용자가 패스워드를 변경했다면 서버에선 이것을 바로 클라이언트에 변경되었음을 알려주어야 할 것이다. 이럴 때마다 관리자가 make -C /var/yp를 해줄 수는 없다. 사용자가 언제 패스워드를 변경했는 지도 관리자는 확인할 수 없기 때문에 이것을 적당한 시간 간격으로 크론탭에 등록해 두는 것이 좋다. /etc/crontab 에 다음 한 줄을 추가하라.

# yp

0 * * * * root make -C /var/yp > /dev/null 2>&1

필자는 한시간 간격으로 설정을 해두었다. 관리자 맘대로 설정을 해두면 될 것이다.

2-2-3. NIS client의 구성

2-2-3-1. 구성을 위한 준비

♥ 필요한 패키지 : ypbind-3.3-24.i386.rpm, yp-tools-2.3-2.i386.rpm

2-2-3-2 구성하기

① 패키지 설치

$ rpm -Uvh yp-tools-2.3-2.rpm  ypbind-3.3-24.i386.rpm

② nisdomainname 설정

서버구성시와 마찬가지로 nisdomainname을 설정해 준다. 자 서버에서 정했던 nisdomainname을 설정하자.

$ nisdomainname cyberlaw

③ 부팅시 nisdomainname 자동 인식

다음 부팅시부터는 자동으로 nisdomainname을 인식하게 하기 위해서 /etc/sysconfig/network에 다음 줄을 추가하도록 하자.

NISDOMAIN=cyberlaw

이렇게 해놓으면 부팅시에 ypbind가 시작되면서 nisdomainname을 자동으로 인식한다.

④ nis서버와 nisdomain 설정

설치를 한 후 /etc/yp.conf을 열어서 다음 줄을 추가해 주자. nis서버와 nisdomain을 설정해 두는 것이다.

server nis.cyberlaw.net

ypserver nis.cyberlaw.net

domain cyberlaw

⑤ 부팅시에 ypbind 시작

nis 클라이언트에서는 초기 부팅시에 ypbind가 시작이 되어야 한다. ntsys로 ypbind를 부팅시에 시작하도록 설정하자.

⑥ 테스트

이제 ypbind를 실행하고 테스트로 만들어 두었던 계정을 가지고 정상적으로 작동이 되는 지 테스트를 해보자.

$ /etc/rc.d/init.d/ypbind start

정상적으로 시작이 되었다면 만들어 두었던 yptest로 nis_client에 접속을 시도해 보자 정상적으로 로긴이 된다면 성공한 것이다. 나머지 클라이언트들로 이런 방법으로 설정을 해두자.

⑦ 로긴 실패시 대응책

로긴에 실패한다면 암호를 서버쪽에서 확인하고 /var/yp디렉토리에서 make를 했는지 확인해 보자. 확인할 부분은 다음과 같다.

1. /etc/yp.conf에서 서버의 IP주소가 제대로 적혀 있는가

2. nisdomainname명령을 이용하여 서버와 nisdomainname이 같은지 확인하자.

3. ypbind가 제대로 떠있는지 ps -al  | grep ypbind 를 이용하여 확인하자.

4. nis 서버에서 클라이언트로 ypserv가 허용되어 있는 지를 확인하자.

※ 명심해 둘 점

I) 클라이언트에서는 서버의 root 패스워드를 따르지 않는다. 즉, root는 독립적인 암호를 가질 수 있다. 만약을 위해서라도 서버와 클라이언트 사이의 root 암호는 같게 해두지 말자.

II) NIS system은 보안상 취약점이 많다. 일단 클라이언트쪽에 크래커가 침입하면 크래커는 서버에서 주는 계정에 대한 정보를 얻을 수 있다. 관리자는 사용자들에게 주기적으로 암호를 바꾸도록 권고하는 것이 좋다. 그리고 서버에 남아있는 log 파일을 주기적으로 조사해 보는 것도 보안상 좋은 방법 중의 하나이다. 만약 이상한 곳에서 접속을 시도하는 것을 확인했으면 /etc/hosts.allow 나 /etc/hosts,deny 파일을 설정하여 외부 침입을 막을 수 있다.

2-2-3-3. 부가적인 명령어들

다음은 클라이언트에서 NIS system에 의해 부가적으로 사용하게 될 명령어들이다. 기존 명령에 yp만을 붙였다는 것이 공통점이다.

yppasswd : 암호 바꾸기. passwd명령과 동일한 효력을 가지고 있다. nis서버에서는 기존의 passwd로 사용자 패스워드를 변경해야 하지만 클라이언트에서는 yppasswd로 패스워드를 변경해야 한다. 클라이언트에서 이렇게 변경한 패스워드는 관리자가 make -C /var/yp를 해주지 않아도 바로 적용이 된다.

ypchfn : finger자료 바꾸기. chfn과 같다.

ypchsh : shell을 바꾸는 명령.

이밖에도 명령어가 더 있지만, 잘 사용하지 않으므로 생략하겠다.

2-2-4. NIS의 보안에 대한 조언

NIS는 네트워크쪽에 보안상 문제가 있다고 보고되고 있다. 물론 이런 보안적 문제들을 막기 위해 많은 보안상 보완이 이루어져 왔다. 그러나 아직까지도 보안상 문제는 많다. 그중 가장 대표적인 예를 들겠다.

2-2-4-1. 클라이언트 위조 접촉

NIS 서버는 일단 클라이언트에서 요청을 하면 바로 공급하도록 설계되어 있다. 그런데 이것을 악용하는 경우가 있다. 침입자의 컴퓨터가 NIS의 클라이언트처럼 속여서 서버내의 NIS정보를 받아간다면 큰 문제를 일으킬 수 있다. 이런 문제를 막고자 ypserv에는 클라이언트 제한 설정이 들어가 있다.

/var/yp/securenets : NIS정보를 줄 클라이언트 설정

securenets를 설정함으로서 클라이언트 위조를 막을 수 있다. 설정법을 설명하겠다. securenets에서 잡혀있는 기본 설정은 접속하는 모든 클라이언트에게 정보를 주는 것이다. 만약 internet에 뿌려져 있는 NIS맵 grep프로그램을 구해서 사용한다면 치명적이다.

-----------------------------/var/yp/securenets의 내용-------------------------------

#

# securenets    This file defines the access rights to your NIS server

#               for NIS clients. This file contains netmask/network

#               pairs. A clients IP address needs to match with at least

#               one of those.

#

#               One can use the word "host" instead of a netmask of

#               255.255.255.255. Only IP addresses are allowed in this

#               file, not hostnames.

#

# Always allow access for localhost

255.0.0.0       127.0.0.0

# This line gives access to everybody. PLEASE ADJUST!

0.0.0.0         0.0.0.0

기본 설정은 모든 호스트에 허용이 되어 있다. 이것은 상당히 위험하므로 필수적으로 수정을 해주어야 할 것이다. 이제 securenets를 수정해 보자.

# local host에서의 접속을 허용한다.(필수임)

255.255.255.255 127.0.0.1

# 203.249.103. 대의 network를 허용한다.

255.255.255.0   203.249.103.0

위의 설정은 C-클래스 부분을 정하여 허용하는 경우이다. 다음의 설정을 보자.

# local host에서의 접속을 허용한다.(필수임)

255.255.255.255 127.0.0.1

# between 131.234.214.0 to 131.234.215.255

255.255.255.0   131.234.214.0

위의 설정은 B-클래스를 설정하는 경우이다. 그리고 tcp_wrapper를 이용한 nis보안설정이 있다. /etc/hosts.allow파일과 /etc/hosts.deny을 설정하는 것이다. 만약 203.249.103. 대의 주소에 있는 클라이언트를 허용하려면 다음의 경우를 보자. /etc/hosts.allow파일내에 다음의 내용을 추가하자.

ypserv: 203.249.103.

/etc/hosts.deny파일 내에 다음의 내용을 추가하자.

ypserv: ALL

이렇게 하면 203.249.103.대의 nis클라이언트들만 허용을 접속하게 된다. securenets와 같은 역할을 하게 되는 것이다. 단, securenets는 nis만을 관여하지만, tcp_wrapper는 네트워크에 관련된 전반적인 부분을 관여하게 된다. 이렇게 NIS정보를 제공할 클라이언트를 제한함으로서 보안상의 문제를 해결하기 바란다.

2-2-5. NIS Server Master, Slave구성

여기까지 구축한 것으로도 nis 서버의 사용은 아무런 무리가 없다. 하지만 여기서도 문제점은 존재한다. 네트웍의 규모가 클 때 NIS 서버는 많은 양의 프로세스를 감당해야 하고, 그럴 경우 NIS 서버로는 운영에 무리가 올 수 있다. 따라서, 이러한 NIS도 분산을 시킬 필요성이 있다. 이제부터는 NIS Server (Master), NIS Server (Slave)로 구축을 해보자. 지금까지의 설정에는 다른 점이 없다. 여기까지의 설정에 몇 가지만을 추가해주면 Master,Slave의 역할을 하게 된다.

♥ Master설정

일단 현재 구성한 NIS 서버는 Master로 되어 있다고 볼 수 있다. 다만 Slave 서버에 정보를 전달 해주도록 설정이 되어 있지 않다는 것이다. 여기에 Slave에 접근을 허가해주는 것과 주기적으로 Master의 정보를 전달 해주는 설정을 해주면 된다.

① /var/yp/Makefile 수정

먼저 /var/yp/Makefile에 다음 부분을 고친다.

# If we have only one server, we don't have to push the maps to the

# slave servers (NOPUSH=true). If you have slave servers, change this

# to "NOPUSH=false" and put all hostnames of your slave servers in the file

# /var/yp/ypservers.

NOPUSH=true => NOPUSH=false

② nis서버 설정

그런 후에 /usr/lib/yp/ypinit -m을 실행해서 nis서버를 설정해 준다.

$ /usr/lib/yp/ypinit -m

At this point, we have to construct a list of the hosts which will run NIS servers.  nis.cyberlaw.net is in the list of NIS server hosts.  Please continue to add the names for the other hosts, one per line.  When you are done with the list, type a <control D>.

next host to add:  nis.cyberlaw.net

next host to add:  nis1.cyberlaw.net

slave로 사용할 서버의 호스트명을 적어준후에 ctrl+d를 누른다.

The current list of NIS servers looks like this:

nis.cyberlaw.net

nis1.cyberlaw.net

Is this correct?  [y/n: y]

정확하게 했다면, 엔터를 치면 자동으로 정보를 갱신한다. 이런 일련의 과정을 거친 후에 /var/yp를 보게되면 ypservers란 파일이 생성되어 있는 것을 볼 수가 있다. ypservers를 열어보면 서버목록이 들어가 있다. Master의 설정은 이것으로 끝이다. 이제 slave설정을 해보도록 하자.

♥ Slave설정

① nis client 설정

NIS Slave 서버로의 사용은 먼저 nis client 설정이 되어 있어야 한다.

② 서버 패키지 설치

client 설정을 먼저 한 후에 패키지를 설치한다.

$ rpm -Uvh ypserv-1.3.7-3.i386.rpm

③ 쉐도우 패스워드 설정

마찬가지로 쉐도우 패스워드를 사용하기 위해서 /var/yp/Makefile을 편집한다.

all:  passwd group hosts rpc services netid protocols netgrp mail \

#shadow publickey # networks ethers bootparams amd.home \

auto.master auto.home passwd.adjunct

위의 부분을 다음과 같이 바꿔 준다.

all:  passwd group hosts rpc services netid protocols netgrp mail \

shadow publickey # networks ethers bootparams amd.home \

#auto.master auto.home passwd.adjunct

④ 실행

다음으로 /usr/lib/yp/ypinit -s <master nis servername>을 실행한다.

$ /usr/lib/yp/ypinit -s nis.cyberlaw.net

⑤ 정보 갱신

slave는 항상 마스터의 정보를 가져와야 한다. 이것도 크론탭에서 설정을 해두는 것이 좋다.

crontab에 다음을 추가한다.

20 *    * * *   /usr/lib/yp/ypxfr_1perhour

40 6    * * *   /usr/lib/yp/ypxfr_1perday

55 6,18 * * *   /usr/lib/yp/ypxfr_2perday

이것은 모든 NIS 맵들이 최신 정보로 갱신되도록 하며, 정보 갱신 시 master서버의 다운으로 빠진 정보도 자동으로 갱신이 된다.

⑥ 문제 발생시

슬래이브 설정이 마무리 됐다면 클라이언트의 하나에서 ypserver를 슬래이브 서버로 설정하고 테스트를 해보고 문제가 없다면 성공한 것이다. 제대로 정보를 가져오지 못한다면 마스터 서버에서 슬래이브 서버의 설정이 제대로 되었는지를 확인하고 다음에 슬래이브 서버에서도 마찬가지로 마스터 서버의 설정이 제대로 되어 있는지 확인해 보자.

2-2-6. 팁

2-2-6-1. 클라이언트가 따로 계정을 가지게 하는 방법

클라이언트에서 root계정으로 adduser를 사용하여 만들면 된다. 주의해야 할 점은 nis서버에 사용자 uid와 같지 않도록 해야 한다는 것이다. 이점만 주의하면 별다르게 주의 할 점은 없다. 단, 레드햇 5.1이하 버젼에서는 passwd파일과 group파일을 수정해야 한다. 다음 사항을 보자.

2-2-6-2. 레드햇 5.2 이하 버전에서 클라이언트가 따로 계정을 가지게 하는 방법

2-2-6-3. 레드햇 5.2 이하 버전에서 shadow passwd사용하기

5.x 대는 현재는 잘 쓰이지 않는다. 3회 H 세션의 자료를 참조하시기 바란다.

2-2-7. NIS의 OS간 호환성

NIS-system은 Sun Microsystem사의 Solaris를 설치할 때 NIS(yp)와 호환이 되므로, linux와 Solaris 등 NIS(yp)가 되는 모든 유닉스 Client에서 사용할 수 있다. 또한 NT에서도 가능하다. 그러나, 이것은 NT에 특별한 툴이 필요하다. 또한, 보안상 헛점도 발견되었으며, 불안정하다고 한다. 그러므로, 되도록 사용하지 않는 것이 좋다. 이에 대한 것은 KLDP의 NFS, NIS 편의 리눅스 가제트 문서를 찾아 보기 바란다.

2-3. NFS(Network File System)

2-3-1. NFS의 필요성

NFS는 Network File System의 약자로, Sun Microsystem사가 내놓은 새로운 파일 시스템이다. NFS의 강점은, 네트워크를 통하여 local머신이 아닌 다른 머신의 하드를 자신의 머신에 있는 것처럼 할 수 있다는 것이다. NFS는 NIS와 함께 나왔으며, NIS를 사용할 때 NFS는 그 빛을 발한다. 만약, 시스템에 하드 공간이 부족하다면, NFS를 이용하여 하드용량을 늘려보자.

이미 NIS 서버구성에 대해서 다루었다. 그러나, 사용자를 공유했어도 정작 중요한 사용자 계정을 공유 할 수 없었기 때문에 개인 작업은 쉘 작업 말고는 할 수가 없는 상태이다. 여기서 nfs를 이용하게 되면 사용자는 어느 시스템에 접속하든지 관계없이 자신의 홈 계정을 사용하게 되며, 또한 메일도 어느 시스템에서나 확인할 수 있다. 또는 공동으로 작업을 하는 프로젝트가 있다면, 이 디스크를 다른 시스템에서 공유해서 어느 시스템에서도 작업이 가능할 것이다. 간단하게 정리하면 서버 시스템에 장착되어 있는 하드디스크를 다른 시스템에서 공유할 수 있게 해주는 시스템이다.

2-3-2. NFS 시스템의 구성

NFS 시스템도 NIS와 마찬가지로 네트웍 상태가 안정적인 것이 제일 중요한 관건이다. 작업도중에 nfs가 끊긴다면 사용자들이 작업하는데 상당히 불안해 할 것이다.

※ NFS 서버와 클라이언트의 공통으로 해주어야 할 일

/etc/hosts 파일에 각각의 서버 클라이언트의 호스트들을 등록을 해두는 것이 사용이 원할하다.

--------------------------/etc/hosts-------------------------------

127.0.0.1               localhost localhost.localdomain

210.122.59.1            nfs.cyberlaw.net nfs

210.122.59.25           nfs_client1.cyberlaw.net nfs_client1

210.122.59.26           nfs_client2.cyberlaw.net nfs_client2

2-3-2-1. NIS 서버의 구성

① 준비할 것

♥ 필요한 패키지 : knfsd-1.4.7-7.i386.rpm

② 커널 설정과 컴파일

nfs 서버로 사용하기 위해서는 커널에서 nfs 서버 지원이 들어가 있어야 한다. 커널 소스 설치하고 커널 컴파일시에 다음의 옵션을 켜주어야 nfs 서버의 기능을 사용할 수 있다.

# rpm -Uvh knfsd-1.4.7-7.i386.rpm

# rpm -Uvh kernel-headers-2.2.12-20.i386.rpm kernel-source-2.2.12-20.i386.rpm

# cd /usr/src/linux

# make mrproper

# make menuconfig

Code maturity level options =>

[*] Prompt for development and/or incomplete code/drivers

Filesystems  --->

Network File Systems  --->

<*> NFS filesystem support

<*> NFS server support

[*]    Emulate SUN NFS server

나머지는 자신의 시스템의 설정에 맞게 설정을 한다.

# make dep clean bzImage modules modules_install

이 과정이 지나면 /boot 디렉에 새로운 커널 이미지가 생성이 되며 모듈도 새로이 생성이 된다. 그 후에 /etc/lilo.conf를 열어서 새로운 커널로 편집을 해준다. 저장한 후에 /sbin/lilo를 실행해 주는 것을 잊지 말자.

# /sbin/lilo

그런 다음에 ntsysv로 초기 부팅시에 nfs 관련 데몬을 시작하게 설정한 후 재부팅하자. 부팅시에 nfsd가 로딩되는 것이 보이는가? 제대로 로딩이 되었다면 이제 알맞은 설정을 해주어야 할 단계이다. 먼저 nis를 연결한 시스템을 위해서 /home과 /var/spool/mail을 공유해서 사용자 계정과 메일을 공유할 수 있도록 해보자.

root@nis_server:> vim /etc/exports

/home  client1.cyberlaw.net(rw)

/var/spool/mail  client1.cyberlaw.net(rw)

exports는 간단하게 설명한다면, 디렉토리를 다른 시스템에 허용해 주도록 설정해 주는 것이다. 이름이 중복되는 곳은 *를 사용하여 나타낼 수 있다. 예를 들어,

client1.cyberlaw.net

client2.cyberlaw.net

client3.cyberlaw.net

client4.cyberlaw.net

이렇게 cyberlaw.net가 중복되면, 다음과 같이 설정을 한다.

/home  *.cyberlaw.net(rw)

위의 설정을 넣은 뒤, nfs데몬을 다시 시작하자.

root@nis_server:>/etc/rc.d/init.d/portmap stop

root@nis_server:>/etc/rc.d/init.d/nfs stop

root@nis_server:>/etc/rc.d/init.d/portmap start

root@nis_server:>/etc/rc.d/init.d/nfs start

그럼 이제부터 클라이언트는 /home과 /var/spool/mail 부분을 공유할 수 있다. /home은 사용자 계정을 일관되게 사용하게 함이고 /var/spool/mail을 어느 시스템에 로긴하든지 같은 메일 박스를 처리하기 위함이다.

다음으로 해줄 일은 nfs 클라이언트에서 /home과 /var/spool/mail을 공유하는 것이다.

root@nis_client1:> vim /etc/fstab

/dev/hda1               /                       ext2    defaults        1 1

/dev/hda2               swap                    swap    defaults        0 0

/dev/fd0                /mnt/floppy             ext2    noauto          0 0

/dev/cdrom              /mnt/cdrom              iso9660 noauto,ro       0 0

nis:/home    /home   nfs   rw,bg,soft,rsize=4096,wsize=1024,timeo=14   1 1

nis:/var/spool/mail /var/spool/mail   nfs rw,bg,soft,rsize=4096,wsize=1024,timeo=14   1 1

none                    /proc                   proc    defaults        0 0

none                    /dev/pts                devpts  mode=0622       0 0

위 설정에서 nis_server쪽을 보면 대충 짐작할 수 있을 것이다. 파일시스템은 nfs로 하며, 읽고 쓸 수 있고, 읽는 버퍼는 1메가이고, 쓰기 버퍼는 4메가, 연결 접속이 끊어졌을 때 호출시간이 14초라는 것을 말이다. 자세한 설명은 뒤에 다시 다루기로 하겠다.

root@nis_client1:> mount -a

위의 명령을 내린 뒤 df명령을 내려서 mount를 확인한다. 만약 잘 안되었다면 서버쪽의 exports부분과 클라이언트에서 설정한 부분이 맞는지 대조하기 바란다.

2-4. NIS/ NFS  응용

1) 메일을 보기위해 이쪽저쪽 컴으로 가기 싫다.

메일 spool폴더를 공유하자! forwarding을 쓸줄 아는 리눅서라면 이런문제를 forward를 시켜 해결하면 된다고 말할 것이다. 그러나 home을 공유하는 경우에는 어떻게 되겠는가? 다음의 경우를 보자. 클라이언트 3대가 있다. 모두 home을 공유하고 있다. 그런데 forward를 했다고 하자. nfs_client1,nfs_client2,nfs_client3가 있는데 nfs_cllient1으로 포워딩한다고 하자. 어떻게 될까? 최종적으로는 메일이 전달되지 못하고 미아상태가 되버린다. 그러나 메일 spool을 공유하게 되면 문제는 해결된다. nfs_client1이 받던지, nfs_client2가 받아도 메일은 차곡차곡 쌓이기 때문이다. 단 주의할 점이 있다. 일단 메일 spool에 자신의 계정에 따른 spool파일이 있어야 한다는 점이다. spool디렉토리는 mail 데몬이 관리하기 때문에, 처음 만드는 권한이 nis 서버에 있다. 그러므로 처음 메일은 nis 서버가 받도록 하고 다음부터는 각 client에서 받도록 하자.

서버에서 제공해야 할 디렉토리

/var/spool/mail

2) LaTeX을 사용할때마다 폰트컴파일을 하기 싫다!

LaTeX을 공유하자! TeX처럼 방대한 폰트를 제공하는 문서작성기는 이 세상에 없을 것이다. 다시 생각해 보면 이러한 폰트를 각각의 컴퓨터마다 가지고 있다는 것은 하드 낭비이다. 그리고 컴파일 할 때마다 들이는 시간은... 이러한 문제를 NFS를 이용하여 하드용량을 획기적으로 줄여보자. 배포판에 들어있는 TeX패키지를 일단 모두 설치하자. 다음으로 할 일은 서버는 놔둔체 클라이언트에서 TeX관련 디렉토리를 하나하나 지워버리는 것이다. 다음으로 할 일은 지워버린 디렉토리를 서버에서 제공하게 하여 공유하는 것이다. /usr/lib/tetex 와 /var/lib/tetex 부분이 공유할 포인트이다. 이렇게 공유하게 되면 각기 다른 클라이언트에서 컴파일된 폰트를 다른 클라이언트에서 사용하게 됨으로서 이중작업을 없애는 획기적인 방법이 아닐 수 없다.

3) 자질구레한 디렉토리들을 공유하자!

NFS는 자료를 공유하는데 있어서 획기적인 파일 시스템이다. 이것을 잘 사용하면 하드가 불필요한 컴퓨터를 만들 수 있다. 기본 파일만을 남겨두고 X시스템이나 /usr/local 부분의 프로그램들을 공유하여 사용한다면 클라이언트는 용량 큰 하드를 사용할 필요가 없다. 그리고 클라이언트쪽에 하드가 크다면 클라이언트가 NFS서버가 되어 하드를 제공할 수 있다. 이렇게 사용하면 거미줄처럼 하드를 공유하게 되어 하드용량을 최적화하여 사용할 수 있다. 이제는 실제 하나의 디스크를 클라이인트에 할당하고 세부적인 옵션을 사용해 보면서 설정을 해보도록 하자.

[root@nfs_server1 /etc]# vim /exports

텅텅 비어있음을 알 수 있다. 이제 클라이언트에 제공할 디렉토리를 설정하자.

/public를 제공하기로 결정했다. 다음과 같이 써주자.

/public       nfs_client1.cyberlaw.net(rw)

저장을 한뒤, /etc/rc.d/init.d/nfs restart를 쳐주자. portmap과 nfs를 다시 시작해 주어야 하는 것을 잊지 말자.

root@nis_server:>/etc/rc.d/init.d/portmap stop

root@nis_server:>/etc/rc.d/init.d/nfs stop

root@nis_server:>/etc/rc.d/init.d/portmap start

root@nis_server:>/etc/rc.d/init.d/nfs start

그럼 이제 클라이언트에서 /public를 mount할 수 있다. 마운트하는 명령은 다음과 같다.

mount -t nfs nfs_server1:/public  /mnt/public

클라이언트에서 위의 명령을 주면 서버의 /public디렉토리가 /mnt/public에 마운트된 것이다. 정상적으로 마운트 되었는지 df 로 확인해 보도록 하자.

[root@nfs_client1 /mnt]# df

Filesystem         1024-blocks  Used Available Capacity Mounted on

/dev/hda1            1190014  955442   173086     85%   /

nfs_server1:/public    2268573 1992598   158701     93%   /mnt/public

2기가짜리 하드 하나가 생긴것이다! 이제 /mnt/public에 가서 테스트용으로 디렉토리 하나를 만들어 보자. 뜻대로 되는가? 안 될 것이다. 뭔가 이상이 생긴 것이다! 하드는 붙었는데 쓰지 못한다면 붙은 하드는 전혀 쓸모가 없는 것이 된다. 이제 쓸 수 있게 설정해 보자. 원인은 서버의 exports에 있다.

[root@nfs_server1 /etc]# vim /exports

/public	nfs_client1.cyberlaw.net(rw,no_root_squash)

이제 클라이언트에서 다시 마운트해 보자. 그리고 테스트로 디렉토리를 만들어 보자. 잘되는가? 잘 될 것이다. 이제 설정파일을 분석해 보자.

/public      nfs_client1.cyberlaw.net(rw,no_root_squash)

~~~~~        ~~~~~~~~~~~~~~~~~~~~~~~~ ~~ ~~~~~~~~~~~~~~

1                2                3       4

1번의 경우는 잘 알 것이다. 클라이언트에 허용할 디렉토리이다. 2번은 mount를 허용할 클라이언트의 이름을 적어주는 곳이다. 3번은 public 디렉토리를 읽고 쓸 수 있게 허용을 한 것이다. rw는 read-write를 뜻하며, 읽기만을 허용한다면 "ro"(read-only)를 해주면 된다. 실행도 되게 하려면 "rx",read-excute를 해주면 된다. 4번은 클라이언트의 root도 쓸 수 있게 해준다는 것을 의미한다. 만약 no_root_squash가 없다면 어떻게 될까? 클라이언트에서 마운트가 되면 마운트된 하드는 일단 서버의 권한을 따른다. 그리고 클라이언트에서 root로 마운트된 곳을 쓰고 지울 수 없다. no_root_squash는 클라이언트의 root도 마운트된 하드를 다룰 권리를 준다는 뜻이다. 이밖에도 특정한 옵션을 더 줄 수 있다. 예를 하나 들자. 클라이언트에 계정을 하나 만들었다. ID는 terius이고 uid는 518, gid는 518로 주었다. 클라이언트는 terius계정을 가진 사람이 nfs로 마운트된 하드를 쓰고 읽게 허용하고 싶다. 그럼 서버에서 설정을 어떻게 바꾸어야 하는가?

[root@nfs_server1 /etc]# vim exports

/public  nfs_client1.cyberlaw.net(rw,no_root_squash,squash_gids=518,squash_uids=518)

항상 exports의 설정을 바꾸면 portmap과 nfs를 재시작해 주는 것을 잊지 말자. 이렇게 바꾸고 portmap과 nfs를 재시작 해주고 클라이언트에 가서 마운트해 보자.

이제 terius ID로, 마운트된 하드에 들어가서 파일을 써보자. 잘 안되면 다음의 경우를 조사해 보자.

1] 서버에서 제공하는 디렉토리의 퍼미션에 오류는 없는가

(ex, root만 쓸 수 있고, 다른 이들은 사용 못하게 되어 있을 경우)

2] 클라이언트 쪽에서 root가 마운트된 곳에 대한 퍼미션에 오류는 없는가

이렇게 두 가지를 확인해 보자. 만약 서버측에서 /etc/hosts.allow나 hosts.deny를 설정해 놓았으면 한가지 할 일이 남았다. 바로 클라이언트쪽에 대한 보안을 푸는 것이다. 안 풀어 놓으면 위의 설정대로 해도 안 될 것이니 주의하기 바란다. 만약 클라이언트쪽이 공공의 FTP디렉토리로 줄 경우 어떤 옵션을 넣어줄까? 이에 대한 옵션으로 all_squash이 준비되어 있다. 옵션은 중복해서 넣어줄 수 있다.

/public      nfs_client1.cyberlaw.net(rw,no_root_squash,all_squash)

이제 클라이언트에서 생길 문제에 대해 논의해 보자. 만약 서버가 다운된다면, 또는 네트워크가 다운된다면 어떻게 될까? 이때부터 클라이언트는 쓸데없는 에러메시지를 사용하는 사람들의 모든 터미널에 뿌려댈 것이다. 이것을 어떻게 막을 것인가? NFS는 그런 쪽도 미리 신경을 써두었다. 다음 설정을 보자.

mount -t nfs -o timeo=14 nfs_server1:/public  /mnt/public

1.4초 동안 서버에서 응답이 없으면 경고문을 뿌려대라는 옵션을 단것이다. 숫자가 클수록 NFS클라이언트는 가만히 있다가 지정시간이 지나면 경고가 뜬다. 물론 그 시간사이에 서버에서 응답을 하면 경고시계는 멈추고 정상으로 간주한다. 시간을 많이 한다고 좋은 것은 아니다. 그렇다고 너무 짧아도 좋지 않다. 네트워크는 항상 좋은 상태를 유지한다고 보장할 수 없다. 그러므로 한 1.4초 내지 10초 정도 안에서 확인을 하는 것이 좋을 것이다. NFS로 여러대의 클라이언트/서버가 묶여있다고 가정해 보자. 사용자들이 여기저기 마운트된 곳에 파일을 카피하고 지우고 옮긴다. 그럼 그사이에 네트워크는 로컬에서 도는 것처럼 빨리 처리될까? 그렇지는 않다. 네트워크 라인도 한계가 있다. 이러한 한계를 조금이나마 풀고자 NFS에서는 버퍼링을 지원한다. 다음을 보자.

mount -t nfs -o timeo=14,rsize=1024,wsize=1024 nfs_server1:/public /public

뭔가 옵션이 더 붙었다. rsize는 read 버퍼의 크기를 뜻하고, wsize는 write 버퍼의 크기를 뜻한다. 모두 1메가씩 잡혀 있다. 한가지 조언할 것이 있다. rsize와 wsize는 크게 하면 파일을 쓰는 도중 죽는 경우가 많다. 이런 경우는 네트워크 카드와  커널에서 파일을 쓰는 도중 버퍼에 따른 블록을 감당하지 못하여 죽기 때문이다. 그러므로 관리자는 다음과 같은  테스트를 해서 알맞은 버퍼 사이즈를 정하도록 하자.

**** wsize, rsize 최적의 버퍼사이즈 구하기 ****

일단 관리자는 상상했던 버퍼 사이즈를 정해서 마운트하자. 그 다음, 다음의 명령을 주자.

time dd if=/dev/zero of=/mnt/testfile bs=16k count=4096

이것은 64메가 짜리 test라는 파일을 만들라는 뜻이다. 기다리다 보면 시간이 출력되고 64메가 짜리 파일이 생성된다. 이런 일을 계속 반복한다. 물론 버퍼 사이즈는 계속 변경하면서 말이다.  그리고 쓰는 시간이 제일 짧은 것을 선택해 주면 된다. 자, 이제 최적화를 시켰으면 NFS로 여러 컴퓨터를 엮어보자. 부팅되면서 바로 마운트를 시키려면 /etc/fstab을 수정하기 바란다.

** fstab 수정하기 **

다음 항목을 /etc/fstab에 추가한다.

nfs_server1:/public  /mnt/public  nfs  rw,rsize=4096,wsize=1024,timeo=14  0 0

이제 NFS에 대해 원하는 기능이 또 있는가? 전에 timeo옵션을 사용해서 서버를 기다리는 기능을 기억하리라 믿는다. 만약 서버에서 응답이 없으면 그냥 끊고 싶은 생각은 안드는가? 이런 관리자를 위한 옵션이 준비되어 있으니 사용해 보자.

mount -t nfs -o timeo=14,rsize=1024,wsize=1024,soft server1:/public /mnt/public

~~~~

mount -t nfs -o timeo=14,rsize=1024,wsize=1024,hard,intr server1:/public /mnt/public

~~~~~~~~~

옵션이 추가되었음을 알 수 있다.

soft : 클라이언트쪽 프로그램에서 마운트된 하드를 다룰 수 있게 허용하는 옵션이다. 예를 들어 프로그램이 마운트된 하드를 사용중이면 클라이언트쪽 관리자는 마운트를 해제할 수 없다. 프로그램이 좀비 상태로 떠 있어도 하드를 사용하고 있으면 마운트는 풀리지 않는다. 이런 경우는 리부팅 밖에 답이 없으므로, 전원을 자주 끄지 않는 관리자들에게 권해주고 싶지 않다.

hard,intr : 프로그램이 하드를 사용 중에 서버가 멈추거나 네트워크가 죽으면 하드사용을 무조건 막는 옵션이다. 마음대로 마운트를 풀 수 있기 때문에 대규모로 NFS 사용시 유용한 옵션이다.

soft옵션은 네트워크가 죽거나 서버가 죽으면 끝까지 버티고 있는 성격을 가지고 있어서, 클라이언트는 살려두고 서버를 잠깐 꺼두었다가 하드웨어(예를 들어 하드 업그레이드)등을 교체한 뒤 다시 서비스를 시작할 때 좋은 옵션이다. /etc/fstab에 추가할 때는 다음과 같이 fstab 내용의 마지막에 넣어준다.

a. soft 옵션일 때

nfs_server1:/public  /mnt/public  nfs  rw,rsize=4096,wsize=1024,soft,timeo=14  0 0

b. hard,intr 옵션일 때

nfs_server1:/public  /mnt/public  nfs  rw,rsize=4096,wsize=1024,hard,intr,timeo=14  0 0

자, 지금까지 nfs에서 많이 사용하는 기능들을 중심으로 설명했다. nfs사용시 마운트할 때 주는 옵션에 대한 설명을 살펴보자.

rsize=n       NFS 서버로부터 읽어들이는 바이트수를 지정한다.                                        기본값은 커널에 따라 다른데 기본은 1024 바이트이다.

wsize=n       NFS 서버에 쓰기를 할 때 사용하는 바이트수를 정한다.                                   기본값은 커널에 따라 다른데 기본값은 1024 바이트이다.

timeo=n       RPC 타임아웃이 생기고 나서 첫번째 재전송 요구를 보낼 때                               사용되는 시간으로서 1/10 초 단위이다. 기본값은 7 * 1/10, 0.7                          초이다. 첫 번째 타임아웃이 생기고 나서는 타임아웃 시간이                              최대치인 60 초에 이르거나 너무 많은 재전송 요구가 벌어질                              때까지 타임아웃 시간이 2 배로 변화한다. 만약 화일 시스템이                            하드(hard,옵션을  참고하기  바란다) 마운트되어 있다면, 각각의                         타임 아웃 시간은 2 배로  증가하고 재전송 시도가 일어날 때도 2                         배로 증가한다. 최대 타임아웃 시간은 60초이다. 네트웍 속도가                           느리거나 서버 자체가 느리다든지 여러개의 라우터와 게이트웨이를                        거칠 때는 마운트 당시 타임 아웃 시간을 늘려주는 것이 좋다.

retrans=n     주 타임아웃을 발생시키는 부 타임아웃과 재전송 횟수를 정한다.                          기본값은  3번의 타임아웃이다. 주 타임 아웃이 일어나면 파일                            작업이 중지되거나 콘솔 상에 "서버가 반응하지 않음 "server not                         responding""이라는 메시지가 출력된다.

acregmin=n    서버에게 최신 정보를 요청하기에 앞서 일반 화일의 속성이                               캐쉬되어야 할 시간의 최소값을 정한다. 기본값은 3 초이다.

acregmax=n    서버에게 최신 정보를 요청하기에 앞서 일반 화일의 속성이                               캐쉬되어야 할 시간의 최대값을 정한다. 기본값은 60 초이다.

acdirmin=n    서버에게 최신 정보를 요청하기에 앞서 디렉토리의 속성이                                캐쉬되어야 할 시간의 최소값을 정한다. 기본값은 30 초이다.

acdirmax=n    서버에게 최신 정보를 요청하기에 앞서 디렉토리의 속성이                                캐쉬되어야 할 시간의 최대값을 정한다. 기본값은 60 초이다.

actimeo=n     이 값을 다음 acregmin, acregmax,  acdirmin, acdirmax 에                               똑같이 적용한다. 기본값은 없다.

retry=n       백그라운드에서 진행 중인 NFS 마운트 작업이 포기하기 전까지                            실행할 횟수를 정한다. 기본값은 10000 번이다.

namlen=n      NFS 서버가 RPC 마운트 프로토콜의 버전 2 를 지원하지 않을 때                           원격  화일  시스템에서 지원되는 화일명의 길이를 명시한다.                             POSIX pathconf  함수를  지원하기 위해서 사용된다. 기본값은                            255 개의 문자이다.

port=n        NFS 서버와 연결할 수 있는 포트 번호를 정한다. 만약 0 이라면                           (기본값) 원격 호스트의 포트매퍼(portmapper) 에게 질의하여

알아내도록 한다. 만약 포트매퍼에 NFS 데몬이 등록되어 있지                             않은 경우에는 2049 라는 표준 NFS 포트 번호가 사용된다.

mountport=n    mountd 포트 번호 지정하기.

mounthost=name mountd 를 실행 중인 호스트명을 정한다.

mountprog=n    원격 호스트의 마운트 데몬과 접속하기 위해 사용할 수 있는                              별도의 RPC 프로그램 번호를 정한다. 만약 여러 개의 NFS 서버를                          운영하고 있을 때 사용한다.  기본값은 표준 RPC 마운트 데몬                             프로그램 번호인 100005 이다.

mountvers=n   원격 호스트의 마운트 데몬와 접속하기 위해 사용하는 별도의 RPC                         버전  번호를  명시한다. NFS서버를 여러개 운영하고 있을 때                             사용한다. 기본값은 버전 1 이다.

nfsprog=n     원격 호스트의 NFS 데몬과 접속하기 위해 사용하는 별도의 RPC                            프로그램 번호를 정한다. NFS 서버를 여러개 운영하고 있을 때                            사용한다. 표준 RPC NFS 데몬 프로그램 번호인 100003 이                                 기본값이다.

nfsvers=n     원격 호스트의 NFS 데몬과 접속하기 위해 사용하는 별도의 RPC                            버전 번호를 정한다. NFS 서버를 여러 개 운영하고 있을 때                               사용한다. 기본값은 버전 2 이다.

bg            만약 첫번째 NFS 마운트 시도가 타임아웃 걸리면 백그라운드에서                          실행을 계속한다. 기본값은 백그라운드로 실행하지 않고 그냥                             포기한다.

fg            첫번째 NFS 마운트 시도에서 타임아웃이 걸리면 그 즉시 포기해                           버린다.  기본값이다.

soft          NFS 화일 작업에서 주 타임아웃이 걸리면 프로그램에게 I/O 에러를                        보고한다. 기본값은 무한히 NFS 화일 작업을 재시도하는 것이다.

hard          NFS 화일 작업에서 주 타임아웃이 걸리면 콘솔상에 "server not                           responding",  "서버가 반응하지 않음"이라고 출력하고 무한히                            재시도한다. 이것이 기본값이다.

intr          주 타임아웃이 생기고 하드 마운트된 상태라면 화일 작업을                               중지하도록 시그널을 보내도록 허용하고 EINTR 시그널을 보내다.                          기본값은 화일 작업을 인터럽트하지 않는 것이다.

posix         POSIX 규칙을 사용하여 NFS 파일 시스템을 마운트한다. 화일명의                          최대 길이에 대하여 POSIX pathconf 함수를 제대로 지원하기                              위해서 사용된다. 원격 호스트는 RPC 마운트 프로토콜 버전 2 를                          지원해야 한다. 많은 NFS 서버들이 아직 버전 1 만을 지원하고                            있다.

nocto         화일이 생성될 때 새로운 속성을 가져오지 않도록 한다.

noac          모든 속성 캐쉬를 해제한다. 서버 효율을 떨어뜨리기는 하지만 두                         개의 다른 NFS 클라이언트로 하여금 서버상의 공통 파일 시스템에                         쓰기 작업을 할 때 좋은 효율을 얻을 수 있게 해준다.

tcp          NFS 화일 시스템을 기본값인 UDP 가 아니라, TCP 프로토콜을                              사용하여 마운트하도록 한다. 많은 NFS 서버들이 오로지 UDP                              만을 지원한다.

udp          NFS 화일 시스템을 UDP 프로토콜로 마운트한다. 기본값.

수치값을 동반하지 않는 단독 옵션들은 no를 앞에 붙이는 형태로서도 사용할 수 있다. 예를 들어 nointr 이라는 옵션은 파일 작업을 가로챌 수 없도록 한다.

4) 하드 디스크 없는 컴퓨터

NFS를 응용하면 하드디스크 없이도 컴퓨터를 사용할 수 있다. 하드디스크를 NFS로 공유를 하는 것이다. 이에 대한 문서는 KLDP에 있으므로 그것을 참조한다.

2-3-3. NFS 보안에 대한 조언

nfs를 이용해 외부에 있는 하드를 자신의 하드처럼 사용할 수 있다는 것은 정말 편리한 일이다. 그러나 nfs가 네트워크를 기반으로 만들어졌기 때문에 보안적으로도 치명적인 부분이 있다. NFS는 서버와 클라이언트간에 신뢰를 가지고 구축해 나가는 것이다. 그런데 외부 침입자가 서버의 exports 파일을  볼 경우, 침입자는 자신의 머신에 nfs로 마운트를 하여 정보를 가져갈 수 있다. 이런 문제를 막기 위해서는 위에서 설명한 여러 옵션들을 적절하게 설정해 주어야 한다. 일단 침입자가 마운트에 성공하면, 침입자는 고의적으로 용량이 큰 파일을 빼가거나 집어넣음으로서 서버를 비롯한 클라이언트까지 네트워크에 부하를 주어 네트워크를 다운시킬 수도 있다. 관리자는 이러한 문제가 일어나지 않도록 exports파일을 잘 설정해야 한다.

/etc/hosts.deny에 rpc.mountd, portmap 설정으로 모든 시스템에 대해서 거절하고,

/etc/hosts.allow에 허용할 시스템만 등록해 두는 것이 좋다.

3.  윈도우즈와의 인터그레이션을 시도한다. - SAMBA

samba 는 윈도우즈와 리눅스간의 상호 파일과 프린트 시스템을 공유하도록 해 준다. 따라서, samba는 불필요한 비용들을 없애주고, NT의 프린팅 서버를 대신해 줄 수 있는 등, 사용자들에게 유용한 기능을 제공한다. 이 삼바는 NFS와 함께 사용할 수도 있다. 그것은 SAMBA 이용시 인증 과정이 해결이 되기 때문에 NIS라는 인증 서버가 불필요하게 되는 것이다. 또한 NIS를 NT 쪽에 적용하기 위해서는 NT에서는 특별한 툴을 설치하여야 하며, 이것은 보안에 약하다는 것과 불안정하다는 약점을 제공한다. 따라서, 이 SAMBA는 이러한 문제들를 해결해 준다. SAMBA의 경우 NT 도메인 그룹에 쉽게 들어갈 수 있기 때문에 NT에 의해 도메인 그룹이 관리되고 있다면 더없이 유용하다. 삼바를 한마디로 정의하자면 리눅스 서버의 자원을 윈도우 클라이언트에서 사용이 가능하도록 해준다는 것이다. 물론 반대의 경우도 가능하다.

3-1. SAMBA 설치

SAMBA는 기본적으로 리눅스 설치시 설치할 수 있다. 그러나, 따로 설치할 경우, 소스파일을 받아오거나 RPM 파일을 받아와서 설치할 수가 있다. 설치의 간편함과 설정하는 것이 어렵게 느껴진다면, RPM 파일을 받아서 설치하면 된다.

3-1-1. 알아 둘 사항들

※ SAMBA 사이트

http://www.samba.org/

※ SAMBA 소스

Download: ftp://ftp.samba.org/pub/samba/

Red Hat Packages: ftp://ftp.samba.org/pub/samba/Binary_Packages/redhat/RPMS/

Debian Packages: ftp://ftp.freshmeat.net/pub/debs/samba/

※ 필요한 데몬들

smbd (SMB 데몬)

nmbd (클라이언트를 위해  NetBIOS nameserver를 지원하다 )

※ 설치가 완료되었을 때의 실행 파일들

smbclient       (유닉스를 위한 삼바 클라이언트)

smbprint        (삼바 호스트의 프린터에 프린트를 하기 위한 스크립트)

smbprint.sysv   (위 smbprint와 같지만 SVR4 유닉스를 위한 것이다)

smbstatus       (현재의 삼바 연결 상태를 보여준다)

smbrun          (삼바 호스트의 응용프로그램 실행을 용이하게 하는 스크립트)

3-1-2. 설치

① RPM 파일 설치

rpm -Uvh samba-2.0.5a-12kr.i386.rpm

rpm -Uvh samba-client-2.0.5a-12kr.i386.rpm

rpm -Uvh samba-common-2.0.5a-12kr.i386.rpm

② 소스 파일 설치

필요한 소스 파일을 다운로드 한다.(소스 파일 다운로드는 홈페이지나 freashmeat.net에서 찾아서 다운로드하면 된다.) 그리고, 다음과 같이 설치한다. (대부분의 경우 설치법은 압축된 소스와 함께 README 등의 형태로 있다. 그러므로, 그것을 참조한다.)

$ tar xvzf samba-2.0.5a.tar.gz -c src/

$ cd src/samba-2.0.5a/source

$./configure --prefix=/usr --libdir=/etc --localstatedir=/var \

--with-smbmount --with-automount

$ make

$ make install

3-2. SAMBA 서버의 실행

RPM 파일을 설치하면 실행은 간단하다. setup 명령을 내린 후, Services 메뉴에서 SAMBA를 골라주면 된다. 그러면, 시작시 삼바가 간단하게 시작된다. 재부팅 없이 하려면 데몬을 직접 시작해 주면 된다.

소스를 설치했을 때 inetd에 의해 데몬을 실행시키기 위해 아래 줄들을 /etc/inetd.conf 에 추가시켜야 한다.

# SAMBA NetBIOS services (for PC file and print sharing)

netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd

netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd

그리고, 적용을 위해 inetd를 재실행한다.

# kill -HUP inetd

시스템 초기 시스템에서 SAMBA를 실행하기 위해서 SAMBA-HOWTO 에 나온 다음의 스크립트를 /etc/rc.d/init.d/smb 로 저장하고 실행파일로 바꾸어 주면 된다.

#!/bin/sh

#

# /etc/rc.d/init.d/smb - 삼바 서비스를 시작, 중지한다.

#

# 아래와 같이 이 화일을 심볼릭 링크를 시킨다.

# symlinks: /etc/rc.d/rc1.d/K35smb  (셧다운할 때 SMB 서비스를 죽인다.)

#           /etc/rc.d/rc3.d/S91smb  (택스트 모드로 로그인할 때

#                                    SMB서비스를 시작한다.)

#           /etc/rc.d/rc6.d/K35smb  (리부트할 때 SMB 서비스를 죽인다.)

#

# 함수 라이브러리 소스

. /etc/rc.d/init.d/functions

# 네트워크 설정 소스

. /etc/sysconfig/network

# 네트워크 가능상태를 점검한다

[ ${NETWORKING} = "no" ] && exit 0

# 서비스를 시작 또는 중지시킨다.

case "$1" in

start)

echo -n "Starting SMB services: "

daemon smbd -D

daemon nmbd -D

echo

touch /var/lock/subsys/smb

;;

stop)

echo -n "Shutting down SMB services: "

killproc smbd

killproc nmbd

rm -f /var/lock/subsys/smb

echo ""

;;

*)

echo "Usage: smb {start|stop}"

exit 1

esac

3-3. SAMBA 설정 (/etc/smb.conf)

3-3-1. 기본적인 설정(/etc/smb.conf)

리눅스(또는 다른 유닉스 시스템)에서 삼바설정은 /etc/smb.conf 파일에 의해서 제어된다. 이 설정파일은 외부와 공유시킬 시스템 자원과 어떤 제약을 둘 것인지를 결정하고 프린터 설정을 다룬다. 각 영역은 global, homes, printers 등으로 말머리가 시작된다.

① global 영역

삼바가 모든 자원들의 공유를 정의하는데 사용하는 몇몇 변수들을 정의한다.

② homes 영역

사용자가 원격으로 리눅스의 사용자 홈 디렉토리로 접속하는 것을 허용한다. 단, 사용자는 자신의 홈 디렉토리 접속만을 허용한다. 즉, 윈도우즈 사용자가 윈도우즈로부터 리눅스의 공유 드라이브로 접속을 시도한다면, 오직 사용자 개인의 홈 디렉토리만이 접속이 가능하다. 이때 중요한 것은 사용자는 리눅스에 계정을 가지고 있어야 한다는 것이다.

③ printers, ljet 영역

리눅스의 프린터와 윈도우즈를 공유할 수 있다. 이 때, 리눅스의 프린터의 경로(이 경우엔 ljet의 path)를 /etc/printcap에 정의된 스풀디렉토리와 일치시키는 것을 잊지 말라.

아래의 예에서는 사용자가 로컬 컴퓨터의 개인 홈 디렉토리 접속과 임시 디렉토리 생성을 허락한다. 윈도우즈 사용자가 이들 공유를 볼 수 있기 위해서는 리눅스가 로컬 네트워크 상에 있어야 한다. 그러면 사용자는 윈도우즈 파일 매니저나 탐색기의 네트워크 드라이브로 간단히 연결할 수 있다.

; /etc/smb.conf

;

; 이 화일을 수정한 뒤에 서비스를 꼭 재실행한다. 예:

; /etc/rc.d/init.d/smb stop

; /etc/rc.d/init.d/smb start

[global]

; guest 계정을 허용하려면 아래 주석 기호를 삭제한다.

; guest account = nobody

log file = /var/log/samba-log.%m

lock directory = /var/lock/samba

; 이하는 프린트 설정

share modes = yes

printing = bsd

printcap name = /etc/printcap

load printers = yes

[homes]

comment = Home Directories

browseable = no  # 윈도우즈 네트워크 브라우저에서 디랙토리를 보일 것인지를 결정

read only = no   # 읽기만을 허용할 것인지 결정

create mode = 0750 # 파일을 만들었을 때의 기본 퍼미션

[tmp]

comment = Temporary file space

path = /tmp

read only = no

public = yes

;이하는 프린터 설정

[printers]

comment = All Printers

security = server

path = /var/spool/lpd/lp

browseable = no

printable = yes

public = yes

writable = no

create mode = 0700

[ljet]

security = server

path = /var/spool/lpd/lp

printer name = lp

writable = yes

public = yes

printable = yes

print command = lpr -r -h -P %p %s

3-3-2. 리눅스의 드라이브를 윈도우즈에 공유하기

리눅스의 드라이브를 연결하기 위해서 윈도우즈 탐색기의 네트워크 연결을 통하여 연결할 수 있다. 네트워크 연결에서 □\\호스트이름\공유디랙토리명□을 이용하여 연결이 가능하다. 삼바의 여러 가지 자원을 관리하는 방법들을 설명하겠다.

디렉토리를 공유시키기 위해서는 앞의 smb.conf화일 tmp 영역을 복사해서 아래와 같이 바꾼 다음 파일에 추가한다.

다음과 같이 따로 설정하여 주어야 연결이 가능하다.

[public]

comment = Public Stuff

path = /home/public

public = yes

writable = yes

# 네트워크 관리자에서 브라우징이 가능하려면 다음과 같이 넣어 준다.

#  browseable = yes

# 다음은 모두에게 프린트를 허용한 것이다.

# 디렉토리를 syberlaw 그룹에 속한 사용자에게만 쓰기 권한을 주고,

# 그 외 일반 사용자에게는 읽기 권한만을 주기 위해서는 아래와 같이 한다.

#  printable = no

#  write list = @cyberlaw

printable = yes

이러한 설정을 웹 인터페이스로 가능하게 하는 것이 포홤되어 있는데. swat라는 것이다. swat에 대해서는 뒤에서 다루어 보도록 하겠다.

3-3-3. 세부적인 설정

다음은 /etc/smb.conf 파일을 전체적으로 설명해 놓은 것이다. 아래 부분의 설명 부분을 없에면 하나의 훌륭한 예제 파일이 된다.

① [global] 부분

[global]

workgroup = ICM

삼바 호스트가 참여할 워크 그룹에 대한 설정이다. 기존의 사용하는 워크 그룹이 있다면 그 그룹으로 묶어 두면 될 것이다.

server string = cyberlaw 파일 서버

삼바 서버의 설명을 표시하는 부분이다.

veto files = /.?*/

.로 시작하는 히든 파일을 보이지 않도록 설정한다. 자기 홈 계정에 접속하면 클라이언트에서는 별 필요 없는 히든 파일들이 보이기 때문에 상당히 사용하기가 불편하다. 이럴 때 사용하면 좋다.

client code page = 949

한국어를 보기 위해서는 코드 페이지를 949로 설정해 주어야 한다.

hosts allow = 127. 210.122.59.

이 부분은 보안에 관련된 부분이다. 삼바를 아무곳에서나 접속할 수 있다면 좋지 않을 것이다. 위의 설정은 자기 자신과 210.122.59. 대역의 C Class를 허가한 것이다. IP대신 도메인명도 가능하다.

load printers = yes

시스템에 부착된 프린터가 있을 경우 printcap에 정의한 프린터 목록이 자동으로 서비스 되게 된다. 이것을 no로 했다면 일일이 설정을 다시 해주어야 한다.

;   printcap name = /etc/printcap

기본값으로 주석처리가 되어 있는데 현재 위치가 기본값이다. 이 파일의 위치나 다른 파일로 변경하고 싶다면 주석을 풀고 정확한 파일 경로를 입력해 주면 된다.

;   printcap name = lpstat

리눅스에서는 별 상관이 없는 옵션이다. SystemV 시스템에서는 printcap name 을 lpstat 으로 해주면 SystemV 스풀 스템으로부터 프린터 목록을 자동으로 얻는다.

;   printing = bsd

시스템에 부착되어 있는 프린터가 프린팅 시스템 표준에서 벗어난 것이라면 다음 옵션의 주석을 풀어 주어야 한다. 현재 지원하고 있는 프린트 시스템은 bsd, sysv, plp, lprng, aix, hpux, qnx 등이다.

guest account = nobody

손님 사용자를 허가하는 설정이다. 주석처리를 하면 손님은 삼바를 사용할 수가 없게된다. nobody가 아닌 다른 유저로 설정할 경우에는 /etc/passwd 항목에 설정한 손님 사용자 계정을 추가해야 한다. 이 계정은 일반 쉘로 로긴을 못하게 해놓는 것이 좋다.

log file = /var/log/samba/log.%m

삼바에 접속하는 호스트 별로 개별적인 기록 파일을 만들도록 한다. "/var/log/samba/log.접근호스트이름"과 같은 파일명을 가지게 된다. %m 은 삼바 설정에서 사용되는 변수로 호스트명을 의미한다.

max log size = 50

로그 파일 크기를 제한한다. 단위는 Kb이다. 너무 작아도 로긴한 흔적을 찾기 힘들지만 너무 크게 잡아두었을 때도 괜한 공간의 낭비를 초래할 가능성이 있으므로 적절하게 유지하자.

security = share

여기서 사용할 수 있는 옵션은 user, share, server 이 세가지이다. user 는 유닉스 계정이름/패스워드 방식의 보안 등급이며 share는 워크그룹 포 윈도우즈(WfW)와 윈도95의 기본 모드이다. 클라이언트들이 95,98,nt 일 경우 share로 해두도록 하자. 클라이언트를 윈도우 95나 98을 사용한다면 필히 share로 해두어야 한다. 이 설정을 때문에 클라이언트에서 접근을 못하는 사례를 많이 보았다. server의 경우에는 인증을 위해 NT 서버를 필요로 한다.

;   password server = <NT 서버 이름>

security = server로 설정했을 경우에 해당 NT 서버의 이름을 적어준다.

;  password level = 8

;  username level = 8

패스워드와 유저이름을 대소문자 모든 조합에 대하여 8개의 문자로 이뤄진 패스워드를 사용하도록 한다.

null passwords = yes

encrypt passwords = yes

smb passwd file = /etc/smbpasswd

패스워드를 암호화 할 때 사용된다. 윈도우 98은 패스워드를 암호화해서 보내기 때문에 위와 같이 설정해 주어야 한다.(윈도우 98의 레지스트리를 변환하여 플레인 텍스트로 암호를 변하게 할 수도 있다. 그러나, 레지스트리 변환은 항상 위험하다.) 또 윈도우즈 NT 4.0 서비스 팩 3 번 이상인 시스템에서도 마찬가지로 설정을 해주어야 한다.  이렇게 설정을 하고 /etc/smbpasswd파일을 생성을 해주어야 한다.

[smbpasswd 파일 생성]

다음과 같이 생성할 수 있다.

$ cat /etc/passwd | mksmbpasswd.sh > /etc/smbpasswd

기존 유닉스의 패스워드 파일을 삼바 패스워드 파일로 만들어준다. 쉐도우 패스워드를 사용해도 마찬가지이다. 만약 yp(nis) 시스템을 사용한다면 다음과 같이 해주면 된다.

$ ypcat passwd | mksmbpasswd.sh >/etc/smbpasswd

/etc/smbpasswd가 생성이 되었는지 확인해 보자. 현재 패스워드는 기존 계정의 패스워드를 가지고 왔을 것이다. 이것을 변경하기 위해서는 smbpasswd id 로 가능하다.

$ smbpasswd webadmin

New SMB password:

Retype new SMB password:

파일이 제대로 생성되었는지 확인해 보자.

#

# SMB password file.

#

from104:543:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U          ]:LCT-00000000:

alias:524:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U          ]:LCT-00000000:

artsilly:560:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U          ]:LCT-00000000:

redhands:505:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U          ]:LCT-00000000:

webadmin:501:C13A3A0AD12D570279A61CFBC33276FB:3C65A79BFEF44A4A898C37E790D54FE5:[U          ]:LCT-376FE216:홍길동,ICM,

위와 같은 형태로 생성이 되었다면 정상적으로 된 것이다. 일부 버전의 삼바에서 mksmbpasswd.sh가 smbpasswd파일을 정상적으로 생성하지 못하는 버그를 가지고 있으니 설정을 제대로 했음에도 불구하고 로긴을 하지 못한다면 위 패스워드 파일의 형식을 비교해 봐서 다르다면 수정을 하도록 한다.

;  unix password sync = Yes

;  passwd program = /usr/bin/passwd %u

;  passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n

*passwd:*all*authentication*tokens*updated*successfully*

계정의 패스워드를 바꿀 때 삼바의 패스워드도 자동으로 갱신되도록 하고 싶을 때 사용한다. 'encrypt passwords', 'smb passwd file'과 같이 사용해야 한다!

username map = /etc/smbusers

리눅스 사용자 이름과 SMB 사용자 이름이 달라 둘 간의 이름이 다를 때, 이를 매칭 시켜주는 역할을 한다. 기본적으로 윈도우 클라이언트에서 지정한 이름과 리눅스 사용자 이름이 같다면 상관이 없다. 다를 경우 이 파일이 그 사용자임을 알려준다. 형식은 다음과 같다.

/etc/smbusers

# Unix_name = SMB_name1 SMB_name2 ...

root = administrator admin

nobody = guest pcguest smbguest

webadmin = webadmin 홍길동 Hong Gildong

webadmin이라는 계정 사용자 아이디를 webadmin, 홍길동, Hong gildong과 같은 것으로 취급한다. 삼바 서버에 사용하는 계정이 webadmin인데 윈도우에 로긴하는 사용자명은 홍길동이라면 위와 같은 설정을 해주면 같은 사용자로 인식하게 된다. 윈도우에 로긴하는 사용자 명이 다를 때 사용하면 된다.

;   include = /etc/smb.conf.%m

삼바의 설정파일을 접속하는 호스트마다 다르게 설정할 때 사용된다. 완전히 다른 설정을 해야 한다면 옵션을 사용하면 될 것이다.

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

대부분의 경우 다음 옵션을 주면 성능 향상 효과를 볼 수 있습니다. 여러 가지 옵션을 사용할 수 있으나 이 옵션이 가장 빠른 성능을 보여 주였다.

;   interfaces = 192.168.12.2/24 192.168.13.2/24

삼바가 여러 개의 이더넷 카드를 가지고 있는 경우 해당 이더넷을 사용하도록 설정한다. 여러 개의 네트웍 인터페이스를 가지고 있다면, 그 인터페이스들을 모두 기록해주어야 한다. 위의 예는 삼바 서버가 192.168.12.2, 192.168.13.2 이렇게 두 개의 주소를 가지고 있고 24 비트 즉 넷매스크 255.255.255.0 를 사용하여 192.168.12.0, 192.168.13.0 네트웍의 호스트에 대해서 열려 있다는 것이다.

remote browse sync = 210.122.59.255

원격 브라우즈 목록과의 동기화에 관한 설정이다. 위의 설정은 210.122.59.1-254까지의 호스트를 동기화 한다는 설정이다.

remote announce = 210.122.59.255

삼바 서버가 네트웍 상에서 잘 보이지 않는다면 위와 같은 설정을 해주는 것이 좋다. 210.122.59.1-254까지의 호스트들에게 자기 자신을 알리는 역할을 한다.

;   domain master = yes

domain master 는 삼바로 하여금 도메인 마스터 브라우저가 되도록 한다. 삼바는 서브넷으로부터 브라우즈 목록을 모으는 작업을 하게 된다. 이미 이 기능을 담당하고 있는 윈도우즈 NT 도메인 컨트롤러가 있다면 이것을 사용해서는 안된다.

;   domain controller = <NT 도메인 컨트롤러 SMB 이름>

주 도메인 컨트롤러로 설정된 NT 서버가 존재할 때 사용한다.

;   domain logons = yes

삼바가 윈도우즈95 워크스테이션에 대한 도메인 로그온 서버 역할을 하길 원하는 경우에 사용한다. 마찬가지로 이미 NT 서버에서 그 역할을 하고 있다면 사용할 수 없다.

;   wins support = yes

;   wins server = w.x.y.z

;   wins proxy = yes

윈도우즈 인터넷 네임 서비스 WINS 지원을 설정하는 부분이다. 윈도우 95나 98의 경우 외부 네트웍에 존재할 경우 서로의 이름을 찾기 위해서는 WINS를 필요로 하는데 이것을 삼바서버에서 처리해준다. 삼바는 WINS 서버 또는 클라이언트 중 하나만 될 수 있다. 그렇기 때문에 이미 WINS 서버가 구성이 되어 있다면 이것을 사용해서는 안된다. WINS 프록시를 설정하게 되면 삼바로 하여금 WINS 기능을 갖추지 못한 클라이언트를 대신하여 이름에 해당하는 주소를 찾도록 도와준다. 이것을 사용하기 위해서는 당연한 말이겠지만 적어도 한 개 이상의 WINS 서버가 있어야 한다. wins support에 Yes를 했다면, /etc/lmhosts파일에 해당 호스트들의 IP와 도메인을 적어주어야 한다. 형식은 다음과 같다.

/etc/lmhosts

# IP 주소 호스트이름

127.0.0.1 localhost

210.122.59.21 yomyom

210.122.59.28 webdmin

dns proxy = no

삼바 서버를 외부에 제공하지 않는다면 굳이 dns를 사용할 필요는 없을 것이다. 기본값으로 사용하는 것이 바람직하다.

preserve case = yes

short preserve case = yes

삼바 서버에서 대소문자를 사용하기 위한 설정이다. 한글을 제대로 보기 위해서는 이 구분이 필요하며, 각 디렉토리 공유별로 따로 설정이 가능하다.

여기 까지는 삼바의 공통된 설정 세션이었다. 다음부터 나오는 것이 공유를 위한 설정이 된다. 사용자 홈을 공유하고 또는 특정한 작업을 위한 공유를 지정할 수도 있고, 웹 디자이너를 위해서 웹 서비스를 하고 있는 디렉을 공유해서 Ftp나 텔넷을 사용하지 않고 윈도우 클라이언트에서 바로 작업한 내용을 저장할 수 있을 것이다.

② [homes] 부분

[homes]

comment = 홈 디렉토리

browseable = no

writable = yes

사용자 홈 계정에 대한 공유 설정이다. 리눅스 시스템의 사용자 계정과 윈도우 로그인 사용자 계정이 일치 할 때 접근이 허용된다. 그렇지 않을 경우 위에서 설정한 smbusers 파일에서 사용자를 매칭 시켜주어야 한다.

③ [netlogon] 부분

; [netlogon]

;   comment = Network Logon Service

;   path = /home/netlogon

;   guest ok = yes

;   writable = no

;   share modes = no

도메인 로그온을 위한 netlogin 공유 디렉설정이다. 물론 도메인 로그온 기능을 지원할 때만 사용가능하다.

④ [printers] 부분

[printers]

comment = 모든 프린터

path = /var/spool/samba

browseable = no

guest ok = yes

writable = no

printable = yes

BSD 스타일의 프린트 시스템(현재 대부분의 리눅스 시스템)이라면 각각의 프린터를 정의해 줄 필요 없이 위에서 설정한 방식으로 자동으로 이루어 진다. guest ok = yes 라고 하면 'guest account'로 지정한 사용자 여기서는 nobody 들이 프린팅을 할 수 있다.  guest ok = yes를 public = yes로 표시할 수 있다.

⑤ [public] 부분

자 이제부터 하나 하나 공유 설정을 해보도록 하자. 먼저 모든 사용자에게 쓸 수 있는 public 공유를 설정해 보자.

[public]

comment = 공용디렉

path = /public

public = yes

only guest = yes

writable = yes

printable = yes

comment는 공유 디렉에 대한 설명을 줄 수가 있다. path는 공유할 디렉토리를 정의해준다. /public는 소유권이 nobody(위에서 설정한 guest 사용자ID)가 되어 있어야 사용자들이 쓸 수 있다.

$ chown nobody.nobody /public

public = yes가 되어 있기 때문에 모든 사용자에게 이 공유가 접근이 허용된다. writable = yes가 되어 있으므로 모든 사용자가 쓰기 권한이 있다.

다음엔 쓰기 권한은 주지 않고 사용자에게 일방적으로 제공만 하는 공유를 구성해보자. 이런 공유는 자료실 같은 곳으로 활용하면 좋다. 자료를 등록할 수 있는 관리자만 쓰기 권한을 주고 나머지 사용자는 읽기만 가능하게 설정하는 것이다.

⑥ [pds] 부분

[pds]

comment = 자료실

path = /pds

public = yes

아주 간단하게 설정이 된다.

위와 같은 설정이 있다면 자료실에 쓰기 권한 있는 사용자 공유를 하나 만들어야 한다.

⑦ [pdsw] 부분

[pdsw]

comment = 자료실쓰기

path = /pds

valid users = webadmin

public = no

writable = yes

printable = no

create mask = 0765

아까와 다른 것은 valid users = webadmin이 추가되었다는 것이다. 이것이 한 사용자에게만 쓰기 사용권한을 준 것이다.

⑧ [web] 부분

이번엔 웹 디자이너들을 위해서 웹 서버 디렉을 공유 해 보도록 하자.

[web]

comment = Web Server

path = /home/httpd/html

valid users = yomyom urstory

public = no

writable = yes

printable = no

create mask = 0765

위의 설정은 웹 서버를 디자이너의 클라이언트에 열어준 것이다. 해당 디렉터리는 yomyom과 urstory란 사용자에게 쓰기 권한이 있어야 한다. 이렇게 설정을 해놓으면 디자이너들은 자신의 클라이언트에서 바로 웹 서버에 접근해서 파일을 수정하거나 등록할 수가 있다.

여기까지 삼바의 설정은 다 했다고 할 수 있다. 이 설정에 문제가 있는지 체크해 보고 문제가 없다면 삼버서버를 리스타트시켜 보자.

3-3-4. 설정 테스트

삼바 설정을 테스트 할 수 있는 명령어가 있다

$ testparm

을 입력해 보자.

Load smb config files from /etc/smb.conf

Processing section "[homes]"

Processing section "[printers]"

Processing section "[pds]"

Processing section "[public]"

Processing section "[yomyom]"

Processing section "[ftp]"

Processing section "[pdsw]"

Loaded services file OK.

Press enter to see a dump of your service definitions

위와 같이 설정되어 있는 세션을 보여주고 여기서 엔터를 치게 되면 자세하게 설정되어 있는 상황을 출력해준다.

[설정의 전체 출력]

# Global parameters

[global]

workgroup = LINUX

netbios name =

netbios aliases =

server string = 리눅스 삼바 서버

interfaces =

...... 중략 ......

smb passwd file = /etc/smbpasswd

root directory = /

passwd program = /bin/passwd

passwd chat = *old*password* %o\n *new*password* %n\n *new*password* %n\n *changed*

passwd chat debug = No

username map =

...... 중략 ......

[homes]

comment = 홈 디렉토리

read only = No

browseable = No

[printers]

comment = 모든 프린터

path = /var/spool/samba

guest ok = Yes

print ok = Yes

browseable = No

[tmp]

path = /tmp

3-3-5. 에러에 대한 수정

설정 파일에 문제가 있다면 에러 메시지를 출력해 주므로 그 메시지를 참고해서 수정을 해 나가면 된다. 여기까지 설정에 신경을 써 줄 부분이 있다. 대략 세 가지 정도만 살펴보면 된다.

a. encrypt passwords = yes smb passwd file = /etc/smbpasswd

이 부분을 잘못 설정해서 윈도우 클라이언트들에서 로긴을 하지 못하는 상황을 필자는 많이 보아왔다. 이 부분의 설정에 대해서 주의 하자.

b. username map = /etc/smbusers 부분이다.

리눅스 시스템에서의 계정과 윈도우 사용자 이름이 다를 경우 이곳에서 매칭을 시켜주어야 한다.

c. 공유 디렉에 대한 설정을 하고 해당 디렉터리에 사용자 권한이 없으면 쓰기를 할 수가 없다. 이부분을 체크해 보자.

3-4. 삼바의 웹 관리툴 swat

1] inetd 에 swat 등록하기

삼바에는 swat라는 웹 기반의 관리툴이 포함되어 있다. 이것은 /etc/inetd.conf에서 관리하며 접속은 901번 포트를 사용한다. /etc/inetd.conf에서 다음의 줄을 찾아 주석 처리를 없앤다. 만약 다음줄이 없다면 수동으로 넣어주도록 한다.

swat      stream  tcp     nowait.400      root /usr/sbin/swat swat

그리고 /etc/services 파일에 스와트의 포트가 등록되어 있는지 살펴보고 없다면 다음의 라인을 추가해 준다.

swat              901/tcp

위와 같이 수정을 했다면 inetd 데몬을 재시작 해야 한다.

$ killall -HUP inetd

수정을 마쳤다면 웹 브라우저로 http://localhost:901에 접속을 해보자. 사용자 ID와 패스워드를 묻는 창이 나오면 여기에 root와 root의 패스워드로 로긴을 하자. 다음과 같은 화면이 나올 것이다.

2]  swat로 삼바 설정하기

삼바 설정을 여기서도 할 수가 있다. GLOBALS에서는 /etc/smb.conf의 글로벌 섹션에 해당하는 부분의 설정을 고치거나 새로이 할 수 있다. SHARES에서는 /etc/smb.conf의 공유 디렉에 관한 설정을 수정하거나 또는 추가 할 수 있다. PRINTERS에서는 프린터 공유를 설정한다. 여기 까지는 삼바 설정을 웹 상에서 처리하는 부분이다. STATUS에서는 현재 삼바의 상황을 볼 수가 있고, 사용자의 연결을 해제할 수도 있다.

여기서는 삼바 서비스를 중단하거나 연결되어 있는 특정 사용자를 해제 할 수가 있으며 삼바의 전반적인 상태를 표시해준다. 심심하면 kill에 있는 버튼을 하나 골라서 눌러보도록 하자. 바로 사용자가 달려올 것이다. VIEW 항목에서는 /etc/smb.conf 파일에 설정되어 있는 설정 내용을 보여준다. 초기에는 간단하게 출력하며 Full view 버튼을 누르게 되면 자세한 내용을 출력해 준다. 쉘에서 testparm을 친 것과 동일하게 표시된다.

PASSWD 항목에서는 사용자 패스워드를 변경하나 사용자 추가 삭제 등을 할 수가 있다.

/etc/smb.conf 파일을 열어서 수정하는데 힘들다고 생각하는 관리자는 이 swat를 사용하는 것도 한 방편이 될 것이다. 그렇다고 swat를 어디에서나 접속하게 열어두는 것은 좋지 않은 방법이다. hosts.allow를 잘 조정해서 접속할 수 있는 호스트를 지정해 두고 사용하는 것이 좋다.

3-5. 리눅스 클라이언트에서 삼바 활용

1] 공유한 디랙토리의 마운트

서버에서 공유해 놓은 디렉터리를 다른 리눅스 시스템에서 사용하려면 어떤 방법이 좋을까. NFS를 기억하는가? NFS처럼 삼바공유를 마운트해서 사용할 수가 있다. 바로 mount에서 처리가 된다.

$ mount -t smb ftp:/public /mnt/tmp/

/mnt/tmp로 이동해 보면 마운트되어 있는 것을 볼 수 있다. 이 방법을 사용하면 간단하게 자신의 하드처럼 사용하게 된다. 이것은 nfs와 별반 차이를 느끼지 못 할 것이다.

2] smbclient를 사용한 디랙토리 공유

① 공유 정보 알아내기

기존의 smbclient를 이용한 사용법을 익혀보자. smbclient는 ftp클라이언트와 사용법이 비슷하다. 먼저 서버에서 어떠한 공유를 제공하는지 살펴보자 passwd에서 아무것도 입력하지 말고 그냥 엔터를 쳐보자. □-L 서버네임□을 사용하면 볼 수 있다.

$ smbclient -L ftp

Added interface ip=210.122.59.25 bcast=210.122.59.255 nmask=255.255.255.0

Password:

Domain=[ICM] OS=[Unix] Server=[Samba 2.0.5a]

Sharename      Type      Comment

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

pds            Disk      자료실

public         Disk

mini           Disk      꼬마오리꺼□

ftp            Disk

pdsw           Disk      자료실쓰기

IPC$           IPC       IPC Service (ftp)

Server               Comment

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

FTP                  ftp

WHITELOVE            whitelove

Workgroup            Master

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

ICM                  WHITELOVE

② public에 접근해 보기

public에 접근해 보도록 하자. public은 모든 사용자에게 쓰기 권한이 있는 공용 디렉토리로 설정한 상태임을 기억하자.

[root@ds20 source]# smbclient //ftp/public

Added interface ip=210.122.59.25 bcast=210.122.59.255 nmask=255.255.255.0

Password:

Domain=[ICM] OS=[Unix] Server=[Samba 2.0.5a]

smb: \>

ftp는 삼바를 제공하는 서버의 호스트명이며 public가 공용디렉이다. public는 누구나 접근이 허용되어 있으므로 패스워드에 아무것도 입력하지 않아도 로그인이 된다. 로그인 한 상태에서의 명령어는 기본적으로 ftp의 사용법과 아주 유사하다.

③ help 의 사용

사용할수 있는 명령어는 help로 확인이 가능하다.

smb: \> help

ls             dir            du             lcd            cd

pwd            get            mget           put            mput

rename         more           mask           del            open

rm             mkdir          md             rmdir          rd

prompt         recurse        translate      lowercase      print

printmode      queue          cancel         quit           q

exit           newer          archive        tar            blocksize

tarmode        setmode        help           ?              !

본 바와 같이 명령어들은 쉘 명령어와 아주 유사하고 FTP 사용과 비슷한 명령이 많다. 접속을 해제하기 위해서는 exit를 입력하면 된다. 현재 접속한 public는 모든 사용자에게 쓰기 읽기가 허용이 되어 있다는 것을 기억할 것이다. rm으로 파일을 삭제 할 수도 있고 rmdir로 디렉토리도 삭제할 수 있다. 공용의 디렉이기 때문에 파일 소유자가 자신의 것이 아니라면 이런 명령어는 주의해서 사용하도록 하자. 현재 위치를 확인하는 것은 pwd로 확인이 가능하다.

3]  파일 받아오기

ftp처럼 get,mget을 이용해서 파일을 받아올 수 있다. 특정 사용자에게만 허용되어 있는 공유라면 다음과 같은 유저 옵션을 주어서 접속 할 수 있다.

$ smbclient \\\\ftp\\pdsw -U webadmin

webadmin사용자의 패스워드를 입력하게 되면 접속이 이루어 진다.

Added interface ip=210.122.59.25 bcast=210.122.59.255 nmask=255.255.255.0

Password:

Domain=[ICM] OS=[Unix] Server=[Samba 2.0.5a]

pdsw는 webadmin라는 사용자에게만 쓰기 권한이 있는 설정이므로 다른 사용자로 접근이 불가능하다.

$ smbclient \\\\ftp\\sw

Added interface ip=210.122.59.25 bcast=210.122.59.255 nmask=255.255.255.0

Password:

Domain=[ICM] OS=[Unix] Server=[Samba 2.0.5a]

tree connect failed: ERRSRV - ERRbadpw (Bad password - name/password pair in a Tree Connect or Session Setup are invalid.)

서버에 있는 파일을 다운로드 해보자

smb: \드라이버\> ls

.                                   D        0  Wed Jun 23 11:22:17 1999

..                                  D        0  Wed Aug 11 04:11:18 1999

bios                                D        0  Thu Mar 18 18:03:17 1999

mouse                               D        0  Mon Feb 22 02:35:18 1999

sound                               D        0  Tue Mar 16 04:39:41 1999

vga                                 D        0  Sun May 30 19:49:05 1999

1-Monitor.zip                       A    53114  Wed Jun 23 11:27:04 1999

monitor                             D        0  Wed Jun 23 11:22:33 1999

37763 blocks of size 131072. 9950 blocks available

smb: \드라이버\> get 1-Monitor.zip

getting file 1-Monitor.zip of size 53114 as 1-Monitor.zip (563.794 kb/s) (average 563.795 kb/s)

로컬 드라이브를 확인해 보면 받아진 파일이 보일 것이다. 반대로 파일을 업로드 할떄는 put을 사용한다.

4] 윈도우즈의 프린터 이용하기

앞쪽의 기본 설정에 소개해 놓은 것은 리눅스의 프린터를 윈도우즈에서 사용하는 방법이었다. 물론, 그 경우 리눅스의 프린터 설정이 완벽하게 되어 있다는 것을 전제로 한다. 이번에는 smbclient를 이용해서 윈도우 클라이언트에 설치되어 있는 프린터를 이용해 보자.

a. 기본적인 사용법

$ smbclient \\\\yomyom\\hp -P -N

smb: \> put t

putting file t as \t (71.4717 kb/s) (average 71.4722 kb/s)

-N은 패스워드를 묻지 말라는 것이며 -P는 프린터로의 접속을 의미한다.

b. 스크립트의 사용

다음의 스크립트를 만들어서 사용하면 프린터를 쉽게 할 수가 있다. slpr이름의 파일을 다음과 같이 작성하고 /usr/bin같은 곳에 둔다.

#!/bin/bash

if($#argv == 0) then

cat - > /tmp/smblpr$$

echo "print /tmp/smblpr$$" | \

/usr/bin/smbclient '\\\\yomyom\\hp' -N -P

rm /tmp/smblpr$$

else

echo "print $1" | /usr/bin/smbclient '\\\\yomyom\\hp' -N -P

endif

yomyom은 프린터가 설치되어 있는 윈도우 클라이언트 이름이며, hp는 설치되어 있는 프린터 이름이다. 자신의 시스템에 맞게 수정하도록 한다.

c. 고스트스트립트 프린트

다음은 고스트스크립트를 프린트하기 위한 스크립트 파일이다. gslpr의 이름으로 다음과 같이 작성한 후 /usr/bin에 둔다.

#!/bin/bash

gs -r300dpi -sDEVICE=laserjet -sPAPERSIZE=a4 -q -sOUTPUTFILE=\|/usr/bin/slpr $1 <<^

quit

^

리눅스용 한글에서도 위 스크립트를 이용해서 프린팅을 하면 제대로 된 출력물을 얻어낼 수 있다.

[간단한 명령어 정리]

윈도우즈의 사용가능한 공유 확인 : /usr/sbin/smbclient -L host

윈도우즈 드라이버 공유 : /usr/sbin/smbclient service <password>

윈도우즈 프린터 사용 :

/usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P

[참고 문서]

제 3 회 리눅스 공동체 세미나 H 세션  박상완, SMB_Printer-KLDP   방 창현  신 동원

NT 도메인에 삼바 참여시키기   조 용준, SMB HOWTO   이 창한, NFS Root mini HOWTO   정 순철

NIS HOWTO   김 형찬, inux Gazette 24호   권 순선, ProFTPd Reference   김 정균

ProFTPd Korean User Group, Wu ftpd 매뉴얼 페이지   김 정균