ftpsとsftpどっちにしようかな?というところからスタートしました。
ググってみると、
ftps 約 644,000 件
sftp 約 8,930,000 件
sftpのほうがメジャーです。
今回は、Windowsクライアント向けに、tarやzipでなくフォルダを直接アップロードしたいという要件を抱えています。
なのであえてftpsにします。
sftpも共存させようかと思いましたが、そっちはscpで事足りそうなので保留にしました。
他の要件は以下のとおり。
・anonymous非公開
・chrootでユーザーのホームディレクトリのみ公開
サーバー証明書
OpenSSLを使用してサーバー証明書を作成します。
OpenSSLは必ず最新にしておきましょう。
$ sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/certs/vsftpd.pem -out /etc/pki/tls/certs/vsftpd.pem
Generating a 2048 bit RSA private key
..................................................................................+++
.....................................................+++
writing new private key to '/etc/pki/tls/certs/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Sumidaku
Organization Name (eg, company) [Default Company Ltd]:yaminososhiki
Organizational Unit Name (eg, section) []: area6
Common Name (eg, your name or your server's hostname) []:myserver
Email Address []:xxxx@xxxx
$ ll /etc/pki/tls/certs/vsftpd.pem
-rw-r--r--. 1 root root 3144 Feb 0 00:00 /etc/pki/tls/certs/vsftpd.pem
##インストール
yumコマンドでインストールして、設定ファイルを編集します。
$ sudo yum install vsftpd
$ sudo vi /etc/vsftpd/vsftpd.conf
設定ファイル
# NOに変更 anonymousユーザーを無効にします
anonymous_enable=NO
# コメントアウト デフォルト(077)にして他のユーザーの読取を拒否
#local_umask=022
# アンコメント ASCIIモードを有効にします
ascii_upload_enable=YES
ascii_download_enable=YES
# コメントアウト(vsftpdデフォルトの077マスクで、ownerのみアクセスに)
#local_umask=022
# chrootを有効にして、homeディレクトリをルートにします。
# アンコメント
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
# ipv6,v4両方Listenします
listen=YES
listen_ipv6=YES
# 追記 ※私はよくwritableと間違ってしまいます。writeableです。
allow_writeable_chroot=YES
# 追記 フォルダごといけるようにします
ls_recurse_enable=YES
# ここからSSL設定を追記
# SSLを有効化
ssl_enable=YES
# 証明書の場所を指定します
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
# POODLEの件もあるので明示的にNO
ssl_sslv2=NO
ssl_sslv3=NO
# TLSを使います
ssl_tlsv1=YES
# ノンセキュアなFTPは使用させず、SSLを強制
force_local_data_ssl=YES
force_local_logins_ssl=YES
# ここからパッシブの設定を追記
pasv_address=公開しているホスト名
pasv_enable=YES
# PASVで使うポートの下限と上限を設定します。
# エフェメラルポートの範囲内です。setctlでport_rangeで変更していないか確認してください。
# $ sudo grep ip_local_port_range /etc/sysctl.conf
# デフォルト(設定なし)では32768〜61000
pasv_min_port=50021
pasv_max_port=50040
##サービス起動
サービスを起動して、ftpがLISTENになっていることを確認します。
$ sudo systemctl enable vsftpd
$ sudo systemctl start vsftpd
$ sudo systemctl status vsftpd
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
Active: active (running) since 月 2015-00-00 00:00:00 JST; 56s ago
Process: 2832 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 2833 (vsftpd)
CGroup: /system.slice/vsftpd.service
└2833 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
2月 00 00:00:00 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
2月 00 00:00:00 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
$ ss -lt | grep ftp
LISTEN 0 32 :::ftp :::*
##Firewallでftpポート開放
認証アクセス用ポートとPASVポートを開放します。
$ sudo firewall-cmd --add-service=ftp --permanent
$ sudo firewall-cmd --add-port=50021-50040/tcp --permanent
$ sudo firewall-cmd --reload
設定を確認します
$ sudo firewall-cmd --list-service | grep ftp
dhcpv6-client ftp http ssh
$ sudo firewall-cmd --list-port | grep 50021
50021-50040/tcp 2222/tcp
##SELinux無効化
書き込み権限が付与できない場合はSELinuxの設定が必要です。
今回は一旦無効化しておきます。
sudo setenforce 0
sudo getenforce
Permissive
##Windowsから動作確認
Windows用のFTPS対応クライアントとして、FFFTPを使用してアクセスしてみます。もちろんFileZillaでもOK。
まずは「基本」タブで
- 「ホストの設定名」
- 「ホスト名(アドレス)」
- 「ユーザー名」
- 「パスワード/フレーズ」
をそれぞれ設定します。
「拡張」タブで「PASVモードを使う」をチェック、「ポート番号:21」にします。
FFFTPの新規ホストでホストの設定をします。
「暗号化」タブで
「FTPS(Explicit)で接続」にチェックを入れます。
設定は以上です。
タイトルバーに「暗号化されています」と表示されています。
ファイルのアップロード、ダウンロードが可能か試してください。