파일서버(네트워크 공유)구축하기 - FreeBSD13, Samba4
페이지 정보
작성자 상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 에필로그 댓글 12건 조회 205,569회 작성일 23-01-28 21:00본문
Windows나 Windows Server로 공유폴더를 운영하는 데에 랜섬웨어 피해가 잦다.
보안에 취약한 설정과 그 이용 방법을 따른 데다가 공유폴더는 랜섬웨어의 주요 타켓인 탓이다.
또한 백업은 왜 그리 간과되는지 모르겠다.
회사에서 월급을 얼마나 탄다고 압박에 똥줄타던 전산담당 직원이 자기 돈으로 0.5BTC를 사서보낸 건에는 그저 무력감이 들 수밖에 없었다.
이참에 Windows로 하는 공유폴더 파일서버는 단 한 대라도 줄인다.
NAS는 대게 임베디드 기기라 성능이 떨어지며 불필요한 서비스들이 있다.
RedHat계열 리눅스는 CentOS가 그리된 후 아직 자리를 못잡았다.
Ubuntu는 최근 22.04에 실망했다.
하여 꾸준하며 안정성이 좋은 FreeBSD로 파일서버(SMB/CIFS)를 구축한다.
여태까지 공급한 이 서버의 댓수가 적다면 적고 많다면 그런 편이지만 랜섬웨어에 당한 적은 없다.
저용량 SSD(운영체제/UFS)와 고용량 HDD(데이터/ZFS)가 1개씩은 최소로 있어야 한다.
컴잘알못도 직접 따라할 수 있도록 안내한다.
1. 설치 미디어로 부팅한다.
2. 기본 키보드로 한다.
3. 호스트 이름을 짓는다.
4. 포트와 소스를 스페이스 키로 선택하여 추가한다.
5. 운영체제 설치 디스크의 파일시스템은 UFS로 한다.
6. 디스크의 나열 순서은 메인보드의 포트 순서이다.
7. 단일 운영체제가 바람직하다.
8. 기존에 뭔 데이터들이 있었으면 지워도 되는지 한 번 생각한다.
9. 메인보드의 공장 초기가 BIOS이면 MBR, UEFI라면 GPT를 선택한다.
10. 수동으로 파티션할 이유가 없다.
11. 기존 디스크의 내용을 지워도 되는지 확인이다.
12. 설치중인 모습이다.
13. root 암호를 설정한다. 입력은 나타나지 않는다.
14. 네트워크 어댑터 나열 순서는 메인보드에 따르며 랜선이 꼽혀있는 것을 선택한다.
15. 거이 모든 네트워크가 IPv4이다.
16. 대체로 서버는 유동 IP로 운영하지 않는다.
17. 네트워크 어댑터에 고정 IP를 설정한다.
18. IPv6은 필요없다.
19. 네임서버는 아무거나 써도 상관없으나 가급적 이용하고 있는 ISP 것을 넣는다.
20. 메인보드 시간을 UTC로 할 필요는 없다.
21. 로컬 시간설정1
22. 로컬 시간설정2
23. 로컬 시간을 KST로 설정한다.
24. 운영체제 배포 기준은 UTC이므로 시간대에 따라서 하루가 더 빠르게 나타날 수 있다. *화살표 키로 날짜를 맞추고 Set Date 한다.
25. 시간도 위와 마찬가지이다.
26. 일단 기본으로 선택된 것만 있으면 된다.
26. SMTP를 써야 할 환경이 아니며 /tmp는 비우는 게 좋다. *스페이스바로 선택한다.
27. root 외 운영 및 관리자용 계정을 따로 만든다.
28. 관리자 계정 이름을 짓는다.
29. 입력하는 데 말고는 기본으로 선택된 것에 ↵(그냥 엔터)이다.
30. 관리자 계정을 wheel 그룹에 추가한다. *wheel은 Windows에 Administrators 그룹과 같은 거다.
31. 암호를 설정한다.
32. 계정 생성을 마친다.
33. 운영체제 설치에 따른 관련 설정을 마친다.
34. 설정을 끝냈으니 수정할 필요없다.
35. 재부팅시키고 설치 미디어(USB 또는 DVD)를 뺀다.
36. 부팅되면 콘솔에서 root로 로그인한다.
37. ee 편집기로 SSH설정에 들어간다. *vi로 해도 된다.
38. SSH 포트를 바꾼다. *#(주석)을 지우고 SSH임을 유추할 수 없는 숫자가 좋다.
39. PermitRootLogin no 줄의 주석을 지워 root 로그인을 막고 관리자 계정만 SSH에 접속할 수 있도록 아래처럼 추가한다.
40. 빈암호는 허용하지 않는다. *굳이 키로 로그인할 필요없다.
41. sFTP는 일단 이용할 필요가 없으니 주석을 단다.
42. ee 편집기를 마감할 때는 esc 키를 누른다. *a)leave editor 메뉴가 편집기 종료이다.
43. a)save changes 를 선택해야 설정한 게 저장된다. *이후, ee 편집기의 사용법은 이와 같다.
44. SSH를 재시작하여 변경된 설정을 서비스되도록 한다. *콘솔에서 logout을 입력하고 나온다.
45. PuTTY같은 터미널 툴로 서버에 다시 접속해서 문자셋을 설정하러 간다. *su를 입력하여 root로 전환한다.
46. 서버의 언어 인더페이스를 한국어로 설정한다.
47. esc 키를 누르면 관련 메뉴가 나온다. *커서가 a)leave editor에 기본으로 선택돼 있으니 ↵(그냥 엔터)이다.
48. ↵(엔터)로 저장한다.
49. 서버를 재시작한다.
50. 다시 로그인하여 문자셋이 UTF-8로 나오는지 본다.
51. FreeBSD 업데이트 패치를 가져온다. *su를 입력하여 이하, root 권한으로 한다.
52. FreeBSD 업데이트를 설치한 후 최신 포트컬렉션을 가져와서 푼다. *포트는 바이너리와 패키지의 합본이다.
53. 포트에서 이용가능한 samba 버전을 확인하고 해당 디렉터리로 가서 옵션을 확인한다. *최근 것 samba는 그냥 베타라고 보면 된다.
54. 이런 옵션으로 컴파일된다는 것만 확인하고 make BATCH=yes install clean 을 입력한다. *최초 설치이므로 디펜던시들 때문에 1시간 가량 걸릴 수 있다.
55. sysrc zfs_enable=YES를 입력하여 zfs를 사용할 수 있도록 한다. */etc/rc.conf에 추가된다.
56. geom disk list를 입력해서 장착된 디스크들을 확인한다. *ada0, ada1가 나온다.
57. zpool create data /dev/ada1을 입력하여 ada1을 data라는 풀을 만든다. *data는 알아서 짓는 풀 이름이다.
58. df -HT를 입력하여 제 용량이 나오는지 확인한다.
59. pw groupadd -n share를 입력하여 share라는 그룹을 하나 만든다. *share는 역시 알아서 짓는 그룹 이름이다.
60. mkdir /data/share를 입력해서 공유에 사용할 share라는 디렉터리를 하나 만든다. *share 또한 알아서 짓는 디렉터리 이름이다.
61. chown :share /data/share && chmod 770 /data/share를 입력하여 share 디렉터리 권한은 조정한다.
62. ee /usr/local/etc/smb4.conf를 입력하여 다음 내용으로 samba 설정 파일을 만든다.
[global]
workgroup = WORKGROUP
netbios name = fileServer
server string = Samba %v
server min protocol = SMB2
client min protocol = SMB2
security = user
encrypt passwords = Yes
passdb backend = smbpasswd
guest ok = No
socket options = TCP_NODELAY IPTOS_LOWDELAY IPTOS_THROUGHPUT SO_KEEPALIVE SO_RCVBUF=65536 SO_SNDBUF=65536
aio read size = 16384
aio write size = 16384
strict locking = No
strict sync = No
log level = 3
log file = /var/log/samba4/log.%m
max log size = 0
unix charset = UTF-8
dos charset = CP949
hide files = /Thumbs.db/._*/.DS_Store/:2eDS_Store/desktop.ini/DESKTOP.INI/*.tmp/:2eTemporaryItems/.TemporaryItems/Temporary Items/Network Trash Folder/TheFindByContentFolder/TheVolumeSettingsFolder/.VolumeIcon.icns/Icon?/.FBCIndex/.FBCLockFolder/.AppleDB/.AppleDesktop/.AppleDouble/
hide dot files = Yes
veto files = /lost+found/
delete veto files = Yes
local master = No
dns proxy = No
wins support = Yes
idmap config * : backend = tdb
map archive = No
unix extensions = No
store dos attributes = Yes
map acl inherit = Yes
nt acl support = Yes
inherit acls = No
inherit owner = No
directory mask = 0770
create mask = 0660
posix locking = Yes
load printers = No
disable spoolss = Yes
show add printer wizard = No
vfs objects = full_audit
full_audit:prefix = %u|%I
full_audit:success = unlinkat
[share]
comment = share
path = /data/share
read list = @share
write list = @share
read only = No
63. 위, smb4.conf 부연
-. Windows, OSX 혼용 환경을 반영했다.
-. hide files = /Thumbs.db/._*/.DS_Store/부터 /.AppleDesktop/.AppleDouble/까지는 1줄이다.
-. 디렉터리, 파일의 삭제만 syslog로 로깅한다. *생성, 나열, 읽기, 전송, 수정 등은 로그 부담으로 로깅하지 않고 만약을 위한 것(악의적인 행위)만이다.
64. sysrc samba_server_enable=YES를 입력하여 samba를 시작에 등록한다.
65. service samba_server start로 samba 파일서비스를 시작한다.
66. adduser로 FreeBSD 사용자를 아래처럼 만든 후 pdbedit로 samba에 등록한다. *아래 eel은 역시 알아서 짓는 사용자명이다. 꼭 share 그룹에도 넣어줘야 한다.
*네트워크 공유폴더를 이용하는 사용자들을 계속 이렇게 추가한다.
67. ee /etc/newsyslog.conf해서 messages의 Count 수를 조정한다. *공유에서 디렉터리와 파일 삭제를 기록한 로그파일의 저장 개수이다.
68. 로그 로테이션을 설치한다.
cd /usr/ports/sysutils/logrotate
make install clean
cp /usr/local/etc/logrotate.conf.sample /usr/local/etc/logrotate.conf
ee /usr/local/etc/logrotate.conf *다음처럼 주석한다.
ee /etc/crontab 해서 0 0 * * * root /usr/local/sbin/logrotate /usr/local/etc/logrotate.conf > /dev/null 2>&1 줄을 추가한다.
69. ee /usr/local/etc/logrotate.d/samba4 해서 다음 내용을 넣는다. *삼바 로그순환 설정이다.
/var/log/samba4/log.* {
monthly
rotate 10
create
nocompress
missingok
sharedscripts
notifempty
endscript
}
70. ee /etc/crontab 해서 다음 두 줄을 추가한다. *zfs 스냅샷 자동 생성과 삭제이다. data는 앞에서 임의로 지었던 풀이름이며 90일치 유지이다.
0 12 * * * root /sbin/zfs snapshot data@`date +\%Y-\%m-\%d` > /dev/null
0 11 * * * root /sbin/zfs destroy data@`date -d -90days +\%Y-\%m-\%d` > /dev/null
71. 방화벽을 구성한다. *ipfw로 한다.
sysrc firewall_enable=YES
sysrc firewall_type=/etc/ipfw.rules
ee /etc/ipfw.rules *다음 4줄을 넣는다. 41722은 바꾼 SSH 포트이다.
add allow tcp from any to me 41722 setup keep-state
add allow tcp from any to any 139,445 setup keep-state
add allow udp from any to any 137,138 keep-state
add deny all from any to any
72. reboot를 입력하여 서버를 재시작한다.
73. Windows 탐색기 바로가기 주소란에 \\서버주소 또는 file://서버주소 식으로 입력한다.
74. 로그인한다.
75. 공유 디렉터리가 나와야 한다.
76. 파일을 업로드, 삭제, 다운로드, 폴더 생성과 삭제 등을 테스트한다.
끝, 세부적이고 소소한 것들은 댓글에 있는지 찾아본다.
댓글목록
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일OSX에서 접속은 Command + K 해서 띄운 창의 주소란에 smb://서버주소 입력하고 연결이다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
Windows에서 접속 끊을 때는 실행이나 명령프롬프트 창에서 다음을 입력한다.
net use \\서버주소 /d
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
서버를 운영하다 보면 시간이 틀려진다.
위는 외부 NTP와 동기화하지 않도록 돼 있어서다.
NTP서비스를 넣거나 NTP클라이언트가 될 필요가 굳이 없으며 ipfw 방화벽에서도 막혔다.
시간은 가끔 수동으로 맞춘다.
date를 입력하여 시간을 확인한다.
예를 들어서 2023년 01월 28일 오후 6시 52분으로 맞추고 싶다면 다음처럼 입력한다.
date 2301281852
즉, date yymmddhhMM 형식이다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
vfs objects = full_audit zfsacl
smb4.conf에서 이 옵션은 samba 계정간에 파일 덮어쓰기가 안 된다.
이게 유용할 수도 아니기도 하니 참고로 한다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
smb4.conf에서,
full_audit:success나 full_audit:failure 설정 예는,
full_audit:success = open opendir pwrite real unlink
full_audit:failure = all
full_audit:success = open opendir pwrite real unlink
full_audit:failure = none
full_audit:success = open opendir pwrite real unlink
full_audit:failure = all !open
등 이다.
Samba User Activity 에는 chdir chmod chown close closedir connect disconnect fchmod fchown file ftruncate link linkat lock mkdir mkdirat mknod rmdir open opendir pread pwrite read readlink realpath rename sendfile symlink unlink unlinkat write 등이 있으며 로그파일이 매우 커질 수 있으므로 적용에 유의를 한다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
server max protocol = SMB3
server min protocol = SMB2_10
client max protocol = SMB3
client min protocol = SMB2_10
client ipc max protocol = SMB3
client ipc min protocol = SMB2_10
smb4.conf에 이런 옵션을 넣어서 클라이언트 접속을 제한할 수 있다.
자세한 것은 https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html#CLIENTMAXPROTOCOL 참고한다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
스냅샷을 만들 때는 예를 들어서,
zfs snapshot data@2023-01-27 식으로 입력한다.
data는 풀 이름이다.
2023-01-27은 그냥 구분하기 위해서 임의로 붙인거다.
zfs list -t snapshot *스냅샷 목록 조회다.
zfs rollback data@2023-01-27 *2023년 01월 27일치로 돌린다.
zfs rollback -r data@2023-01-24 *25일, 26일치를 건너뛰고 24일거로 돌린다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
공유 사용자 관리 *예를 들어 eel 라는 계정
암호 변경은,
smbpasswd -U eel
목록은,
pdbedit -L
삭제는,
pdbedit -x -u eel
서버에서도 삭제는,
pw userdel -n eel
rm -rf /home/eel
이다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일서버 종료는 poweroff 또는 init 0 이다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
vfs objects의 로깅은 samba 로그와 별개로 /var/log/messages에 한다.
언제, 누가, 뭘 삭제했는지 확인은 의외로 가끔 생겨서,
vfs objects = full_audit
full_audit:prefix = %u|%I
full_audit:success = unlinkat
을 넣은 거다.
필요없다면 지우거나 주석을 달고 /etc/newsyslog.conf도 수정하지 않는다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
FreeBSD 방화벽으로 pf, ipfilter, ipfw을 커널 모듈로 로드할 수 있다.
pf나 ipfilter에 더 익숙하다면 위 ipfw 대신 써도된다.
상석하대님의 댓글
상석하대 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일
smbd 포트는 TCP 135, 139, 445
nmbd는 UDP 137, 138
요즘은 굳이 nmbd는 필요없다.
Disable하려면 다음을 실행한다.
sysrc nmbd_enable=NO