CentOSサーバーにFTPをインストール・設定する方法
FTPがインストール済みか確認する
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がインストールされていない
vsftpd(FTPサーバー)をインストール
yum install vsftpd -y
vsftpd
をインストール
vsftpdが起動しているか確認
systemctl status vsftpd
vsftpdを起動
systemctl enable vsftpd systemctl start vsftpd
vsftpd
を自動起動に設定
vsftpd
を起動
ftp(FTPクライアント)をインストール
yum install ftp -y
FTPクライアントをインストール
vsftpdの動作確認のときに使うだけなので、この作業は必須ではない
lftp(FTPSクライアント)をインストール
yum install lftp -y
FTPSクライアントをインストール
vsftpdの動作確認のときに使うだけなので、この作業は必須ではない
vsftpdのポートを変更する
FTPサーバーのポートを変更する
FTPサーバーには、
- リッスン用のポート
- データ転送用のポート
の2種類のポートがある
リッスン用のポートは、FTPでログインするときに使うポート
デフォルトでは21
データ転送用のポートは、コネクション確立後(ログイン後)、実際のファイル転送に使われるポート
アクティブモードのときは20
番ポート、
パッシブモードのときは、ポートはランダムに選択される
(デフォルトではパッシブモード)
vsftpd.confを確認
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
の間に設定
通信時にこの中からランダムにポートが選ばれる
vsftpdを再起動
systemctl restart vsftpd
ファイアウォールでFTP用のポートを設定
vsftpdのポート変更に伴い、ファイアウォールでもポートの変更が必須
ftpリッスン用のポートを開放
ftp.xmlファイルをコピー
cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/
/usr/lib/firewalld/services
ディレクトリのftp.xml
ファイルを
/etc/firewalld/services
ディレクトリにコピー
ftpポートを変更
リッスン用のポートを21
から10021
に変更
vi /etc/firewalld/services/ftp.xml
- 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
に書き換え
ftpサービスを許可
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
WordPressのwp-config.phpを編集
- wp-config.php抜粋(変更前)
define('FTP_HOST', 'localhost');
- wp-config.php抜粋(変更前)
define('FTP_HOST', 'localhost:10021');
WordPressのwp-config.php
というファイルの中に
FTP_HOST
という項目がある場合は
ここにも変更したポートで通信するように設定を加える必要がある
ここの設定が適切でないと
WordPressの管理画面からWordPress本体の更新や
プラグインの追加・削除・更新などができない
hosts.denyの設定
hosts.deny
というファイルを開く
vi /etc/hosts.deny
デフォルトではvsftpd : all
の記述はないはずだが
既にvsftpd : all
と書かれている場合は、一時的にコメントアウト
(動作確認が終わったら、コメントアウトを解除する)
hosts.deny
では
サービス名 : IPアドレス
のペアで1行となっていて
指定されたIPアドレスから該当のサービスへの接続を禁止できる
vsftpd : all
と書かれていれば、すべてのIPアドレスからのvsftpd
への接続が禁止になっている
FTPクライアントで接続を確認
サーバーからサーバー(自分自身)にFTP接続のテスト
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はエラーになったりもする
FTPを終了
quit
quit
またはexit
コマンドで、FTP接続を終了する
rootユーザーでのログインを禁止する
デフォルトでは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使用が禁止されているから
- user_list
# 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
user_listを禁止リストに設定する方法
/etc/vsftpd/vsftpd.conf
というファイルで
userlist_deny=YES
と設定した場合、もしくはuserlist_deny
の項目がない場合は
user_list
は禁止リストとして働く
user_listを許可リストに設定する方法
userlist_deny=NO
と設定した場合は
user_list
は許可リストとして働く
デフォルトではuser_listは禁止リスト
デフォルトではuserlist_deny
の項目がない
user_list
は禁止リストとして働くので
user_list
にリストされているroot
ユーザーはftpを使用できない
リモートからFTP接続
ftp ftp> open 192.168.100.2 10021
サーバーのコンソールからではなく
ローカルのPC上でコマンドプロンプトを起動し
ftp
と打つと
ftp>
というプロンプトが出現する
open IPアドレス ポート
のように打つと、
ローカルでftp
コマンドを実行したときのように
ユーザー名やパスワードの入力をしてログインできる
ログインできないようであれば、ファイアウォールの設定などに問題がある可能性が高い
FTPで特定のユーザーのみを許可
vsftpd.confを確認
vi /etc/vsftpd/vsftpd.conf
vsftpd.conf
というファイルに設定を書くことで、vsftpd(FTPサーバー)の設定を変更できる
匿名ユーザーのFTPログインを禁止
- vsftpd.conf抜粋(変更前)
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=YES
- vsftpd.conf抜粋(変更後)
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO
vsftpd.conf
というファイルの
anonymous_enable=YES
という部分を
anonymous_enable=NO
に変更
上記の設定により、匿名ユーザーでのログインができなくなる
user_listを禁止リストから許可リストに変更
/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
に記載がある
user_listを編集
vi /etc/vsftpd/user_list
下記のようなユーザーが列挙されているので全削除
- user_list
root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
FTPで利用するユーザーだけをuser_list
に記載する
- user_list
kusanagi user1
上記の例だと、kusanagi
とuser1
というユーザーにFTPの利用を許可している
それ以外のユーザーはFTPが利用できなくなる
各自の環境に合わせてuser_list
にユーザー名を列挙する
ただし、root
ユーザーにFTP接続を許可することはおすすめしない
万が一、root
のパスワードが流出した場合
root
でFTP接続してデータを盗まれたり、サーバー内の全データを削除されるなど、取り返しのつかないことになるリスクがある
vsftpdサービスを再起動
systemctl restart vsftpd
vsftpd.conf
の設定を変更した場合、vsftpd
サービス再起動のタイミングで設定が反映する
user_list
の編集だけのときは、再起動不要
FTPで特定のIPアドレスのみを許可
hosts.denyとhosts.allow(CentOS7)
CentOS8ではhosts.denyとhosts.allowがなくなっているので注意
その話はファイアウォールでIPアドレスを制限(CentOS8)を参照
ここではCentOS7の話をする
hosts.denyの設定
vi /etc/hosts.deny
hosts.deny
を開く
hosts.deny
というファイルに、
vsftpd : all
という1行を追加する
- hosts.deny
vsftpd : all
vsftpd
に対してall
(すべてのIPアドレス)からの接続を拒否する
別途hosts.allow
で許可するIPアドレスだけを指定する
hosts.allowの設定
vi /etc/hosts.allow
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.deny
とhosts.allow
では、hosts.allow
の方が優先される
よって、hosts.deny
で全禁止となっていても、hosts.allow
で許可したIPアドレスからはvsftpd
へ接続可能
FTPS(FTP over SSL/TLS)を設定する
FTPS(FTP over SSL/TLS)用にサーバーの自己署名証明書を生成
opensslがインストールされていることを確認
openssl version
- 実行結果
OpenSSL 1.0.2k-fips 26 Jan 2017
openssl
のバージョンを確認
バージョン情報が出てこない場合は、openssl
がインストールされていない
opensslをインストール
opensslがインストールされていない場合は、自分でインストールする
インストール済みならこのステップは不要
yum install openssl -y
上記のコマンドでopenssl
がインストールされる
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
コマンドを実行すると対話モードが始まる
- 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 []:
Country Name
にJP
State or Province Name
にTokyo
その他の項目は空欄でOK
vsftpd.pemの中身
openssl req
コマンドの実行により、vsftpd.pem
というファイルが生成される
vsftpd.pem
の中身は、
PRIVATE KEY
(秘密鍵)と
CERTIFICATE
(証明書)が連結されたもの
- vsftpd.pem
-----BEGIN PRIVATE KEY----- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -----END CERTIFICATE-----
opensslのコマンドオプション
コマンドオプションは下記のとおり
req
: 証明書の署名要求(CSR)の作成
-x509
: X.509形式の署名要求ファイルを作成する
-nodes
: 鍵ファイルは暗号化しない
-newkey rsa:2048
: RSA2048の秘密鍵を作成
-days 36500
: X.509形式の証明書の有効期限を36500日(100年)とする
-keyout filename
: 秘密鍵の出力先ファイル名
-out filename
: サーバ証明書(CRT)出力先ファイル名
FTPS(FTP over SSL/TLS)の設定
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行を追加
- vsftpd.conf
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接続できるように許可することで、この問題は解決する
vsftpdを再起動
systemctl restart vsftpd
vsftpd.conf
を書き換えた後は、vsftpd
サービスの再起動が必要
lftpの設定
lftp
(FTPSクライアント)の設定を変更する
ユーザーを切替
su user1
root
などで作業中だった場合は、FTPSを利用するユーザーに切り替え
.lftprcを作成
vi ~/.lftprc
.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で動作確認
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は機能している
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
を記載するとエラーは出なくなる
FTPでアップロードしたファイルの時刻がずれる場合の対処方法
たとえば、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行を追加している
もともと時刻のずれが発生していない場合は、
この設定をすると時刻がずれる
サーバー側、クライアント側のタイムゾーンが共に日本時間になっていれば、おそらくこの設定は必要ない
サーバー側とクライアント側のタイムゾーンの設定が一致していない場合に必要な設定