「Very Secure FTP Daemon」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (校正(でき・出来)) |
|||
(3人の利用者による、間の9版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category: |
+ | [[Category:FTP サーバー]] |
[[cs:Very Secure FTP Daemon]] |
[[cs:Very Secure FTP Daemon]] |
||
[[en:Very Secure FTP Daemon]] |
[[en:Very Secure FTP Daemon]] |
||
5行目: | 5行目: | ||
[[it:Very Secure FTP Daemon]] |
[[it:Very Secure FTP Daemon]] |
||
[[ru:Very Secure FTP Daemon]] |
[[ru:Very Secure FTP Daemon]] |
||
− | [[zh- |
+ | [[zh-hans:Very Secure FTP Daemon]] |
'''vsftpd''' (Very Secure FTP Daemon) は UNIX ライクなシステム用の、軽量で安定していてセキュアな FTP サーバーです。 |
'''vsftpd''' (Very Secure FTP Daemon) は UNIX ライクなシステム用の、軽量で安定していてセキュアな FTP サーバーです。 |
||
== インストール == |
== インストール == |
||
− | + | {{pkg|vsftpd}} パッケージを[[インストール]]してください。 |
|
− | {{ic|vsftpd.service}} デーモンを[[systemd#ユニットを使う|起動・有効化]]します。 |
+ | インストールしたら {{ic|vsftpd.service}} デーモンを[[systemd#ユニットを使う|起動・有効化]]します。 |
xinetd で vsftpd を使う方法は [[#xinetd を使う]] を見て下さい。 |
xinetd で vsftpd を使う方法は [[#xinetd を使う]] を見て下さい。 |
||
18行目: | 18行目: | ||
== 設定 == |
== 設定 == |
||
vsftpd の設定は {{ic|/etc/vsftpd.conf}} ファイルを編集することでほとんど行えます。ファイルの中に説明がちゃんと書かれているので、このセクションでは重要な変更点を取り上げるにとどめます。利用可能な全てのオプションとドキュメントについては、vsftpd.conf (5) の man ページを見るか [https://security.appspot.com/vsftpd/vsftpd_conf.html オンラインで閲覧] してください。デフォルトのファイルは {{ic|/srv/ftp}} にあります。 |
vsftpd の設定は {{ic|/etc/vsftpd.conf}} ファイルを編集することでほとんど行えます。ファイルの中に説明がちゃんと書かれているので、このセクションでは重要な変更点を取り上げるにとどめます。利用可能な全てのオプションとドキュメントについては、vsftpd.conf (5) の man ページを見るか [https://security.appspot.com/vsftpd/vsftpd_conf.html オンラインで閲覧] してください。デフォルトのファイルは {{ic|/srv/ftp}} にあります。 |
||
+ | |||
+ | {{ic|/etc/hosts.allow}} で接続を有効化します: |
||
+ | # Allow all connections |
||
+ | vsftpd: ALL |
||
+ | # IP adress range |
||
+ | vsftpd: 10.0.0.0/255.255.255.0 |
||
=== アップロードを有効にする === |
=== アップロードを有効にする === |
||
28行目: | 34行目: | ||
=== 匿名ログイン === |
=== 匿名ログイン === |
||
− | 匿名ユーザーがログインできる |
+ | 以下の行で匿名ユーザーがログインできるか制御されています。デフォルトでは、{{ic|/srv/ftp}} からのダウンロードのみ匿名ログインが許可されています: |
+ | {{hc|1=/etc/vsftpd.conf|2= |
||
− | # Allow anonymous login |
||
+ | ... |
||
− | anonymous_enable=YES |
||
− | + | # Allow anonymous FTP? (Beware - allowed by default if you comment this out). |
|
+ | anonymous_enable=YES |
||
− | no_anon_password=YES |
||
+ | ... |
||
− | # Maximum transfer rate for an anonymous client in Bytes/second |
||
+ | # Uncomment this to allow the anonymous FTP user to upload files. This only |
||
− | anon_max_rate=30000 |
||
+ | # has an effect if the above global write enable is activated. Also, you will |
||
− | # Directory to be used for an anonymous login |
||
+ | # obviously need to create a directory writable by the FTP user. |
||
− | anon_root=/example/directory/ |
||
+ | #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 |
||
+ | ... |
||
+ | }} |
||
+ | 以下のオプションも追加することができます (詳しくは {{man|5|vsftpd.conf}} を参照): |
||
+ | {{hc|1=/etc/vsftpd.conf|2= |
||
+ | # No password is required for an anonymous login |
||
+ | no_anon_password=YES |
||
+ | |||
+ | # Maximum transfer rate for an anonymous client in Bytes/second |
||
+ | anon_max_rate=30000 |
||
+ | |||
+ | # Directory to be used for an anonymous login |
||
+ | anon_root=/example/directory/ |
||
+ | }} |
||
=== Chroot 監獄 === |
=== Chroot 監獄 === |
||
+ | chroot 環境をセットアップすることでユーザーからホームディレクトリを隔離することができます。以下の行を {{ic|/etc/vsftpd.conf}} に追加してください: |
||
− | A chroot environment that prevents the user from leaving its home directory can be set up. To enable this, add the following lines to {{ic|/etc/vsftpd.conf}}: |
||
chroot_list_enable=YES |
chroot_list_enable=YES |
||
chroot_list_file=/etc/vsftpd.chroot_list |
chroot_list_file=/etc/vsftpd.chroot_list |
||
− | + | {{Ic|chroot_list_file}} 変数には監獄化するユーザーを記述したファイルを指定します。 |
|
+ | 以下の行を記述することで、環境をさらに制限することができます: |
||
− | For a more restricted environment, specify the line: |
||
chroot_local_user=YES |
chroot_local_user=YES |
||
+ | ローカルユーザーがデフォルトで監獄化されます。この場合、{{Ic|chroot_list_file}} で指定されたファイルのユーザーだけが chroot 監獄に入らないことになります。 |
||
− | This will make local users jailed by default. In this case, the file specified by {{Ic|chroot_list_file}} lists users that are '''not''' in a chroot jail. |
||
=== ユーザーログインの制限 === |
=== ユーザーログインの制限 === |
||
+ | ユーザーが FTP サーバーにログインできないようにするには {{ic|/etc/vsftpd.conf}} に以下の2行を追加: |
||
− | It's possible to prevent users from logging into the FTP server by adding two lines to {{ic|/etc/vsftpd.conf}}: |
||
userlist_enable=YES |
userlist_enable=YES |
||
userlist_file=/etc/vsftpd.user_list |
userlist_file=/etc/vsftpd.user_list |
||
+ | {{Ic|userlist_file}} にはログインを許可しないユーザーを記載したファイルを指定します。 |
||
− | {{Ic|userlist_file}} now specifies the file which lists users that are not able to login. |
||
+ | 特定のユーザーだけログインを許可したい場合、以下の行を追加: |
||
− | If you only want to allow certain users to login, add the line: |
||
userlist_deny=NO |
userlist_deny=NO |
||
+ | {{Ic|userlist_file}} で指定されたファイルに記述されているユーザーはログインできるようになります。 |
||
− | The file specified by {{Ic|userlist_file}} will now contain users that are able to login. |
||
=== 接続の制限 === |
=== 接続の制限 === |
||
+ | データ転送レート (1つの IP から接続できるクライアント数や接続数) は {{ic|/etc/vsftpd.conf}} に以下を記述することで制限できます: |
||
− | The data transfer rate, i.e. number of clients and connections per IP for local users can be limited by adding the information in {{ic|/etc/vsftpd.conf}}: |
||
local_max_rate=1000000 # Maximum data transfer rate in bytes per second |
local_max_rate=1000000 # Maximum data transfer rate in bytes per second |
||
max_clients=50 # Maximum number of clients that may be connected |
max_clients=50 # Maximum number of clients that may be connected |
||
66行目: | 90行目: | ||
=== xinetd を使う === |
=== xinetd を使う === |
||
+ | Xinetd は接続の監視と制御について強力な機能を持っています。ただし普通の vsftpd サーバーでは無用の代物です。 |
||
− | Xinetd provides enhanced capabilities for monitoring and controlling connections. It is not necessary though for a basic good working vsftpd-server. |
||
+ | vsftpd をインストールすると必要なサービスファイル ({{ic|/etc/xinetd.d/vsftpd}}) が追加されます。サービスはデフォルトでは無効化されています。ftp サービスを有効化: |
||
− | Installation of vsftpd will add a necessary service file, {{ic|/etc/xinetd.d/vsftpd}}. By default services are disabled. Enable the ftp service: |
||
<pre> |
<pre> |
||
service ftp |
service ftp |
||
82行目: | 106行目: | ||
</pre> |
</pre> |
||
+ | vsftpd デーモンをスタンドアロンモードで実行する場合、{{ic|/etc/vsftpd.conf}} に以下の変更を加えてください: |
||
− | If you have set the vsftpd daemon to run in standalone mode make the following change in {{ic|/etc/vsftpd.conf}}: |
||
listen=NO |
listen=NO |
||
+ | 上記の設定をしないと接続ができません: |
||
− | Otherwise connection will fail: |
||
500 OOPS: could not bind listening IPv4 socket |
500 OOPS: could not bind listening IPv4 socket |
||
vsftpd デーモンを起動する代わりに {{ic|xinetd.service}} を起動・有効化してください。 |
vsftpd デーモンを起動する代わりに {{ic|xinetd.service}} を起動・有効化してください。 |
||
− | === SSL を使って FTP をセキュア化 === |
+ | === SSL/TLS を使って FTP をセキュア化 === |
− | 以下のように |
+ | まず TLS を使うために ''X.509 SSL/TLS'' 証明書が必要です。証明書がない場合、以下のようにして自己署名証明書を簡単に生成できます: |
# cd /etc/ssl/certs |
# cd /etc/ssl/certs |
||
− | # openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout |
+ | # openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout vsftpd.pem -out vsftpd.pem |
− | # chmod 600 |
+ | # chmod 600 vsftpd.pem |
+ | 会社情報などが要求されます。証明書が信頼できる証明書でない場合、入力する情報はとくに意味はなく、ただ単に暗号化にのみ使われます。信頼できる証明書を使う場合、[[Let's Encrypt]] などの認証局から証明書を入手してください。 |
||
− | You will be asked a lot of Questions about your Company etc., as your Certificate is not a trusted one it doesn't really matter what you fill in. You will use this for encryption! If you plan to use this in a matter of trust get one from a CA like thawte, verisign etc. |
||
+ | それから設定ファイルを編集: |
||
− | edit your configuration {{ic|/etc/vsftpd.conf}} |
||
+ | {{hc|/etc/vsftpd.conf|2=ssl_enable=YES |
||
− | <pre> |
||
− | #this is important |
||
− | ssl_enable=YES |
||
− | #choose what you like, if you accept |
+ | #choose what you like, if you accept anonymous connections, you may want to enable this |
− | # you may want to enable this |
||
# allow_anon_ssl=NO |
# allow_anon_ssl=NO |
||
+ | #by default all non anonymous logins and forced to use SSL to send and receive password and data, set to NO to allow non secure connections |
||
− | #choose what you like, |
||
+ | force_local_logins_ssl=NO |
||
− | # it's a matter of performance i guess |
||
− | + | force_local_data_ssl=NO |
|
+ | #you should at least enable TLS v1 if you enable SSL |
||
− | #choose what you like |
||
− | force_local_logins_ssl=YES |
||
− | |||
− | #you should at least enable this if you enable ssl... |
||
ssl_tlsv1=YES |
ssl_tlsv1=YES |
||
+ | #these options will permit or prevent SSL v2 and v3 protocol connections. TLS v1 connections are preferred. |
||
− | #choose what you like |
||
− | ssl_sslv2= |
+ | ssl_sslv2=NO |
− | #choose what you like |
||
ssl_sslv3=YES |
ssl_sslv3=YES |
||
+ | |||
− | #give the correct path to your currently generated *.pem file |
||
+ | #give the correct path to your .pem file |
||
rsa_cert_file=/etc/ssl/certs/vsftpd.pem |
rsa_cert_file=/etc/ssl/certs/vsftpd.pem |
||
− | #the |
+ | #the .pem file also contains the private key |
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem |
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem |
||
+ | }} |
||
− | </pre> |
||
+ | === パッシブモードでホスト名を解決 === |
||
− | === ダイナミック DNS === |
||
+ | |||
− | {{ic|/etc/vsftpd.conf}} に以下の二行を記述してください: |
||
+ | vsftpd がパッシブモードで宣伝する IP アドレスを上書きしてサーバーのホスト名を起動時に DNS で解決するようにするには、{{ic|/etc/vsftpd.conf}} に以下の行を追加してください: |
||
pasv_addr_resolve=YES |
pasv_addr_resolve=YES |
||
− | pasv_address=yourdomain. |
+ | pasv_address=''yourdomain.org'' |
+ | |||
− | It is '''not''' necessary to use a script that updates pasv_address periodically and restarts the server, as it can be found elsewhere! |
||
+ | {{Note| |
||
− | {{Note|You won't be able to connect in passive mode via LAN anymore. Try the active mode on your LAN PC's FTP client.}} |
||
+ | * ダイナミック DNS の場合、''pasv_address'' を定期的に更新したりサーバーを再起動する必要はありません。 |
||
+ | * パッシブモードを使っているときに LAN 経由で接続できないときは、LAN クライアントからではなくアクティブモードを使ってみてください。 |
||
+ | }} |
||
=== ポートの設定 === |
=== ポートの設定 === |
||
+ | デフォルトの FTP 受信ポートやパッシブモードのデータポートを調整する必要があります: |
||
− | Especially for private FTP servers that are exposed to the web it's recommended to change the listening port to something other than the standard port 21. This can be done using the following lines in {{ic|/etc/vsftpd.conf}}: |
||
+ | * FTP サーバーをウェブ上に公開する場合、サーバーが攻撃される危険性を少なくするため、受信ポートを標準ポートの 21 以外に変更すると良いでしょう。 |
||
− | listen_port=2211 |
||
+ | * パッシブモードで開くポートを制限したい場合、範囲を指定することができます。 |
||
− | Furthermore a custom passive port range can be given by: |
||
+ | ポートは設定ファイルで以下のように定義できます: |
||
− | pasv_min_port=49152 |
||
+ | {{hc|/etc/vsftpd.conf|2= |
||
− | pasv_max_port=65534 |
||
+ | listen_port=2211 |
||
+ | |||
+ | pasv_min_port=5000 |
||
+ | pasv_max_port=5003 |
||
+ | }} |
||
=== iptables の設定 === |
=== iptables の設定 === |
||
+ | FTP デーモンを実行するサーバーが [[iptables]] ファイアウォールで保護されている可能性があります。FTP サーバーにアクセスできるように、以下のようにして適切なポートを開く必要があります: |
||
− | Often the server running the FTP daemon is protected by an [[iptables]] firewall. To allow access to the FTP server the corresponding port needs to be opened using something like |
||
− | # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport |
+ | # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT |
+ | この記事では iptables を設定する方法に関する説明はしません。次のページを見て下さい: [[シンプルなステートフルファイアウォール]]。 |
||
− | This article won't provide any instruction on how to set up iptables but here is an example: [[Simple stateful firewall]]. |
||
+ | iptables で適切な FTP 接続を処理するにはカーネルモジュールが必要になります。特に ''nf_conntrack_ftp'' は FTP が指定された ''listen_port'' (デフォルトでは 21) をコマンドでのみ使うのに必要です。データ転送は全て別のポートで行われます。FTP デーモンが選択するポートはランダムで、セッションごとに変わります (アクティブモードとパッシブモードのどちらを使っているかにもよります)。iptables でポートのパケットを許可するには、''nf_conntrack_ftp'' が必要です。起動時に自動的にロードするには {{ic|/etc/modules-load.d}} に以下のように新しいファイルを作成: |
||
− | There are some kernel modules needed for proper FTP connection handling by iptables that should be referenced here. Among those especially ''ip_conntrack_ftp''. It is needed as FTP uses the given ''listen_port'' (21 by default) for commands only; all the data transfer is done over different ports. These ports are chosen by the FTP daemon at random and for each session (also depending on whether active or passive mode is used). To tell iptables that packets on ports should be accepted, ''ip_conntrack_ftp'' is required. To load it automatically on boot create a new file in {{ic|/etc/modules-load.d}} e.g.: |
||
# echo nf_conntrack_ftp > /etc/modules-load.d/nf_conntrack_ftp.conf |
# echo nf_conntrack_ftp > /etc/modules-load.d/nf_conntrack_ftp.conf |
||
+ | カーネル 4.7 以上では ''sysctl'' で以下のように ''net.netfilter.nf_conntrack_helper=1'' を設定: |
||
− | If you changed the ''listen_port'' you also need to configure the conntrack module accordingly: |
||
+ | # echo net.netfilter.nf_conntrack_helper=1 > /etc/sysctl.d/70-conntrack.conf |
||
− | {{hc|/etc/modprobe.d/ip_conntrack_ftp.conf|<nowiki> |
||
+ | あるいは以下を使う必要があります: |
||
− | options nf_conntrack_ftp ports=2211 |
||
+ | # iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp |
||
− | </nowiki>}} |
||
+ | == ヒントとテクニック == |
||
− | == Tips and tricks == |
||
− | === PAM と仮想ユーザー |
+ | === PAM と仮想ユーザー === |
+ | [[PAM]] で {{ic|pam_userdb.so}} を使うことはもうできません。代わりの方法として {{AUR|libpam_pwdfile}} を使うことができます。多数のユーザーが存在する環境では {{AUR|pam_mysql}}{{Broken package link|{{aur-mirror|pam_mysql}}}} というセクションもあります。ただし、このセクションでは chroot 環境と {{ic|pam_pwdfile.so}} による認証を設定する方法だけを説明します。 |
||
− | Since PAM no longer provides pam_userdb.so another easy method is to use {{AUR|pam_pwdfile}}. For environments with many users another option could be {{AUR|pam_mysql}}. This section is however limited to explain how to configure a chroot environment and authentication by pam_pwdfile.so. |
||
In this example we create the directory {{ic|vsftpd}}: |
In this example we create the directory {{ic|vsftpd}}: |
||
169行目: | 196行目: | ||
... |
... |
||
− | Next you need to create a PAM service using pam_pwdfile.so and the generated {{ic|/etc/vsftpd/.passwd}} file. In this example we create a |
+ | Next you need to create a PAM service using {{ic|pam_pwdfile.so}} and the generated {{ic|/etc/vsftpd/.passwd}} file. In this example we create a PAM policy for ''vsftpd'' with the following content: |
− | + | {{hc|/etc/pam.d/vsftpd|auth required pam_pwdfile.so pwdfile /etc/vsftpd/.passwd |
|
− | + | account required pam_permit.so}} |
|
Now it is time to create a home for the virtual users. In the example {{ic|/srv/ftp}} is decided to host data for virtual users, which also reflects the default directory structure of Arch. First create the general user virtual and make {{ic|/srv/ftp}} its home: |
Now it is time to create a home for the virtual users. In the example {{ic|/srv/ftp}} is decided to host data for virtual users, which also reflects the default directory structure of Arch. First create the general user virtual and make {{ic|/srv/ftp}} its home: |
||
198行目: | 225行目: | ||
Otherwise vsftpd because of default security settings will complain if it detects that chroot is writable. |
Otherwise vsftpd because of default security settings will complain if it detects that chroot is writable. |
||
+ | 最後に {{ic|vsftpd.service}} を[[起動]]してください。 |
||
− | Start the vsftpd daemon: |
||
− | # systemctl start vsftpd |
||
You should now be able to login from a ftp-client with any of the users and passwords stored in {{ic|/etc/vsftpd/.passwd}}. |
You should now be able to login from a ftp-client with any of the users and passwords stored in {{ic|/etc/vsftpd/.passwd}}. |
||
==== 仮想ユーザーにプライベートフォルダを追加 ==== |
==== 仮想ユーザーにプライベートフォルダを追加 ==== |
||
+ | まずユーザーのディレクトリを作成: |
||
− | First create directories for users: |
||
# mkdir /srv/ftp/user1 |
# mkdir /srv/ftp/user1 |
||
# mkdir /srv/ftp/user2 |
# mkdir /srv/ftp/user2 |
||
# chown virtual:virtual /srv/ftp/user?/ |
# chown virtual:virtual /srv/ftp/user?/ |
||
− | + | 次に、{{ic|/etc/vsftpd.conf}} に以下の行を追加: |
|
local_root=/srv/ftp/$USER |
local_root=/srv/ftp/$USER |
||
user_sub_token=$USER |
user_sub_token=$USER |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
− | |||
− | === vsftpd: 最新のカーネル (3.5 以上) と .service で接続できない (Error 500) === |
||
− | {{ic|/etc/vsftpd.conf}} に以下を追加してください: |
||
− | seccomp_sandbox=NO |
||
=== vsftpd: refusing to run with writable root inside chroot() === |
=== vsftpd: refusing to run with writable root inside chroot() === |
||
+ | vsftpd 2.3.5 現在、ユーザーがロックされた chroot ディレクトリに書き込むことはできません。セキュリティ上の脆弱性を防ぐためです。 |
||
− | As of vsftpd 2.3.5, the chroot directory that users are locked to must not be writable. This is in order to prevent a security vulnerabilty. |
||
+ | chroot を有効化して FTP ディレクトリを設定することでアップロードを安全に許可できます: |
||
− | The safe way to allow upload is to keep chroot enabled, and configure your FTP directories. |
||
local_root=/srv/ftp/user |
local_root=/srv/ftp/user |
||
231行目: | 253行目: | ||
# chmod 750 /srv/ftp/user/upload |
# chmod 750 /srv/ftp/user/upload |
||
+ | 必要な場合は: |
||
− | If you must: |
||
+ | |||
+ | このセキュリティ強化の回避策として、{{ic|/etc/vsftpd.conf}} に次の設定を追加できます(vsftpd 3.0.0 以降; [https://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/ Fixing 500 OOPS: vsftpd: refusing to run with writable root inside chroot()] から): |
||
− | You can put this into your {{ic|/etc/vsftpd.conf}} to workaround this security enhancement (since vsftpd 3.0.0; from [http://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/ Fixing 500 OOPS: vsftpd: refusing to run with writable root inside chroot ()]): |
||
allow_writeable_chroot=YES |
allow_writeable_chroot=YES |
||
− | or alternative: |
||
+ | === FileZilla Client: GnuTLS error -8 -15 -110 when connecting via SSL === |
||
− | AUR から {{AUR|vsftpd-ext}} をインストールして設定ファイルに {{ic|1=allow_writable_root=YES}} と設定してください。 |
||
+ | vsftpd は SSL セッションで平文のエラーメッセージを表示します。デバッグするには、一時的に暗号化を解除しないとエラーメッセージを確認できません [http://ramblings.linkerror.com/?p=45]{{Dead link|2023|05|07|status=domain name not resolved}} [https://serverfault.com/questions/772494/vsftpd-list-causes-gnutls-error-15]。 |
||
− | === FileZilla Client: GnuTLS error -8 when connecting via SSL === |
||
+ | |||
− | vsftpd tries to display plain-text error messages in the SSL session. In order to debug this, temporarily disable encryption and you will see the correct error message.[http://ramblings.linkerror.com/?p=45] |
||
+ | これらのエラーは、次の設定を追加することで解決できることが多いです[https://bugzilla.redhat.com/show_bug.cgi?id=845980]: |
||
+ | {{ic|1=seccomp_sandbox=NO}} |
||
=== vsftpd.service がブート時に起動しない === |
=== vsftpd.service がブート時に起動しない === |
||
− | vsftpd を有効にしてもブート時に起動しない場合、サービスファイルが network.target の後にロードされるように設定されているか確認してください: |
||
+ | {{ic|vsftpd.service}} を有効にしても起動時に実行に失敗する場合は、サービスファイルを[[編集]]して、{{ic|network.target}} の後に読み込まれるように設定してください: |
||
− | {{hc|/usr/lib/systemd/system/vsftpd.service|2= |
||
+ | |||
+ | {{hc|vsftpd.service|2= |
||
[Unit] |
[Unit] |
||
Description=vsftpd daemon |
Description=vsftpd daemon |
||
After=network.target |
After=network.target |
||
}} |
}} |
||
+ | |||
+ | === パッシブモードがリモート接続にローカルIPアドレスを返す === |
||
+ | |||
+ | vsftpd がリモート接続にローカルアドレスを返す場合、例えば: |
||
+ | |||
+ | 227 Entering Passive Mode (192,168,0,19,192,27). |
||
+ | |||
+ | FTP サーバーが NAT ルーターの背後にある場合、一部のデバイスはFTP接続を監視して、PASV 応答を含むパケットのローカル IP アドレス仕様を外部 IP アドレスに動的に置き換えますが、そうでない場合もあります。 |
||
+ | |||
+ | vsftpd 設定で外部 IP アドレスを指定します: |
||
+ | |||
+ | pasv_address='''externalIPaddress''' |
||
+ | |||
+ | または代替として: |
||
+ | |||
+ | pasv_addr_resolve=YES |
||
+ | pasv_address='''my.domain.name''' |
||
+ | |||
+ | この変更後、内部接続が不可能になった場合、内部と外部の接続用に 2 つの vsftpd を実行する必要があります。 |
||
+ | |||
+ | {{Tip|NAT ルーターが PASV 応答を傍受して内部 IP を外部 IP に置き換えているかどうかを確認するには、クライアント側で TLS モードのサーバー応答をチェックすることができます。暗号化されたパケットはルーターによって識別されず、変更されません。}} |
||
+ | |||
+ | === ipv6 のみがエラーで失敗する: run two copies of vsftpd for IPv4 and IPv6 === |
||
+ | |||
+ | おそらく次の行をコメントアウトしています |
||
+ | |||
+ | # 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=YES |
||
+ | # |
||
+ | # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 |
||
+ | # sockets, you must run two copies of vsftpd with two configuration files. |
||
+ | # Make sure, that one of the listen options is commented !! |
||
+ | listen_ipv6=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 |
||
+ | |||
+ | === vsftpd の接続が nis を使用するマシンで失敗する: yp_bind_client_create_v2: RPC: Unable to send === |
||
+ | |||
+ | vsftpd faq ページに記載されているように、"...組み込みのサンドボックスは Linux 上でネットワーク分離を使用します。これが、操作やルックアップを行うためにネットワークを使用する必要があるモジュールと干渉する可能性があります" |
||
+ | |||
+ | {{ic|/etc/vsftpd.conf}} に次の未文書の行を追加します |
||
+ | |||
+ | isolate_network=NO |
||
+ | |||
+ | === LIST コマンドが接続をリセットする === |
||
+ | |||
+ | {{ic|vsftpd.conf}} ファイルに |
||
+ | seccomp_sandbox=NO |
||
+ | を追加することで、この問題を修正できます。 |
||
== 参照 == |
== 参照 == |
2024年7月10日 (水) 20:46時点における最新版
vsftpd (Very Secure FTP Daemon) は UNIX ライクなシステム用の、軽量で安定していてセキュアな FTP サーバーです。
目次
- 1 インストール
- 2 設定
- 3 ヒントとテクニック
- 4 トラブルシューティング
- 4.1 vsftpd: refusing to run with writable root inside chroot()
- 4.2 FileZilla Client: GnuTLS error -8 -15 -110 when connecting via SSL
- 4.3 vsftpd.service がブート時に起動しない
- 4.4 パッシブモードがリモート接続にローカルIPアドレスを返す
- 4.5 ipv6 のみがエラーで失敗する: run two copies of vsftpd for IPv4 and IPv6
- 4.6 vsftpd の接続が nis を使用するマシンで失敗する: yp_bind_client_create_v2: RPC: Unable to send
- 4.7 LIST コマンドが接続をリセットする
- 5 参照
インストール
インストールしたら vsftpd.service
デーモンを起動・有効化します。
xinetd で vsftpd を使う方法は #xinetd を使う を見て下さい。
設定
vsftpd の設定は /etc/vsftpd.conf
ファイルを編集することでほとんど行えます。ファイルの中に説明がちゃんと書かれているので、このセクションでは重要な変更点を取り上げるにとどめます。利用可能な全てのオプションとドキュメントについては、vsftpd.conf (5) の man ページを見るか オンラインで閲覧 してください。デフォルトのファイルは /srv/ftp
にあります。
/etc/hosts.allow
で接続を有効化します:
# Allow all connections vsftpd: ALL # IP adress range vsftpd: 10.0.0.0/255.255.255.0
アップロードを有効にする
アップロードなどの、ファイルシステムへの変更を可能にするには、/etc/vsftpd.conf
で WRITE_ENABLE
フラグを YES に設定する必要があります:
write_enable=YES
ローカルユーザーログイン
/etc/passwd
のユーザーがログインできるようにするには /etc/vsftpd.conf
に以下の行を設定する必要があります:
local_enable=YES
匿名ログイン
以下の行で匿名ユーザーがログインできるか制御されています。デフォルトでは、/srv/ftp
からのダウンロードのみ匿名ログインが許可されています:
/etc/vsftpd.conf
... # Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=YES ... # 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. #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 ...
以下のオプションも追加することができます (詳しくは vsftpd.conf(5) を参照):
/etc/vsftpd.conf
# No password is required for an anonymous login no_anon_password=YES # Maximum transfer rate for an anonymous client in Bytes/second anon_max_rate=30000 # Directory to be used for an anonymous login anon_root=/example/directory/
Chroot 監獄
chroot 環境をセットアップすることでユーザーからホームディレクトリを隔離することができます。以下の行を /etc/vsftpd.conf
に追加してください:
chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list
chroot_list_file
変数には監獄化するユーザーを記述したファイルを指定します。
以下の行を記述することで、環境をさらに制限することができます:
chroot_local_user=YES
ローカルユーザーがデフォルトで監獄化されます。この場合、chroot_list_file
で指定されたファイルのユーザーだけが chroot 監獄に入らないことになります。
ユーザーログインの制限
ユーザーが FTP サーバーにログインできないようにするには /etc/vsftpd.conf
に以下の2行を追加:
userlist_enable=YES userlist_file=/etc/vsftpd.user_list
userlist_file
にはログインを許可しないユーザーを記載したファイルを指定します。
特定のユーザーだけログインを許可したい場合、以下の行を追加:
userlist_deny=NO
userlist_file
で指定されたファイルに記述されているユーザーはログインできるようになります。
接続の制限
データ転送レート (1つの IP から接続できるクライアント数や接続数) は /etc/vsftpd.conf
に以下を記述することで制限できます:
local_max_rate=1000000 # Maximum data transfer rate in bytes per second max_clients=50 # Maximum number of clients that may be connected max_per_ip=2 # Maximum connections per IP
xinetd を使う
Xinetd は接続の監視と制御について強力な機能を持っています。ただし普通の vsftpd サーバーでは無用の代物です。
vsftpd をインストールすると必要なサービスファイル (/etc/xinetd.d/vsftpd
) が追加されます。サービスはデフォルトでは無効化されています。ftp サービスを有効化:
service ftp { socket_type = stream wait = no user = root server = /usr/bin/vsftpd log_on_success += HOST DURATION log_on_failure += HOST disable = no }
vsftpd デーモンをスタンドアロンモードで実行する場合、/etc/vsftpd.conf
に以下の変更を加えてください:
listen=NO
上記の設定をしないと接続ができません:
500 OOPS: could not bind listening IPv4 socket
vsftpd デーモンを起動する代わりに xinetd.service
を起動・有効化してください。
SSL/TLS を使って FTP をセキュア化
まず TLS を使うために X.509 SSL/TLS 証明書が必要です。証明書がない場合、以下のようにして自己署名証明書を簡単に生成できます:
# cd /etc/ssl/certs # openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout vsftpd.pem -out vsftpd.pem # chmod 600 vsftpd.pem
会社情報などが要求されます。証明書が信頼できる証明書でない場合、入力する情報はとくに意味はなく、ただ単に暗号化にのみ使われます。信頼できる証明書を使う場合、Let's Encrypt などの認証局から証明書を入手してください。
それから設定ファイルを編集:
/etc/vsftpd.conf
ssl_enable=YES #choose what you like, if you accept anonymous connections, you may want to enable this # allow_anon_ssl=NO #by default all non anonymous logins and forced to use SSL to send and receive password and data, set to NO to allow non secure connections force_local_logins_ssl=NO force_local_data_ssl=NO #you should at least enable TLS v1 if you enable SSL ssl_tlsv1=YES #these options will permit or prevent SSL v2 and v3 protocol connections. TLS v1 connections are preferred. ssl_sslv2=NO ssl_sslv3=YES #give the correct path to your .pem file rsa_cert_file=/etc/ssl/certs/vsftpd.pem #the .pem file also contains the private key rsa_private_key_file=/etc/ssl/certs/vsftpd.pem
パッシブモードでホスト名を解決
vsftpd がパッシブモードで宣伝する IP アドレスを上書きしてサーバーのホスト名を起動時に DNS で解決するようにするには、/etc/vsftpd.conf
に以下の行を追加してください:
pasv_addr_resolve=YES pasv_address=yourdomain.org
ポートの設定
デフォルトの FTP 受信ポートやパッシブモードのデータポートを調整する必要があります:
- FTP サーバーをウェブ上に公開する場合、サーバーが攻撃される危険性を少なくするため、受信ポートを標準ポートの 21 以外に変更すると良いでしょう。
- パッシブモードで開くポートを制限したい場合、範囲を指定することができます。
ポートは設定ファイルで以下のように定義できます:
/etc/vsftpd.conf
listen_port=2211 pasv_min_port=5000 pasv_max_port=5003
iptables の設定
FTP デーモンを実行するサーバーが iptables ファイアウォールで保護されている可能性があります。FTP サーバーにアクセスできるように、以下のようにして適切なポートを開く必要があります:
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
この記事では iptables を設定する方法に関する説明はしません。次のページを見て下さい: シンプルなステートフルファイアウォール。
iptables で適切な FTP 接続を処理するにはカーネルモジュールが必要になります。特に nf_conntrack_ftp は FTP が指定された listen_port (デフォルトでは 21) をコマンドでのみ使うのに必要です。データ転送は全て別のポートで行われます。FTP デーモンが選択するポートはランダムで、セッションごとに変わります (アクティブモードとパッシブモードのどちらを使っているかにもよります)。iptables でポートのパケットを許可するには、nf_conntrack_ftp が必要です。起動時に自動的にロードするには /etc/modules-load.d
に以下のように新しいファイルを作成:
# echo nf_conntrack_ftp > /etc/modules-load.d/nf_conntrack_ftp.conf
カーネル 4.7 以上では sysctl で以下のように net.netfilter.nf_conntrack_helper=1 を設定:
# echo net.netfilter.nf_conntrack_helper=1 > /etc/sysctl.d/70-conntrack.conf
あるいは以下を使う必要があります:
# iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
ヒントとテクニック
PAM と仮想ユーザー
PAM で pam_userdb.so
を使うことはもうできません。代わりの方法として libpam_pwdfileAUR を使うことができます。多数のユーザーが存在する環境では pam_mysqlAUR[リンク切れ: アーカイブ: aur-mirror] というセクションもあります。ただし、このセクションでは chroot 環境と pam_pwdfile.so
による認証を設定する方法だけを説明します。
In this example we create the directory vsftpd
:
# mkdir /etc/vsftpd
One option to create and store user names and passwords is to use the Apache generator htpasswd:
# htpasswd -c /etc/vsftpd/.passwd
A problem with the above command is that vsftpd might not be able to read the generated MD5 hashed password. If running the same command with the -d switch, crypt() encryption, password become readable by vsftpd, but the downside of this is less security and a password limited to 8 characters. Openssl could be used to produce a MD5 based BSDvsftpd-ext password with algorithm 1:
# openssl passwd -1
Whatever solution the produced /etc/vsftpd/.passwd
should look like this:
username1:hashed_password1 username2:hashed_password2 ...
Next you need to create a PAM service using pam_pwdfile.so
and the generated /etc/vsftpd/.passwd
file. In this example we create a PAM policy for vsftpd with the following content:
/etc/pam.d/vsftpd
auth required pam_pwdfile.so pwdfile /etc/vsftpd/.passwd account required pam_permit.so
Now it is time to create a home for the virtual users. In the example /srv/ftp
is decided to host data for virtual users, which also reflects the default directory structure of Arch. First create the general user virtual and make /srv/ftp
its home:
# useradd -d /srv/ftp virtual
Make virtual the owner:
# chown virtual:virtual /srv/ftp
A basic /etc/vsftpd.conf
with no private folders configured, which will default to the home folder of the virtual user:
# pointing to the correct PAM service file pam_service_name=vsftpd write_enable=YES hide_ids=YES listen=YES connect_from_port_20=YES anonymous_enable=NO local_enable=YES dirmessage_enable=YES xferlog_enable=YES chroot_local_user=YES guest_enable=YES guest_username=virtual virtual_use_local_privs=YES
Some parameters might not be necessary for your own setup. If you want the chroot environment to be writable you will need to add the following to the configuration file:
allow_writeable_chroot=YES
Otherwise vsftpd because of default security settings will complain if it detects that chroot is writable.
最後に vsftpd.service
を起動してください。
You should now be able to login from a ftp-client with any of the users and passwords stored in /etc/vsftpd/.passwd
.
仮想ユーザーにプライベートフォルダを追加
まずユーザーのディレクトリを作成:
# mkdir /srv/ftp/user1 # mkdir /srv/ftp/user2 # chown virtual:virtual /srv/ftp/user?/
次に、/etc/vsftpd.conf
に以下の行を追加:
local_root=/srv/ftp/$USER user_sub_token=$USER
トラブルシューティング
vsftpd: refusing to run with writable root inside chroot()
vsftpd 2.3.5 現在、ユーザーがロックされた chroot ディレクトリに書き込むことはできません。セキュリティ上の脆弱性を防ぐためです。
chroot を有効化して FTP ディレクトリを設定することでアップロードを安全に許可できます:
local_root=/srv/ftp/user
# mkdir -p /srv/ftp/user/upload # # chmod 550 /srv/ftp/user # chmod 750 /srv/ftp/user/upload
必要な場合は:
このセキュリティ強化の回避策として、/etc/vsftpd.conf
に次の設定を追加できます(vsftpd 3.0.0 以降; Fixing 500 OOPS: vsftpd: refusing to run with writable root inside chroot() から):
allow_writeable_chroot=YES
FileZilla Client: GnuTLS error -8 -15 -110 when connecting via SSL
vsftpd は SSL セッションで平文のエラーメッセージを表示します。デバッグするには、一時的に暗号化を解除しないとエラーメッセージを確認できません [1][リンク切れ 2023-05-07] [2]。
これらのエラーは、次の設定を追加することで解決できることが多いです[3]:
seccomp_sandbox=NO
vsftpd.service がブート時に起動しない
vsftpd.service
を有効にしても起動時に実行に失敗する場合は、サービスファイルを編集して、network.target
の後に読み込まれるように設定してください:
vsftpd.service
[Unit] Description=vsftpd daemon After=network.target
パッシブモードがリモート接続にローカルIPアドレスを返す
vsftpd がリモート接続にローカルアドレスを返す場合、例えば:
227 Entering Passive Mode (192,168,0,19,192,27).
FTP サーバーが NAT ルーターの背後にある場合、一部のデバイスはFTP接続を監視して、PASV 応答を含むパケットのローカル IP アドレス仕様を外部 IP アドレスに動的に置き換えますが、そうでない場合もあります。
vsftpd 設定で外部 IP アドレスを指定します:
pasv_address=externalIPaddress
または代替として:
pasv_addr_resolve=YES pasv_address=my.domain.name
この変更後、内部接続が不可能になった場合、内部と外部の接続用に 2 つの vsftpd を実行する必要があります。
ipv6 のみがエラーで失敗する: run two copies of vsftpd for IPv4 and IPv6
おそらく次の行をコメントアウトしています
# 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=YES # # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 # sockets, you must run two copies of vsftpd with two configuration files. # Make sure, that one of the listen options is commented !! listen_ipv6=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
vsftpd の接続が nis を使用するマシンで失敗する: yp_bind_client_create_v2: RPC: Unable to send
vsftpd faq ページに記載されているように、"...組み込みのサンドボックスは Linux 上でネットワーク分離を使用します。これが、操作やルックアップを行うためにネットワークを使用する必要があるモジュールと干渉する可能性があります"
/etc/vsftpd.conf
に次の未文書の行を追加します
isolate_network=NO
LIST コマンドが接続をリセットする
vsftpd.conf
ファイルに
seccomp_sandbox=NO
を追加することで、この問題を修正できます。