proftpd ubuntu12.04標準。
認証はauth_file.cでバーチャルユーザのみ。
ユーザの利用目的は、webサイト更新
/etc/proftpd/proftpd.conf
#sftpでwelcome.msgを探せなくなるのを直すのが面倒くさいのでコメントアウト
- DisplayLogin welcome.msg
+ # DisplayLogin welcome.msg
# ファイル名変更で読み込ませたり、止めたり
- Include /etc/proftpd/conf.d/
+ Include /etc/proftpd/conf.d/*.conf
/etc/proftpd/conf.d/sftp.conf
<Limit Login>
order allow,deny
allow from 127.0.0.1 #wordpressの自動更新とかのためにlocalhostだけ素のFTP許可。
DenyAll
</Limit>
<IfModule mod_sftp.c>
<VirtualHost xxx.xxx.xxx.xxx> #proftpd はipアドレスのみなので、ifconfigで出るやつを入れる
<Limit login>
AllowAll #sftpはどこからでも許可。制限はiptablesまかせ。
</Limit>
SFTPEngine on
port 2222 #sshと分けるため、お好みの空いてるポートで開けてるポート。sftpのみにするなら、元々開けてある21にすると楽かも。
DefaultRoot ~/ #デフォルトルートはsftpでも効くのでべんり
AllowOverwrite on
SFTPLog /var/log/proftpd/sftp.log #log取る
SFTPHostKey /etc/ssh/ssh_host_dsa_key #sshのhostkey。下も
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPAuthorizedUserKeys file:/path/to/keyfile/%u #%uはユーザ名に展開されるので、ユーザの公開鍵ファイル名をユーザ名に
SFTPAuthMethods publickey password #鍵がなければパスワード
AuthUserFile /path/to/virtual/user/proftpd_userfile #バーチャルユーザにも使えます。
AuthGroupFile /path/to/virtual/user/proftpd_groupfile
</VirtualHost>
</IfModule>
inetd,xinetd経由なら、次の接続から。standaloneなら再起動。
鍵形式について
proftpdのmod_sftp.cが読めるのは、RFC 4716形式のみ。
linuxで一般的な、openssh形式のままでは読めないので、変換しないといけない。
公式を読まないとハマりがちなところ。
鍵置き場について。
公開鍵がなければFTPにアクセスできないわけですから、最初に公開鍵をユーザが自分で設置することはできません。管理者がユーザを追加する時に入れることになります。
一般的な ~/.ssh/公開鍵ファイル に置けば、バーチャルユーザをディレクトリごと削除する時に鍵ごと削除できて楽。
ただ、.ssh以下をユーザの所有にしてしまうと、消されたりしたら面倒。管理者の所有にすれば、管理者しか変更できない。
結局管理者が管理することになるので、別の場所にまとめて管理するのが無難かも。
今回はwebサイト用のディレクトリなので、ドットものが増えてウザので、別ディレクトリで管理するのが便利。
鍵かパスワードか
鍵認証最強伝説も、秘密鍵が手に入れば、パスフレーズなしなら瞬殺。短いパスフレーズなら秒殺。パスフレーズをキーチェーン的なものに保存して、ログイン時に自動解錠だったりすると、ログインされたら瞬殺。
鍵ファイルを盗まれるリスクと、超長いパスワードのメモ(さすがに覚えきれないw)を盗まれるリスク。超長いパスワードをブルートフォースアタックで抜けられるリスクを考えると、安全性はどれも大差ない気がします。
鍵認証は鍵管理もあるし、担当者が変わった時も現状の設定変更スクリプトがそのまま使えて変更が楽だし、鍵認証についての説明と鍵管理の説明をする手間も省けるので、超長いパスワードメインで行くことに。
※sshでのログインが鍵認証限定になっていても、proftpdのsftpのパスワード認証には影響しない。
速度
1000baseTのLAN内で、素のFTPに比べるとおおむね半分くらいの速度しか出ませんが、インターネット越しだと、接続環境によってはほとんど変わらないかも。
requested read offset (32768 bytes) greater than size of 'file name' (10399 bytes)
/var/log/proftpd/sftp.logにこのようなログが大量に……。
ググり倒してみたら、どうもクライアントとの相性問題らしい。
ためしに、proftpdのリリース候補版をコンパイルして入れてみても同じ挙動を示すので、proftpd側の問題ではなさそう。
大小ファイルを上げ下げしても、特に問題は出ないので、気にしない方向でよさそうです。
更にググり倒してみたら、ウザイなら/dev/nullに捨ててしまえwと書いてあったりする。
吐き出させ続けるとアホみたいに巨大なログを吐くので、
SFTPLog /dev/null #log捨てる
これでいくことに。
残る問題
cyberduckのsftp対応は、openssh sftpが前提なのか、proftpd経由だと挙動がおかしい。
firefoxOSX版のfireftpも挙動がおかしい。ログイン成功のログはでるけど、ファイルリストが出てこない。
Filezillaは上下とも問題なしだけど、この問題が出る。けど気にしないw
mod_delayメモ
proftpdで接続時の返答が遅いことがあるのは、mod_delayがデフォルトで有効になっているから。
何度もググった気がする……