vsftpd
・ftp
・lftp
などがインストールされているか確認
yum list installed | grep ftp
ftp.x86_64 0.17-67.el7 @base lftp.x86_64 4.4.8-14.el7_9 @updates vsftpd.x86_64 3.0.2-29.el7_9 @updates
vsftpd
は、FTPのサーバー
ftp
は、FTPのクライアント
lftp
は、FTPSのクライアント
上記のコマンドで何も表示されない場合は、ftpがインストールされていない
yum install vsftpd -y
vsftpd
をインストール
systemctl status vsftpd
systemctl enable vsftpd systemctl start vsftpd
vsftpd
を自動起動に設定
vsftpd
を起動
yum install ftp -y
FTPクライアントをインストール
vsftpdの動作確認のときに使うだけなので、この作業は必須ではない
yum install lftp -y
FTPSクライアントをインストール
vsftpdの動作確認のときに使うだけなので、この作業は必須ではない
FTPサーバーのポートを変更する
FTPサーバーには、
の2種類のポートがある
リッスン用のポートは、FTPでログインするときに使うポート
デフォルトでは21
データ転送用のポートは、コネクション確立後(ログイン後)、実際のファイル転送に使われるポート
アクティブモードのときは20
番ポート、
パッシブモードのときは、ポートはランダムに選択される
(デフォルトではパッシブモード)
vi /etc/vsftpd/vsftpd.conf
vsftpd.conf
に設定を書くと、ポートの変更などができる
echo "listen_port=10021" >> /etc/vsftpd/vsftpd.conf
vsftpd.conf
ファイルの末尾に、
listen_port=10021
を追加
リッスンポートが10021
になる
echo "pasv_min_port=11000" >> /etc/vsftpd/vsftpd.conf echo "pasv_max_port=11009" >> /etc/vsftpd/vsftpd.conf
データ転送用のポートを、11000
~11009
の間に設定
通信時にこの中からランダムにポートが選ばれる
systemctl restart vsftpd
vsftpdのポート変更に伴い、ファイアウォールでもポートの変更が必須
cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/
/usr/lib/firewalld/services
ディレクトリのftp.xml
ファイルを
/etc/firewalld/services
ディレクトリにコピー
リッスン用のポートを21
から10021
に変更
vi /etc/firewalld/services/ftp.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>FTP</short> <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description> <port protocol="tcp" port="21"/> <module name="nf_conntrack_ftp"/> </service>
ftp.xml
というファイルで
21
の部分を
10021
に書き換え
firewall-cmd --add-service=ftp --permanent
ファイアウォールで、ftpサービスの通信を許可
firewall-cmd --add-port=11000-11009/tcp --permanent
11000
~11009
の範囲でポートを開放
firewall-cmd --reload
リロードをしないと設定変更が反映しない
firewall-cmd --list-all
public (active) target: default icmp-block-inversion: no interfaces: enp0s3 sources: services: ftp http https ssh ports: 11000-11009/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
services
にftp
が、
ports
に11000-11009/tcp
が表示されていればOK
define('FTP_HOST', 'localhost');
define('FTP_HOST', 'localhost:10021');
WordPressのwp-config.php
というファイルの中に
FTP_HOST
という項目がある場合は
ここにも変更したポートで通信するように設定を加える必要がある
ここの設定が適切でないと
WordPressの管理画面からWordPress本体の更新や
プラグインの追加・削除・更新などができない
hosts.deny
というファイルを開く
vi /etc/hosts.deny
デフォルトではvsftpd : all
の記述はないはずだが
既にvsftpd : all
と書かれている場合は、一時的にコメントアウト
(動作確認が終わったら、コメントアウトを解除する)
hosts.deny
では
サービス名 : IPアドレス
のペアで1行となっていて
指定されたIPアドレスから該当のサービスへの接続を禁止できる
vsftpd : all
と書かれていれば、すべてのIPアドレスからのvsftpd
への接続が禁止になっている
ftp localhost 10021
Trying ::1... Connected to localhost (::1). 220 (vsFTPd 3.0.2) Name (localhost:root): user1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
プロンプトが出てくるので
Name
にユーザー名
Password
にパスワードを入力してログインする
230 Login successful.
のような表示があれば、ログインに成功している
ftp> pwd 257 "/home/user1" ftp>
ログインに成功していれば、
ftp>
プロンプトでpwd
やls
などのコマンドが実行できる
権限が不足しているとpwdはできるけどlsはエラーになったりもする
quit
quit
またはexit
コマンドで、FTP接続を終了する
デフォルトではrootユーザーでのログインは禁止になっている
ftp localhost 10021
Trying ::1... Connected to localhost (::1). 220 (vsFTPd 3.0.2) Name (localhost:root): root 530 Permission denied. Login failed. ftp>
root
でログインしようとすると
530 Permission denied.
Login failed.
と表示される
これは、/etc/vsftpd/user_list
というファイルでroot
ユーザーのftp使用が禁止されているから
# vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
/etc/vsftpd/vsftpd.conf
というファイルで
userlist_deny=YES
と設定した場合、もしくはuserlist_deny
の項目がない場合は
user_list
は禁止リストとして働く
userlist_deny=NO
と設定した場合は
user_list
は許可リストとして働く
デフォルトではuserlist_deny
の項目がない
user_list
は禁止リストとして働くので
user_list
にリストされているroot
ユーザーはftpを使用できない
ftp ftp> open 192.168.100.2 10021
サーバーのコンソールからではなく
ローカルのPC上でコマンドプロンプトを起動し
ftp
と打つと
ftp>
というプロンプトが出現する
open IPアドレス ポート
のように打つと、
ローカルでftp
コマンドを実行したときのように
ユーザー名やパスワードの入力をしてログインできる
ログインできないようであれば、ファイアウォールの設定などに問題がある可能性が高い
vi /etc/vsftpd/vsftpd.conf
vsftpd.conf
というファイルに設定を書くことで、vsftpd(FTPサーバー)の設定を変更できる
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=YES
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO
vsftpd.conf
というファイルの
anonymous_enable=YES
という部分を
anonymous_enable=NO
に変更
上記の設定により、匿名ユーザーでのログインができなくなる
/etc/vsftpd/user_list
ファイルは
デフォルトでは禁止リスト
となっているので
これを許可リスト
へと変更する
echo "userlist_deny=NO" >> /etc/vsftpd/vsftpd.conf
vsftpd.conf
というファイルの末尾に
userlist_deny=NO
という設定を追加する
vsftpd.conf
に
userlist_deny=NO
が設定してある場合
/etc/vsftpd/user_list
は許可リストとして機能する
userlist_deny=YES
が設定してある場合、またはuserlist_deny
の項目がない場合
/etc/vsftpd/user_list
は禁止リストとして機能する
ちなみにuserlist_enable=YES
という記述がないとuser_list
がそもそも発動しないので禁止にも許可にもならないが
userlist_enable=YES
は、もともとvsftpd.conf
に記載がある
vi /etc/vsftpd/user_list
下記のようなユーザーが列挙されているので全削除
root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
FTPで利用するユーザーだけをuser_list
に記載する
kusanagi user1
上記の例だと、kusanagi
とuser1
というユーザーにFTPの利用を許可している
それ以外のユーザーはFTPが利用できなくなる
各自の環境に合わせてuser_list
にユーザー名を列挙する
ただし、root
ユーザーにFTP接続を許可することはおすすめしない
万が一、root
のパスワードが流出した場合
root
でFTP接続してデータを盗まれたり、サーバー内の全データを削除されるなど、取り返しのつかないことになるリスクがある
systemctl restart vsftpd
vsftpd.conf
の設定を変更した場合、vsftpd
サービス再起動のタイミングで設定が反映する
user_list
の編集だけのときは、再起動不要
CentOS8ではhosts.denyとhosts.allowがなくなっているので注意
その話はファイアウォールでIPアドレスを制限(CentOS8)を参照
ここではCentOS7の話をする
vi /etc/hosts.deny
hosts.deny
を開く
hosts.deny
というファイルに、
vsftpd : all
という1行を追加する
vsftpd : all
vsftpd
に対してall
(すべてのIPアドレス)からの接続を拒否する
別途hosts.allow
で許可するIPアドレスだけを指定する
vi /etc/hosts.allow
hosts.allow
を開く
hosts.allow
に下記の設定を追加
vsftpd : localhost vsftpd : 127.0.0.1 vsftpd : xx.xx.xx.xx
実際にはxx.xx.xx.xx
の部分には具体的な数値を記入する
自宅からサーバーにftpで接続したい場合は、自宅PCのグローバルIPアドレスがxx.xx.xx.xx
の部分に入る
サーバーからサーバー(自分自身)へのアクセスを許可するためにlocalhost
や127.0.0.1
も許可する
hosts.deny
とhosts.allow
では、hosts.allow
の方が優先される
よって、hosts.deny
で全禁止となっていても、hosts.allow
で許可したIPアドレスからはvsftpd
へ接続可能
openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
openssl
のバージョンを確認
バージョン情報が出てこない場合は、openssl
がインストールされていない
opensslがインストールされていない場合は、自分でインストールする
インストール済みならこのステップは不要
yum install openssl -y
上記のコマンドでopenssl
がインストールされる
cd /etc/pki/tls/certs openssl req -x509 -nodes -newkey rsa:2048 -days 36500 -keyout vsftpd.pem -out vsftpd.pem
/etc/pki/tls/certs
ディレクトリに移動して
openssl req
コマンドを実行している
Generating a 2048 bit RSA private key ....................................................................................+++ ...................+++ writing new private key to '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]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address []:
openssl req
コマンドを実行すると対話モードが始まる
JP
Tokyo
Country Name
にJP
State or Province Name
にTokyo
その他の項目は空欄でOK
openssl req
コマンドの実行により、vsftpd.pem
というファイルが生成される
vsftpd.pem
の中身は、
PRIVATE KEY
(秘密鍵)と
CERTIFICATE
(証明書)が連結されたもの
-----BEGIN PRIVATE KEY----- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -----END CERTIFICATE-----
コマンドオプションは下記のとおり
req
: 証明書の署名要求(CSR)の作成
-x509
: X.509形式の署名要求ファイルを作成する
-nodes
: 鍵ファイルは暗号化しない
-newkey rsa:2048
: RSA2048の秘密鍵を作成
-days 36500
: X.509形式の証明書の有効期限を36500日(100年)とする
-keyout filename
: 秘密鍵の出力先ファイル名
-out filename
: サーバ証明書(CRT)出力先ファイル名
echo "ssl_enable=YES" >> /etc/vsftpd/vsftpd.conf echo "rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem" >> /etc/vsftpd/vsftpd.conf echo "force_local_logins_ssl=NO" >> /etc/vsftpd/vsftpd.conf echo "force_local_data_ssl=NO" >> /etc/vsftpd/vsftpd.conf
vsftpd.conf
というファイルに、下記の4行を追加
ssl_enable=YES rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem force_local_logins_ssl=NO force_local_data_ssl=NO
FTP over SSL/TLS
を有効化
証明書のパスを指定
(さきほどopenssl
で作成したもの)
ssl_enable=YES
を設定すると、FTPSで接続できるようになる代わりに、FTPでは接続できなくなる
force_local_logins_ssl=NO
とforce_local_data_ssl=NO
により
ローカル接続のときだけは、FTPSではなくFTP接続を許可する
FTPSはFTPよりも遅い
そのため、WordPressでプラグインの削除をするときに、FTPSだとタイムアウトでエラーになることがある
(WordPressはプラグインのアンインストールのときに、FTPでファイルを削除している)
ローカルでは、FTPS必須ではなくFTP接続できるように許可することで、この問題は解決する
systemctl restart vsftpd
vsftpd.conf
を書き換えた後は、vsftpd
サービスの再起動が必要
lftp
(FTPSクライアント)の設定を変更する
su user1
root
などで作業中だった場合は、FTPSを利用するユーザーに切り替え
vi ~/.lftprc
.lftprc
というファイルを新規作成
.lftprc
に以下を記載
set ftp:ssl-auth TLS set ftp:ssl-force true set ftp:ssl-allow yes set ftp:ssl-protect-list yes set ftp:ssl-protect-data yes set ftp:ssl-protect-fxp yes set ssl:verify-certificate no set ssl:check-hostname no
.lftprc
ファイルは、lftp
でFTPS接続するときのクライアントのパラメーターを指定するもの
lftp -d -u user1 localhost:10021
-d
はデバッグモードのオプション
-u
はユーザー名を指定するオプション
パスワード: lftp user1@localhost:~> ls ---- localhost (::1) ポート 10021 に接続中 <--- 220 (vsFTPd 3.0.2) ---> FEAT <--- 211-Features: <--- AUTH TLS <--- EPRT <--- EPSV <--- MDTM <--- PASV <--- PBSZ <--- PROT <--- REST STREAM <--- SIZE <--- TVFS <--- UTF8 <--- 211 End ---> AUTH TLS <--- 234 Proceed with negotiation. ---> OPTS UTF8 ON Certificate: C=JP,ST=Tokyo,L=Default City,O=Default Company Ltd,CN=example.com Issued by: C=JP,ST=Tokyo,L=Default City,O=Default Company Ltd,CN=example.com WARNING: Certificate verification: Not trusted WARNING: Certificate verification: hostname checking disabled <--- 200 Always in UTF8 mode. ---> USER user1 <--- 331 Please specify the password. ---> PASS XXXX <--- 230 Login successful. ---> PWD <--- 257 "/home/user1" ---> PBSZ 0 <--- 200 PBSZ set to 0. ---> PROT P <--- 200 PROT now Private. ---> PROT P <--- 200 PROT now Private. ---> EPSV <--- 229 Entering Extended Passive Mode (|||11001|). ---- データソケットを (::1) のポート 11001 に接続中 ---- Data connection established ---> LIST <--- 150 Here comes the directory listing. Certificate: C=JP,ST=Tokyo,L=Default City,O=Default Company Ltd,CN=example.com Issued by: C=JP,ST=Tokyo,L=Default City,O=Default Company Ltd,CN=example.com WARNING: Certificate verification: Not trusted WARNING: Certificate verification: hostname checking disabled -rw-rw-r-- 1 1000 1000 15 Jul 11 08:55 test.txt ---- Got EOF on data connection ---- データソケットを閉じています <--- 226 Directory send OK. lftp user1@localhost:~>
パスワードの入力を求められる
パスワード入力すると、
lftp user1@localhost:~>
のようなプロンプトが現れる
ls
などのコマンドを実行して、ファイルの一覧が表示されればFTPSは機能している
lftp
でログインし、ls
などのコマンドを実行したタイミングで、下記のようなエラーが出ることがある
ERROR: Certificate verification: Not trusted ERROR: Certificate verification: certificate common name doesn't match requested host name ‘localhost’
これは、openssl
コマンドで証明書を作成するときに
COMMON NAME
にexample.com
を指定したのに
lftp -d -u user1 localhost:10021
コマンドではlocalhost
に接続しているため
example.com
とlocalhost
で名前が一致しないためにエラーとなる
.lftprc
ファイルに
set ssl:check-hostname no
を記載するとエラーは出なくなる
たとえば、2021年1月1日 12時00分
にFTPでファイルをアップロードしたとする
ファイルの最終更新時刻が、
FileZillaのようなFTPクライアントで見ると、2021年1月1日 12時00分
になっているが、
サーバー上でls -la
のようなコマンドでファイルの情報を見ると、2021年1月1日 3時00分
のようにGMTで表示されてしまうことがある
(FTPクライアントの表示は正常、サーバー上で時刻ずれ)
また、FileZillaのようなFTPクライアントで見ると、2021年1月1日 21時00分
になり、
サーバー上では、2021年1月1日 12時00分
のようになる場合もある
(FTPクライアントで時刻ずれ、サーバー上の表示は正常)
そのような場合は、vsftpd.conf
にuse_localtime=YES
を設定すると状態が改善されるかもしれない
echo "use_localtime=YES" >> /etc/vsftpd/vsftpd.conf systemctl restart vsftpd
vsftpd.conf
というファイルの末尾に、
use_localtime=YES
という1行を追加している
もともと時刻のずれが発生していない場合は、
この設定をすると時刻がずれる
サーバー側、クライアント側のタイムゾーンが共に日本時間になっていれば、おそらくこの設定は必要ない
サーバー側とクライアント側のタイムゾーンの設定が一致していない場合に必要な設定