以下はUbuntuの英語フォーラムのTutorial of the Weekの翻訳です。原文「Create a FTP server with user access」はユーザーfrodonによって執筆されています。英語フォーラムにおける投稿はCreative Commons Attribution 3.0です。この文章自体はCreative Commons Attribution Share Alike 3.0とします。最後のOther Stuffはリンク切れもあるので省きました。必要であれば原文を参照してください。
どうも、ですます調は英文の雰囲気と合わないので翻訳は基本的にである調にします。
—
このチュートリアルではWindowsのFTPservUのようにFTPプロトコルを使って友達とファイルを共有する方法を説明する。もちろんこの方法が唯一の方法ではないけれど、分かりやすく書こうと思う。
ここで作るFTPサーバーは、知らない人間が勝手に入ってこないように、ちゃんとあなたがユーザー名とパスワードをあげた人にしかアクセスできないようになっている。
A – GUIバージョン(初心者専用)
Linuxを使い始めたばっかりでGUIのないFTPサーバーなんて使いたいとか、FTPサーバーを使う頻度が少ないのでセキュリティはともかくちゃちゃっと設定したいなんて人にはproftpdのGTKのGUIがある。でもこれは自分できちんと設定するのに比べるとセキュリティが甘いので気をつけて。
1. proftpdとgproftpdをsynapticでインストールする。
sudo apt-get install proftpd gproftpd
2. GUIを使ってさっさとサーバーを設定する。
この方法については特に説明しないけど、特に難しいことはないはずだ。
B – 安全な方法
1. proftpdをsynapticでインストールする。
sudo apt-get install proftpd
2. 次の行を/etc/shellsに書き込む(sudo gedit /etc/shellsなど)。
/bin/false
/home/FTP-sharedディレクトリを作成する。
cd /home sudo mkdir FTP-shared
userftpというユーザーをftpアクセスのみの権限で差くせしよう。どうせ大したシェルは必要ないのでセキュリティの高い/bin/falseシェルを選ぶ。ホームディレクトリは/home/FTP-sharedにしよう。
GUIを使うのを勧めるけど分かりやすくするためコマンドも書いておく。繰り返しになるけどシステム、システム管理、ユーザとグループにあるGUIを使った方がいい。コマンドラインでユーザー・パスワードを作ると530エラーにぶち当たる人が多い。
sudo useradd userftp -p your_password -d /home/FTP-shared -s /bin/false sudo passwd userftp
FTP-sharedディレクトリにdownloadとuploadディレクトリを作ろう。
cd /home/FTP-shared/ sudo mkdir download sudo mkdir upload
こいつらに適切なパーミッションを設定する。
cd /home sudo chmod 755 FTP-shared cd FTP-shared sudo chmod 755 download sudo chmod 777 upload
3. ではproftpdの設定ファイルに移ろう。
sudo gedit /etc/proftpd.conf
edgy eft (Ubuntu 6.10)ならこっちだ。
sudo gedit /etc/proftpd/proftpd.conf
proftpd.confを以下のような感じに自分のケースに合うように編集してくれ。
# To really apply changes reload proftpd after modifications. AllowOverwrite on AuthAliasOnly on # Choose here the user alias you want !!!! UserAlias sauron userftp ServerName "ChezFrodon" ServerType standalone DeferWelcome on MultilineRFC2228 on DefaultServer on ShowSymlinks off TimeoutNoTransfer 600 TimeoutStalled 100 TimeoutIdle 2200 DisplayFirstChdir .message ListOptions "-l" RequireValidShell off TimeoutLogin 20 RootLogin off # It's better for debug to create log files 😉 ExtendedLog /var/log/ftp.log TransferLog /var/log/xferlog SystemLog /var/log/syslog.log #DenyFilter \*.*/ # I don't choose to use /etc/ftpusers file (set inside the users you want to ban, not useful for me) UseFtpUsers off # Allow to restart a download AllowStoreRestart on # Port 21 is the standard FTP port, so you may prefer to use another port for security reasons (choose here the port you want) Port 1980 # 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 8 # Set the user and group that the server normally runs at. User nobody 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 PersistentPasswd off MaxClients 8 MaxClientsPerHost 8 MaxClientsPerUser 8 MaxHostsPerUser 8 # Display a message after a successful login AccessGrantMsg "welcome !!!" # This message is displayed for each access good or not ServerIdent on "you're at home" # Set /home/FTP-shared directory as home directory DefaultRoot /home/FTP-shared # Lock all the users in home directory, ***** really important ***** DefaultRoot ~ MaxLoginAttempts 5 #VALID LOGINS <Limit LOGIN> AllowUser userftp DenyALL </Limit> <Directory /home/FTP-shared> Umask 022 022 AllowOverwrite off <Limit MKD STOR DELE XMKD RNRF RNTO RMD XRMD> DenyAll </Limit> </Directory> <Directory /home/FTP-shared/download/*> Umask 022 022 AllowOverwrite off <Limit MKD STOR DELE XMKD RNEF RNTO RMD XRMD> DenyAll </Limit> </Directory> <Directory /home/FTP-shared/upload/> Umask 022 022 AllowOverwrite on <Limit READ RMD DELE> DenyAll </Limit> <Limit STOR CWD MKD> AllowAll </Limit> </Directory>
これでproftpdの設定は終わり。この例ではポートが1980、アクセスパラメータはユーザー名sauronでパスワードはさっきuserftpに与えたものだ。
4. サーバーを起動・停止・再起動する。
sudo /etc/init.d/proftpd start sudo /etc/init.d/proftpd stop sudo /etc/init.d/proftpd restart
proftpd.confの構文チェックは次のコマンドだ。
sudo proftpd -td5
現在接続中のユーザーはftptopコマンドで分かる。ftpwhoも使える。
C – 高度な技
TLS/SSL暗号化の導入
FTPはインターネットがまだ安全な場所だったときに生まれた古いプロトコルだ。はっきり言ってそのままの状態ではセキュリティがなってない。
例えばログインのときのパスワードとユーザー名は平文でネット上を流れていく。お世辞にも安全とは呼べない。それが、まさに我々の世代のために、TLS/SSHという暗号化が開発された理由だ。
TLS/SSHはユーザー名とパスワード、そして送られるデータ全てを暗号化する。言うまでもなくFTPクライアントSFTPプロトコルに対応している必要はあるが。
ではTLS/SSH暗号化を設定する方法に移ろう。
次のコマンドを端末に張り付けてくれ。
sudo apt-get install build-essential sudo apt-get install libssl-dev cd /etc sudo mkdir ftpcert cd ftpcert/ sudo openssl genrsa -des3 -out server.key 1024 sudo openssl req -new -key server.key -out server.csr sudo openssl genrsa -des3 -out ca.key 1024 sudo openssl req -new -x509 -days 365 -key ca.key -out ca.crt sudo wget http://frodubuntu.free.fr/ubuntu/sign.sh sudo chmod +x sign.sh sudo ./sign.sh server.csr
そして以下の部分をproftpd.confファイルに付け加える。
<IfModule mod_tls.c> TLSEngine on TLSLog /var/ftpd/tls.log TLSProtocol TLSv1 # Are clients required to use FTP over TLS when talking to this server? TLSRequired off # Server's certificate TLSRSACertificateFile /etc/ftpcert/server.crt TLSRSACertificateKeyFile /etc/ftpcert/server.key # CA the server trusts TLSCACertificateFile /etc/ftpcert/ca.crt # Authenticate clients that want to use FTP over TLS? TLSVerifyClient off </IfModule>
edgyないしproftpd 1.3を使っているなら次の一分をproftpd.confにつける必要がある。こいつはmod_tls.cのようなモジュールを読み込んでくれる。
Include /etc/proftpd/modules.conf
注意:TLSRequired ONでTLSの利用を強制できる。OFFにすると利用の是非はクライアント次第だ。
オプション:サーバーを開始・停止・再起動するたびにserver.keyファイルのパスワードを聞かれるはずだ。これはRSAプライベートキーがserver.keyファイルに格納されているためだ。これを解決するにはRSAプライベートキーの暗号化を取り除けばいいがそうするとキーがサーバー上で読めてしまう。これはセキュリティ上よくないが、もしやるならserver.keyはrootにだけ読み込み可能になっていることは確認してくれ。セキュリティの問題に納得したらRSAキーの暗号を取り除こう。
cd /etc/ftpcert cp server.key server.key.org openssl rsa -in server.key.org -out server.key
問題が見つかった場合やもっと知りたい場合には次のページを見てくれ。
- http://www.modssl.org/docs/2.7/ssl_faq.html#cert-ownca
- http://www.castaglia.org/proftpd/doc…HOWTO-TLS.html
TLSで暗号化されたFTPサーバーを利用するにはTLSをサポートしている最新版のFilezillaのようなクライアントが必要だ。FilezillaではTLSを使用するオプションはFTPESと呼ばれている。
色々と教えてくれたnix4mにはここで敬意を表しよう。
一部のユーザーーのアクセスに制限を加える
様々な理由で、複数のユーザーを作って、ユーザー毎に違う権限を与えたいなんてこともあるだろう。
例えば二人のユーザー、user1とuser2、がいてuser2にはdownloadディレクトリへのアクセスを拒否したいとしよう。
まず二人のユーザーをuserftpのように作成する。エイリアスを使っているならエイリアスも与える。そして一般的なLimit LOGINセクションで両者に権限を与える。
#VALID LOGINS <Limit LOGIN> AllowUser user1 AllowUser user2 DenyALL </Limit>
それが終わったらDirectoryセクションで誰がどのディレクトリにアクセスできるかを指定する。
<Directory /home/FTP-shared/download/*> Umask 022 022 AllowOverwrite off <Limit ALL> Order Allow,Deny AllowUser user1 Deny ALL </Limit> <Limit MKD STOR DELE XMKD RNEF RNTO RMD XRMD> DenyAll </Limit> </Directory> <Directory> /home/FTP-shared/upload/> Umask 022 022 AllowOverwrite on <Limit ALL> Order Allow,Deny AllowUser user1 AllowUser user2 Deny ALL </Limit> <Limit READ RMD DELE> DenyAll </Limit> <Limit STOR CWD MKD> AllowAll </Limit> </Directory>
注意:downloadディレクトリの存在はuser2にも見える。中に入ることができないだけだ。
その他
・おすすめ運営法
http://www.castaglia.org/proftpd/doc…HOWTO-BCP.html
・ProftpTools 1.0.1
ProftpToolsはswoopのフィードバックから私が作成したスクリプトだ。このスクリプトを使えばproftpdを起動・停止したり、ディレクトリの自動・手動でのマウント・アンマウント、IPの表示などいろんなことがGUIで簡単にできる。
ProftpdToolsをインストールするにはProftpTools-v1.0.2.tar.gzをダウンロードする。以下のコマンドでもできる。ダウンロードしたら解凍して/usr/binに移動だ。
wget http://frodubuntu.free.fr/ubuntu/ProftpTools-v1.0.2.tar.gz tar -xzvf ProftpTools-v1.0.2.tar.gz cd ProftpTools-v1.0.2/ sudo mv ProftpTools /usr/bin/
そしたらホームディレクトリにある.bashrcにProftpToolsのパスを指定してやる。パスの最後にある/を取り除くのを忘れないように。ProftpToolsがホームディレクトリにあるなら次の通りだ。
ProftpTools_dir=/home/username/ProftpTools-v1.0.2 export ProftpTools_dir
あとはProftpToolsと端末で叩いてやるだけだ。こいつの利用にはzenityも必要だ。
・おすすめトリック
このトリックはProftpToolsに取り込まれている。
/homeを使いたくないなら他のドライブのスペースを使うことだってできるし、何なら違うパーティッションだっていい。proftpd.confファイルをいじらなくても、好きなディレクトリをdownload、uploadディレクトリにマウントすることができる。次のコマンドを使おう。
sudo mount -o bind the_directory_you_want_to_share /home/FTP-shared/download or sudo mount -o bind the_directory_you_want_to_use_for_upload /home/FTP-shared/upload
このコマンドはディレクトリを上書きしてしまうわけではない。単にマウントするだけだ。他のユーザーがログインするとマウントされたディレクトリがみえる。例えばdownloadディレクトリをアンマウントしたいならこうだ。
sudo umount /home/FTP-shared/download
再起動するごとに毎回マウントしなおしたくないのならfstabを編集して次の行を加えよう(sudo gedit /etc/fstab)。これはreetのアイデアだ。
the_directory_to_mount /home/FTP-shared/download vfat bind 0 0
FTP-sharedに他のディレクトリを加えたいならproftpd.confに加えてくれ。gFTPなんかで自分のFTPサーバーをチェックするのもよい。