[スポンサーリンク]
CentOS7にFTPでファイル転送
先日PythonでTwitterAPIを使って、画像ツイートをしました
その時に一番苦戦したのは、CentOSサーバに画像を設置すること(笑)
CentOSにFTPサーバを構築して、画像を転送出来る様にした作業を記録します
参考サイト
CentOS7にvsftpdをインストールして、FTPサーバを構築するにあたり参考にさせて戴いたサイトです
非常に分かり易く、必要作業を記載されています
[スポンサーリンク]
FTPとは
FTPとはFile Transfer Protocolで、ファイル転送を行う通信プロトコルです
FTPクライアントとFTPサーバ間で、ファイルのアップロード/ダウンロードを実現します
セキュリティを確保したFTP通信FTPSとSFTP
単純なFTPは、ユーザ/パスワードの認証情報や転送するファイルは暗号化されていません
セキュリティが考慮されたFTPS、SFTPの通信プロトコルがあります
FTPSはSSL/TLS、SFTPはSSHによって、通信のセキュリティを実現しています
今回は実施しませんが、今後SSL証明書を作成しFTPSでの通信が出来るようにしたいと思います
アクティブモードとパッシブモード
FTPは二つのポートを使い、それぞれコネクションを使ってファイルを転送します
一方は制御用のコネクションで、他方はデータ転送用のコネクションです
FTP通信には、アクティブモードとパッシブモードの二つのセッション確立モードがあります
大きな違いは転送コネクションの開始(★)の方向とポートです
アクティブモードは、サーバは21ポートのみデータ転送に使用で済みますが、クライアントは指定されたポートでの通信を受け付ける必要があります
パッシブモードは、1024以降のポート(※)をデータ転送用に開放しなければいけませんが、クライアントからは指定範囲のポートへ通信を要求するだけになります
※ ウェルノウンポート(0~1023)で予約済の為に使用出来ない
パッシブモードでは、クライアント側からしか通信を開始しないのが重要です
FireWallは外部からの接続(侵入行為)を禁止し、自分自身(内部)からの通信は許可する設定することが多いです
クライアント側は、外部からの接続を受け付ける必要がなく、セキュリティが確保しやすい方法になります
(外部流出等を防ぐ場合には、クライアントも内部からの通信も遮断が必要ですが)
・アクティブモード
FTPサーバから、ファイル転送のセッションの確立をする方法です
FTPサーバが能動的(アクティブ)に、FTPクライアントとセッションを確立します
クライアントは、サーバから指定されたポートでの通信を受け付ける必要があります
フロー概要は以下です
コネクション | サーバ 通信ポート | 通信方向 | クライアント 通信ポート | 通信内容 |
制御 | 21 | ← | 任意 | FTPサーバの21番ポートへ 制御用コネクションを接続 |
制御 | 21 | → | 任意 | FTPクライアントへ ユーザ認証を要求 |
制御 | 21 | ← | 任意 | FTPサーバへ ユーザ認証情報を送信 |
制御 | 21 | → | 任意 | FTPクライアントへ データ転送に使用するポートを連携 |
制御 | 21 | ← | 任意 | FTPサーバへ ファイル転送を要求 |
転送★ | 20 | → | 指定 | FTPクライアントへ データ転送用コネクションを接続 |
転送 | 20 | ⇄ | 指定 | データ転送 (アップロード/ダウンロード) |
転送 | 20 | → | 指定 | FTPクライアントへ データ転送用コネクションを切断 |
制御 | 21 | ← | 任意 | FTPサーバの21番ポートへ 制御用コネクションを切断 |
・パッシブモード
FTPクライアントから、ファイル転送のセッションの確立をする方法です
FTPサーバは受動的(パッシブ)に、FTPクライアントからセッションを確立を受け付けます
クライアントは、サーバから指定されたポートでの通信を要求することとなります
フロー概要は以下です
コネクション | サーバ 通信ポート | 通信方向 | クライアント 通信ポート | 通信内容 |
制御 | 21 | ← | 任意 | FTPサーバの21番ポートへ 制御用コネクションを接続 |
制御 | 21 | → | 任意 | FTPクライアントへ ユーザ認証を要求 |
制御 | 21 | ← | 任意 | FTPサーバへ ユーザ認証情報を送信 |
制御 | 21 | → | 任意 | FTPクライアントへ データ転送に使用するポート範囲を連携 |
転送★ | 任意 (指定範囲) | ← | 任意 | FTPサーバへ指定ポート範囲のポートへ ファイル転送を要求 |
転送 | 任意 (指定範囲) | ← | 任意 | FTPサーバのへ データ転送用コネクションを接続 |
転送 | 任意 (指定範囲) | ⇄ | 任意 | データ転送 (アップロード/ダウンロード) |
転送 | 任意 (指定範囲) | ← | 任意 | FTPサーバへ データ転送用コネクションを切断 |
制御 | 21 | ← | 任意 | FTPサーバの21番ポートへ 制御用コネクションを切断 |
[スポンサーリンク]
FTPサーバの構築
vsftpdとは
vsftpdは、very secure FTP daemonのことです
セキュリティを確保した、FTPのdaemon(常駐プログラム)です
CentOS、RedHat、Ubuntu、Fedora等のディストリビューションに標準で入っています
vsftpdインストール方法
今回の環境はCentOS7の為、vsftpdは標準になります
yum infoで情報を確認します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# yum info vsftpd 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.cat.net * epel: ftp.iij.ad.jp * extras: mirrors.cat.net * updates: mirrors.cat.net 利用可能なパッケージ 名前 : vsftpd アーキテクチャー : x86_64 バージョン : 3.0.2 リリース : 25.el7 容量 : 171 k リポジトリー : base/7/x86_64 要約 : Very Secure Ftp Daemon URL : https://security.appspot.com/vsftpd.html ライセンス : GPLv2 with exceptions 説明 : vsftpd is a Very Secure FTP daemon. It was written completely from : scratch. |
yum installでvsftpdをインストールします
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# yum install vsftpd 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.cat.net * epel: ftp.iij.ad.jp * extras: mirrors.cat.net * updates: mirrors.cat.net 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ vsftpd.x86_64 0:3.0.2-25.el7 を インストール --> 依存性解決を終了しました。 依存性を解決しました ============================================================================================================================================================================================================================================= Package アーキテクチャー バージョン リポジトリー 容量 ============================================================================================================================================================================================================================================= インストール中: vsftpd x86_64 3.0.2-25.el7 base 171 k トランザクションの要約 ============================================================================================================================================================================================================================================= インストール 1 パッケージ 総ダウンロード容量: 171 k インストール容量: 353 k Is this ok [y/d/N]: y Downloading packages: vsftpd-3.0.2-25.el7.x86_64.rpm | 171 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : vsftpd-3.0.2-25.el7.x86_64 1/1 検証中 : vsftpd-3.0.2-25.el7.x86_64 1/1 インストール: vsftpd.x86_64 0:3.0.2-25.el7 完了しました! |
vsftpd設定
vsftpdの設定として、今回は以下の2点を変更します
家庭内での通信なので、最低限の設定です
※後続に記載しますが、設定変更内容に不足があります
・アノニマス接続の拒否
既定では、アノニマス(匿名)つまり誰でも接続が可能となっています
anonymous_enableをYESからNOに変更して、ユーザ認証が必要とします
1 2 |
# cat /etc/vsftpd/vsftpd.conf | grep anonymous_enable anonymous_enable=NO |
・chrootの有効化
既定では、FTP接続したユーザは、FTPサーバ内の全てのディレクトリが参照可能です
chrootを有効化して、接続ユーザは自分のユーザディレクトリ配下のみ参照を可能とします
この環境では、chroot_listが存在しないので、ファイルも作成します
今後、ユーザディレクトリ以外も参照可能なユーザが必要になった場合は、chroot_listに追加します
1 2 3 4 5 |
# cat /etc/vsftpd/vsftpd.conf | grep chroot_ # directory. If chroot_local_user is YES, then this list becomes a list of chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list |
1 2 3 4 5 |
# ls /etc/vsftpd/chroot_list ls: /etc/vsftpd/chroot_list にアクセスできません: そのようなファイルやディレクトリはありません [root@localhost ~]# touch /etc/vsftpd/chroot_list [root@localhost ~]# ls /etc/vsftpd/chroot_list /etc/vsftpd/chroot_list |
/etc/vsftpd/vsftpd.confを修正して、上記を設定します
configファイルをバックアップ後、更新します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# cat /etc/vsftpd/vsftpd.conf # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's # capabilities. # # Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO # # Uncomment this to allow local users to log in. # When SELinux is enforcing check for SE bool ftp_home_dir local_enable=YES # # Uncomment this to enable any form of FTP write command. write_enable=YES # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) local_umask=022 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. # When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access #anon_upload_enable=YES # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. #anon_mkdir_write_enable=YES # # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES # # Activate logging of uploads/downloads. xferlog_enable=YES # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not # recommended! #chown_uploads=YES #chown_username=whoever # # You may override where the log file goes if you like. The default is shown # below. #xferlog_file=/var/log/xferlog # # If you want, you can have your log file in standard ftpd xferlog format. # Note that the default log file location is /var/log/xferlog in this case. xferlog_std_format=YES # # You may change the default value for timing out an idle session. #idle_session_timeout=600 # # You may change the default value for timing out a data connection. #data_connection_timeout=120 # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. #nopriv_user=ftpsecure # # Enable this and the server will recognise asynchronous ABOR requests. Not # recommended for security (the code is non-trivial). Not enabling it, # however, may confuse older FTP clients. #async_abor_enable=YES # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. The vsftpd.conf(5) man page explains # the behaviour when these options are disabled. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. #ascii_upload_enable=YES #ascii_download_enable=YES # # You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. # # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. #deny_email_enable=YES # (default follows) #banned_email_file=/etc/vsftpd/banned_emails # # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that # the user does not have write access to the top level directory within the # chroot) chroot_local_user=YES chroot_list_enable=YES # (default follows) chroot_list_file=/etc/vsftpd/chroot_list # # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. ls_recurse_enable=YES # # When "listen" directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. listen=NO # # This directive enables listening on IPv6 sockets. By default, listening # on the IPv6 "any" address (::) will accept connections from both IPv6 # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6 # sockets. If you want that (perhaps because you want to listen on specific # addresses) then you must run two copies of vsftpd with two configuration # files. # Make sure, that one of the listen options is commented !! listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES |
vsftpd起動
systemctl startコマンドでvsftpdを起動します
成功した場合は、何も表示されません
systemctl statusコマンドで起動していることを確認します
1 |
# systemctl start vsftpd |
1 2 3 4 5 6 7 8 9 10 |
# systemctl status vsftpd ● vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled) Active: active (running) since 月 2020-03-09 20:14:51 JST; 1min 2s ago Main PID: 20624 (vsftpd) CGroup: /system.slice/vsftpd.service mq20624 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf 3月 09 20:14:51 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon... 3月 09 20:14:51 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon. |
FTP接続(試行錯誤)
同一ネットワークにあるWindows10からftp接続してみます
まぁ、繋がりませんよね・・・
1 2 3 4 |
>ftp ftp> open ***.***.***.*** > ftp: connect :接続がタイムアウトしました ftp> |
SELinuxを一時的に無効化
まず、SELinuxを強制から、許可に変更してみました
SELinuxは、Security Enhanced Linuxで、Linuxの細かいセキュリティ設定を可能にする機能です
CentOS7では、既定で有効となっています
但し既定の設定では、今回の様に、必要としている通信などの動作をもアクセス不可とする場合があります
ステータス | SELinux | アクセス制御 |
enforcing | 有効 | アクセス不可(制御が有効) |
permissive | 有効 | アクセス可(警告が出力) |
disabled | 無効 | アクセス可 |
SELinuxの現在の動作状態は、getenforceで確認出来ます
setenforce 0コマンドで、動作状態をPermissiveに変更出来ます
状態変更が成功した場合は、何も表示されないので、変更後はgetenforceで動作状態を確認します
setenforceコマンドの変更は、一時的な変更になり、再起動を行った場合は元の状態に戻ります
恒久的にSELinux動作状態を変更する場合は、/etc/selinux/configファイルを変更し、起動時にファイル内容の状態でSELinuxを起動するようにする必要があります
1 2 |
# getenforce Enforcing |
1 |
# setenforce 0 |
1 2 |
# getenforce Permissive |
同一ネットワークにあるWindows10からftp接続してみます
SELinuxを無効化しても、繋がりませんでした・・・
SELinuxさん、疑ってすみません(汗)
1 2 3 4 |
>ftp ftp> open ***.***.***.*** > ftp: connect :接続がタイムアウトしました ftp> |
ファイアウォールを無効化
次は、ファイアウォールを無効化してみます
Windowsでも同名で、通信制御をしているので、聞きなれた言葉です
Linuxでも、wirewallは存在し、通信制御をしています
firewallは、systemctl statusコマンドで実行状態(Active:)を確認出来ます
systemctl stopコマンドで停止をすることが出来ます
stopコマンドが成功した場合は、何も表示されないので、systemctl statusコマンドで実行状態を確認します
1 2 3 4 5 6 7 8 9 10 11 12 |
# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since 金 2019-12-20 08:22:16 JST; 2 months 19 days ago Docs: man:firewalld(1) Main PID: 904 (firewalld) Tasks: 2 CGroup: /system.slice/firewalld.service mq904 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid 3月 09 20:37:09 localhost.localdomain firewalld[904]: ERROR: INVALID_ZONE: manage Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable. |
1 |
# systemctl stop firewalld |
1 2 3 4 5 6 7 8 9 10 11 12 |
# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: inactive (dead) since 月 2020-03-09 21:19:27 JST; 3s ago Docs: man:firewalld(1) Process: 904 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS) Main PID: 904 (code=exited, status=0/SUCCESS) 3月 09 20:37:09 localhost.localdomain firewalld[904]: ERROR: INVALID_ZONE: manage 3月 09 21:19:26 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon... 3月 09 21:19:27 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon. Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable. |
FTP接続が出来ました
firewallが、接続を制限していました
しかし、エラーが表示され、ディレクトリを参照出来ません
1 2 3 4 5 6 7 8 9 10 |
ftp> open ***.***.***.*** ***.***.***.*** に接続しました。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. ユーザー (***.***.***.***:(none)): 【ユーザ名】 331 Please specify the password. パスワード: 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 接続がリモート ホストによって閉じられました。 ftp> |
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
エラー内容を調べると、対処内容がありました
/etc/vsftpd/vsftpd.confにallow_writeable_chroot=YESを追加することで、解消出来ます
vsftpd2.3.5から、chrootのディレクトリに書き込み権限がある場合は、接続出来なくなっています
allow_writeable_chrootを有効にして、書き込み権限を許可することで、接続出来る様になります
(書き込み権限を削除しても接続出来ますが、それではファイルがアップロード出来ないので・・・)
1 2 |
# cat /etc/vsftpd/vsftpd.conf | grep allow_writeable_chroot allow_writeable_chroot=YES |
無事接続することが出来ました!
1 2 3 4 5 6 7 8 |
ftp> open ***.***.***.*** ***.***.***.*** に接続しました。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. ユーザー (***.***.***.***:(none)): 【ユーザ名】 331 Please specify the password. パスワード: 230 Login successful. |
[スポンサーリンク]
firewall設定
ファイアウォールを無効化することで、FTP接続が出来ることが確認出来ました
ファイアウォールをずっと無効化する訳にはいかないので、FTP通信は許可するように設定します
先ずは、systemctl start firewalldコマンドで無効化したファイアウォールを有効化します
そして、firewall-cmd –add-service=ftpで一時的に一時的にFTPサービスの通信を許可します
1 |
# systemctl start firewalld |
1 2 |
# firewall-cmd --add-service=ftp success |
この状態で、FTP接続が問題なく出来ることと、拒否する通信は制御出来ていることを確認します
動作が問題なければ、–permanentオプションを付けて、FTPサービスの通信を恒久的に許可するように設定します
設定変更後は、–reloadオプションを実行し、設定を反映します
1 2 |
# firewall-cmd --add-service=ftp --permanent success |
1 2 |
# firewall-cmd --reload success |
SELinux設定
SELinuxも無効化し続けるのは、ベターではないので、有効化します
(無効化したままでいいという方も多いですが、勉強の為戻します)
setenforce 1コマンドで、起動状態をEnforcingにします
1 |
# setenforce 1 |
1 2 |
# getenforce Enforcing |
FTP接続がエラーになります・・・
やはり、SElinuxも有罪です(笑)
SELinuxもftpサービスの通信を許可するように設定します
SElinsxのFTP関連の設定をgetseboolで確認します
ftp関連のブール値はoffとなっていて、アクセスで出来ないようになっているのが分かります
今回はftpd_full_accessをonとして、FTPサービスの通信を許可します
ブール値については、下記サイトに詳しく記載がありました
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# /usr/sbin/getsebool -a | grep ftp ftpd_anon_write --> off ftpd_connect_all_unreserved --> off ftpd_connect_db --> off ftpd_full_access --> off ftpd_use_cifs --> off ftpd_use_fusefs --> off ftpd_use_nfs --> off ftpd_use_passive_mode --> off httpd_can_connect_ftp --> off httpd_enable_ftp_server --> off tftp_anon_write --> off tftp_home_dir --> off |
1 |
# setsebool -P ftpd_full_access on |
1 2 |
# /usr/sbin/getsebool -a | grep ftpd_full_access ftpd_full_access --> on |
無事、firewallもSELinuxも有効な状態で、FTP接続が出来ました
1 2 3 4 5 6 7 8 |
ftp> open ***.***.***.*** ***.***.***.*** に接続しました。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. ユーザー (***.***.***.***:(none)): 【ユーザ名】 331 Please specify the password. パスワード: 230 Login successful. |
vsftpdデーモン(FTPサービス)の常時起動
FTP接続が出来る環境が出来たので、vsftpdデーモンが常に起動するように設定します
systemctl enableコマンドで、vsftpdを起動時に起動するサービスとして設定します
1 2 |
# systemctl enable vsftpd Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service. |
1 2 3 4 |
# systemctl list-unit-files | grep vsftpd vsftpd.service enabled vsftpd@.service disabled vsftpd.target disabled |
FTPサーバを悪戦苦闘しながら、構築することが出来ました
今後、SSL証明書を作成しFTPSでの通信が出来るようにしたいと思います
因みに、Window10からFFFTPで接続も出来ることも確認出来ました
[スポンサーリンク]
コメント