File Server 

Overview:
❑ Image that you are a TA of a course, the professor wants you to build a file server that students can submit their homework to
❑ To prevent your colleagues from accidentally deleting files on the server, the snapshot and rollback features are needed

FTP Server 

Install pure-ftpd 

Install with pkg

pkg install pure-ftpd

Or install with port

port install pure-ftpd

記得要
[x]UPLOADSCRIPT

enable pure-ftpd

cat pureftpd_enable="YES" > /etc/rc.conf

Create 3 directories under /home/ftp 

mkdir -p /home/ftp/public /home/ftp/upload /home/ftp/hidden

Create admin user 

Create a system user “sysadm”

adduser
user:sysadm  
passwd:W081001  
group:sysadm,wheel  
ssh enable

pure-ftpd.conf 

cp /usr/local/share/doc/pure-ftpd/pure-ftpd.conf \  
/usr/local/etc/pure-ftpd.conf

In pure-ftpd.conf:

ChrootEveryone  yes
    
AnonymousOnly   no  
  
NoAnonymous     no  
  
PureDB /usr/local/etc/pureftpd.pdb  
   
AnonymousCanCreateDirs  no  
  
AntiWarez   no  
//yes -> Disallow downloads of files owned by the ftp system user  
  
Umask   133:022  
  
AnonymousCantUpload no  
  
CallUploadScript    yes  
  
TLS 1  

Create ftp users 

  1. Anonymous

    pw groupadd ftpuser
    
    pw useradd ftp -g ftpuser -d /home/ftp
    
  2. Virtual users
    Create two virtual users “ftp-vip1”, “ftp-vip2”
    i. Add a real account

    pw group virtualgroup
    
    pw useradd ftpuser1 -g virtualgroup \  
    -c "FTP virtual user1" -d /home/ftp \  
    -S /sbin/nologin
    

    ii. Map a virtual account to a real account

    pure-pw useradd ftp-vip1 -u ftpuser1 -g virtualgroup \  
    -d /home/ftp -m
    
  3. 看 user info

    pure-pw show ftp-vip1
    

ssl簽證 

Imgur

Launch the server… 

For testing the server

/usr/local/sbin/pure-ftpd &
ftp localhost

Automatically run the server when the system boots
add /usr/local/sbin/pure-ftpd & to /etc/rc.d/rc.local or /etc/rc.d/boot.local
Service

service pure-ftpd start  
service pure-ftpd stop   
service pure-ftpd restart

Service conf location
/usr/local/etc/rc.d or /etc/rc.d

Test in File Zilla 

主機:< your ip address >
使用者名稱:< username >
passwd:< ******** >
port:21

權限設定 

sudo chown sysadm:virtualgroup /home/ftp/upload
sudo chmod 1777 /home/ftp/upload
sudo chown sysadm:virtualgroup /home/ftp/public
sudo chmod 777 /home/ftp/public
sudo chmod 771 /home/ftp/hidden
sudo mkdir /home/ftp/hidden/treasure
sudo touch /home/ftp/hidden/treasure/secret

It would look like this

drwxrwx--x  2   root    wheel           hidden  
drwxrwxrwx  2   sysadm  virtualgroup    public  
drwxrwxrwt  2   sysadm  virtualgroup    upload  

upload的t 表示只有owner/root 才可以刪除檔案/資料夾

ZFS on /home/ftp 

enable ZFS service 

cat zfs_enable="YES" > /etc/rc.conf
sudo service zfs start

Add new hard disks 

VM settings > Storages > add 2 hard disks: ada1 ada2

Create mypool 

sudo zpool create mypoool mirror /dev/ada1 /dev/ada2

檢查

zpool status

Mount 

zfs set mountpoint=/home/ftp mypool
zfs set compression=lz4 mypool
zfs set atime=off mypool

重複上述指令給 mypool/publicmypool/uploadmypool/hidden
check history

sudo zpool history

Automatic snapshot script 

Write a script: zbackup
Usage:
- Create: zbackup DATASET [ROTATION_CNT]
- List: zbackup -l|--list [DATASET|ID|DATASET ID]
- Delete: zbackup -d|--delete [DATASET|ID|DATASET ID]
- Export: zbackup -e|--export [DATASET|ID|DATASET ID]
- Import: zbackup -i|--import FILENAME DATASET

$PATH下的filename可以當command執行
我的$PATH是 /home/c0846101/bin
zbackup

ftp-watchd 

Create ftp-watchd service

cd /usr/local/etc/rc.d  
sudo vim ftp-watchd  

ftp-watchd

sudo vim /tmp/uploadscript.sh

uploadscript.sh