1. samba 설치
윈도우와의 공유를 위해서 samba를 설치한다. samba 설정 파일에서 사용자 계정마다 자신의 홈디렉토리에 사용을 하게 할 수도 있고 공용 디렉토리를 두어서 그 쪽은 모든 사용자가 같이 사용을 할 수도 있다. 또한 samba를 이용하여 프린터를 설치할 수도 있다. LS2에서도 기본적으로 USB를 지원하는 프린터라면 네트워크로 설치가 가능하기 때문에 LS2에서 지원하는 프린터라면 설치가 가능하리라 본다. 다만 FreeLink의 커널이 2.4.20이므로 설치가 가능한 프린터가 어떤 것이 있는지 사전에 알아볼 필요는 있다. 필자는 프린터가 없기 때문에 그 부분은 확인하지 않았다.
samba 서버 설치는 다음과 같이 하면 된다.
apt-get install samba smbfs
설치시 몇가지를 물어보는데 필자가 설정한 방법은 다음과 같다.
작업그룹 설정 WORKGROUP - 필자의 작업그룹이다.
비밀번호 암호화 YES : 암호화 하지 않으면 윈도우와 연결이 되지 않는다.
WINS 설정 NO : WINS를 사용하지 않으므로 NO로 했다.
데몬설정 데몬(Standalone) : inetd로서 설정할 수 있지만 standalone 방식을 권한다.
samba 비밀번호 데이타베이스 생성 yes : 각각의 계정 사용자에게 홈 디렉토리를 접속하게 하려면 만들어야 한다.
데이타베이스 파일은 /etc/samba/smbpasswd 로 생성된다. samba 의 계정별 비밀번호는 시스템의 비밀 번호를 사용하지 않고 독자적으로 사용한다. 이 비밀번호는 smbpasswd로 설정을 해주어여 한다.
사용자 추가는 smbpasswd -a 계정 으로 하면 된다. 단 계정은 실제 리눅스에 존재해야 한다. /etc/samba/smbpasswd에 존재하는 사용자라면 비밀번호 변경이 된다.
man smbpasswd로 다른 옵션도 파악해두길 바란다.
samba 설치가 끝나면 /etc/services 파일에서 아래 항목이 있는지 확인한다.
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
이제 samba 설정을 해보자. /etc/samba/smb.conf 가 설정 파일이다. LS2의 기본 펌웨어와 같이 동작을 하게 설정을 해보았다.
[global]
log file = /var/log/samba/log.%m
socket options = TCP_NODELAY
null passwords = yes
hide dot files = Yes
encrypt passwords = yes
public = yes
veto files = /.?*/
dns proxy = no
server string = MYSTORE
invalid users = root
workgroup = WORKGROUP
os level = 20
syslog = 0
security = share
panic action = /usr/share/samba/panic-action %d
dont descend = /proc,/dev
max log size = 1000
unix charset = cp949
dos charset = cp949
display charset = cp949
[homes]
comment = Home Directories
browseable = no
writable = no
create mask = 0700
directory mask = 0700
valid users = %S
[printers]
comment = All Printers
browseable = no
path = /var/spool/samba
printable = yes
public = no
writable = no
create mode = 0700
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
browseable = yes
read only = yes
guest ok = no
[share]
comment = LINKSTATION SHARE
writable = yes
path = /mnt/hda/share
samba 버전이 올라가면서 몇가지 설정이 바뀌었는데 그 중 대표적인 것이 캐릭터 셋이다. 필자의 LS2의 언어 설정은 euc_kr이다. UTF8을 선호하지만 아직 과도기이므로 이 설정을 적용하면 별다른 문제없이 LS2와 윈도우 모두에서 사용가능하다.
unix charset = cp949
dos charset = cp949
display charset = cp949
그리고 LS2 원 펌웨어처럼 사용하기 위해서 share 항목을 위와 같이 설정을 하였다. /mnt/hda/share 에 삼바로 접근시 계정/암호가 필요없으며 nobody/nogroup의 소유권이 주어지게 된다.
2. proftpd 설치
특별히 선호하는 ftp 데몬은 없지만 이전부터 사용해왔다는 이유만으로 proftpd를 설치한다.
단순히 설치를 한다면
apt-get install proftpd 으로 하면 된다. 필자의 경우는 mysql을 이용한 가상유저를 사용하기 때문에 이렇게 설치를 했다.
apt-get install proftpd proftpd-mysql
ftp 사용자를 시스템 계정으로 만들어 주는 것이 아니라 mysql 데이타베이스에 등록시켜서 관리하고 있다. 이 방법의 장점은 시스템에 계정을 만들어 주지 않기 때문에 관리의 편의성과 보안문제의 장점을 가지고 있다. 단점으로는 계정의 비밀번호 변경이 ftp 클라이언트를 사용해서 변경이 불가능하다는 것이다.. 따로 웹페이지를 만들어서 계정의 비밀번호를 변경하게 햐야 하는 점이 단점이라면 단점이다.
필자의 경우 따로 ftp 사용자 테이블을 만들어서 관리를 하고 있지만 편리성을 생각한다면 제로보드와 같이 널리 알려진 게시판을 이용하여 사용자 등록을 받고 그 게시판과 ftp의 사용자가 같게 만들수 있다. 그렇게 한다면, 회원관리의 문제에 있어서 편리할 것이라고 생각된다.
설치는 apt-get install proftpd proftpd-mysql 로 한다.
사전에 ftp 사용자 테이블을 만들어 두거나, 제로보드등이 이미 설치되어 있어야 한다.
ftp 사용자 테이블의 구조는 다음과 같다. users라는 테이블로 기본이름이 users로 되어 있으나 수정가능하다. 필드명과 default값도 수정가능하다.
이 외에 groups, accesslog, downfilehistory , upfilehistory 와 같은 4가지 테이블을 더 만들 수 있으나, 없어도 상관없다. 제목만 봐도 무얼 하는 테이블인지는 알 수 있을 것이다.
필드를 설명하자면 uid 는 user id 이다. 유닉스는 파일과 디렉토리에 소유권을 부여하고 있다. 당연히 ftp로 접속후 업로드한 파일에도 소유권이 부여된다. 유닉스 쉘에서 id 계정명 하면 uid와 gid가 나오는 것을 볼 수 있을 것이다. uid는 숫자로 입력하면 된다. 단 uid는 1000 이상을 사용해야 한다. 기본적으로 1000번 이하의 uid는 시스템에서 사용하고 있을 가능성이 높기 때문이다. 필자는 3000번부터 시작하였다.
gid는 group id로 마찬가지다. groups테이블을 만든다면 따로 그룹마다 권한을 줄 수 있다. 필자는 사용하지는 않았다.
shell 은 ftp 접속후 사용하는 쉘이다. /bin/sh 를 사용하게 설정하였다.
homedir 은 ftp 접속후 나오는 디렉토리이다. 각각의 user마다 따로 줄수도 있지만 필자의 FTP 사용목적이 공용폴더에서 같이 쓰는 것을 목적으로 하기에 /home/ftp/pub를 기본으로 사용하게 하였다. 이게 설정이 안되어 있다면 접속이 거부된다.
count 는 얼마나 접속했는지를 기록하는 필드이다. /etc/proftpd/proftpd.conf에서 설정을 한다. 굳이 로드를 주고 싶지 않아서 필자는 설정을 하지않고 사용하고 있다.
vaild 이다. 이 값이 1이면 접속이 가능하고 0이면 불가능하다. 임시로 접속을 막고 싶을 때 사용한다.
필자의 /etc/proftpd/proftpd.conf 이다.
처음 설정시 수정해야 할 부분은 다음과 같다.
UseIPv6 off 현재 사용하는 IP체계에 따라서 설정을 Off 한다.
TimesGMT off 국내는 GMT 시간 설정을 사용하지 않으므로 이렇게 합니다. 서버 시간과 FTP에 올린 파일 생성시간이 +9시간 차이가 난다면 이렇게 수정한다.
디비와의 연동 설정이다.
SQLConnectInfo 디비이름@localhost 사용자 암호
SQLAuthTypes Backend (mysql password 함수를 사용한다)
SQLAuthenticate users
SQLUserInfo users userid passwd uid gid homedir shell (테이블명, 사용자아이디, 비번 순이다.)
SQLUserWhereClause "valid=1"
SQLDefaultHomeDir /home/ftp/pub
접속 설정이다. 동시 접속을 6명으로 제한하고, 한사람이 2개 이상의 접속을 못하게 하였다.
MaxClients 6 "Sorry, the maximum number of allowed users are already connected"
MaxClientsPerHost 2 "Sorry, You may not connect more than two time"
MaxHostsPerUser 2 "Sorry, %m hosts allow per one users"
FXP 는 일명 서버 투 서버 라고 불리우며 서버간의 파일 전송을 가능하게 하는 서비스를 설정한다. ftp에서 ftp 바로 전송이 가능하게 해주는 것이다.
AllowForeignAddress on
패시브 포트를 열어주었다.
PassivePorts 49152 65534
이동가능한 디렉토리를 자신의 home으로만 지정한다.
DefaultRoot ~
이어올리기 기능 설정
AllowOverwrite on
AlowRetrieveRestart on
AllowStoreRestart on
-----------------------------------
#
# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
# To really apply changes reload proftpd after modifications.
#
# Includes DSO modules
Include /etc/proftpd/modules.conf
# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6 off
ServerName "LINKSTATION"
ServerType standalone
deferWelcome off
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
DefaulttransferMode binary
TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200
DisplayLogin .welcome.msg
DisplayFirstChdir .message
ListOptions "-l"
DenyFilter \*.*/
# Port 21 is the standard FTP port.
Port 21
# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
# PassivePorts 49152 65534
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances 30
# Set the user and group that the server normally runs at.
User proftpd
Group nogroup
# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask 022 022
# Normally, we want files to be overwriteable.
AllowOverwrite on
# Uncomment this if you are using NIS or LDAP to retrieve passwords:
# PersistentPasswd off
# Be warned: use of this directive impacts CPU average load!
#
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
# UseSendFile off
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log
TimesGMT off
UseReverseDNS off
IdentLookups off
# Set SQL
SQLConnectInfo
SQLAuthTypes Backend
SQLAuthenticate users
SQLUserInfo users userid passwd uid gid homedir shell
SQLUserWhereClause "valid=1"
SQLDefaultHomeDir /home/ftp/pub
MaxClients 6 "Sorry, the maximum number of allowed users are already connected"
MaxClientsPerHost 2 "Sorry, You may not connect more than two time"
MaxHostsPerUser 2 "Sorry, %m hosts allow per one users"
RequireValidShell off
# Enable FXP
AllowForeignAddress on
PassivePorts 49152 65534
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~
# Normally, we want files to be overwriteable.
AllowOverwrite on
# Allow resume
AllowRetrieveRestart on
AllowStoreRestart on
TimeoutIdle 60
TimeoutNoTransfer 60
TimeoutLogin 60
<IfModule mod_tls.c>
TLSEngine off
</IfModule>
<IfModule mod_quota.c>
QuotaEngine on
</IfModule>
<IfModule mod_ratio.c>
Ratios on
</IfModule>
# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
# It is on by default.
<IfModule mod_delay.c>
DelayEngine on
</IfModule>
<IfModule mod_ctrls.c>
ControlsEngine on
ControlsMaxClients 2
ControlsLog /var/log/proftpd/controls.log
ControlsInterval 5
ControlsSocket /var/run/proftpd/proftpd.sock
</IfModule>
<IfModule mod_ctrls_admin.c>
-----------------------------------
/etc/proftpd/proftpd.conf 설정 수정후 /etc/proftpd/modules.conf에서
LoadModule mod_sql_postgres.c 주석 처리한다.
/home/ftp/pub 디렉토리를 만들고 chmod 777 /home/ftp/pub 로 권한을 준다.. 그리고 777권한일 경우 다른 계정이 올린 파일을 지울 수가 있으므로 chmod +t pub로 sticky bit를 주어서 다른 계정이 올린 파일을 삭제하지 못하도록 한다.
/etc/logrotate.d/proftpd 파일을 생성하여 아래와 같이 작성해준다. ftp 로그파일이 커지지 못하도록 하는 것이다.
/var/log/proftpd/*.log {
rotate 4
daily
compress
missingok
notifempty
}
/var/log/proftpd/xferlog {
rotate 4
daily
compress
missingok
notifempty
}
FTP 서버의 파일 시간이 GMT를 off 했는데도 정확히 맞지 않는다면 /etc/init.d/proftpd 의 첫줄에 export TZ=":/etc/localtime" 를 추가한다.
이제 ftp를 재 시작하면 디비에 등록되어 있는 사용자로 접근이 가능할 것이다.
/etc/init.d/proftpd start로 시작시
Starting ftp server: proftpd - IPv4 getaddrinfo 'LINKSTATION' error: Name or service not known
- warning: unable to determine IP address of 'LINKSTATION'
- error: no valid servers configured
- Fatal: error processing configuration file '/etc/proftpd/proftpd.conf'
failed!
invoke-rc.d: initscript proftpd, action "start" failed.
dpkg: error processing proftpd (--configure):
subprocess post-installation script returned error exit status 1
Errors were encountered while processing:
proftpd
E: Sub-process /usr/bin/dpkg returned an error code (1)
이런 에러가 나면서 실행이 안된다면
/etc/hosts 을 이렇게 수정하도록 한다.
127.0.0.1 localhost.localdomain LINKSTATION
여기서 LINKSTATION은 /etc/hostname 파일에 있는 이름이다. 참조해서 고치도록 한다.
3. 제로보드와 proftp, mysql 연동하기
기본적으로 위의 사항과 같다. 단 수정할 것이 몇가지 있다.
먼저 제로보드를 설치한다. 이미 설치되어 있다면 다른 데이타베이스를 만들고 사용할 것을 권한다. 물론 제로보드도 다른 디렉토리에 설치하는 것이 좋다. 왜냐하면 제로보드의 회원 테이블에는 uid, gid, homedir, shell을 지정해 줄 필드가 없기 때문이다.
그래서 필자는 uid, gid, homedir, shell을 zetyx_member_table에서 no, group_no, icq, aol을 각각 대응하게 사용하였다.
최초 설치후 쉘 상에서 mysql에 접속한다. use 데이타베이스명 을 이용하여 이동후 제로보드가 설치된 데이타베이스로 이송후
ALTER TABLE zetyx_member_table AUTO_INCREMENT = 3000;
ALTER TABLE zetyx_group_table AUTO_INCREMENT = 3000;
위의 두가지 명령을 준다. 이 명령은 zetyx_member_table, zetyx_group_table 의 no 필드값이 3000번부터 입력되게 하는 것이다.
1000번이상이면 다른 값을 주어도 상관없다.
또한 icq와 aol의 기본 값을 바꾼다.
alter table zetyx_member_table change icq icq char(20) default '/home/ftp/pub';
alter table zetyx_member_table change aol aol char(20) default '/bin/sh';
그리고 제로보드 관리자에서 가입폼 icq와 aol을 입력하지 못하게 막아 놓는다.
또한
alter table zetyx_member_table change open_icq open_icq charr(20) default '0';
alter table zetyx_member_table change open_aol open_aol charr(20) default '0';
로 변경해준다.
그리고 member_join_ok.php 파일에서 아래 항목과 같이 고친다. $icq, $aol, $open_icq, $open_aol을 ''으로 변경하였다.
mysql_query("insert into $member_table (level,group_no,user_id,password,name,email,homepage,icq,aol,msn,jumin,comment,job,hobby,home_address,home_tel,office_address,office_tel,handphone,mailing,birth,reg_date,openinfo,open_email,open_homepage,open_icq,open_msn,open_comment,open_job,open_hobby,open_home_address,open_home_tel,open_office_address,open_office_tel,open_handphone,open_birth,open_picture,picture,open_aol) values ('$group_data[join_level]','$group_data[no]','$user_id',password('$password'),'$name','$email','$homepage','','','$msn',password('$jumin'),'$comment','$job','$hobby','$home_address','$home_tel','$office_address','$office_tel','$handphone','$mailing','$birth','$reg_date','$openinfo','$open_email','$open_homepage','','$open_msn','$open_comment','$open_job','$open_hobby','$open_home_address','$open_home_tel','$open_office_address','$open_office_tel','$open_handphone','$open_birth','$open_picture','$picture_name','')") or error("회원 데이타 입력시 에러가 발생했습니다<br>".mysql_error());
이제 제로보드의 일반적인 사용과 같이 하면 된다.
필자는 레벨 9이상인 회원만 ftp에 접속가능하게 해보았다. 회원별로 레벨을 준다면 레벨이 정해진 회원만 접근 가능하다.
/etc/proftpd/proftpd.conf 의 설정은 다음과 같이 고친다.
SQLConnectInfo 데이타베이스명@localhost 사용자 암호
SQLAuthTypes Backend
SQLAuthenticate users
SQLUserInfo zetyx_member_table user_id password no group_no icq aol
SQLDefaultHomeDir /home/ftp/pub
SQLUserWhereClause "level<10"