外注先や他社とFTPを介してファイルを送受信する場合に、FTP専用のユーザを作成して共有する事があるかと思います。 その際、FTP専用ユーザーがサーバー内の全てのディレクトリにアクセスできるのはセキリティ上、好ましく有りません。
本記事では、「特定のディレクトリ配下のみアクセスできる」かつ「シェルにはログインさせない」FTP専用ユーザーの作成方法を解説します。
FTPサーバーの構築から説明していますので、すでに構築済みの方は「FTPユーザの作成」から読み進めていただければと思います。
環境情報
- サーバー:ConoHa VPS
- OS: CentOS 9
FTPサーバーの設定
ConoHa VPSのCentOSサーバーにはFTP(vsftpd)はインストールされていませんので、インストールや諸々の設定を行います。
FTPサーバーのインストールと起動サービスの登録
# rootでログイン sudo yum install -y vsftpd sudo systemctl enable vsftpd sudo systemctl start vsftpd sudo systemctl status vsftpd # FTPユーザでアクセス可能とさせるディレクトリを作成 mkdir -m 777 /var/www/ftp_dir # vsftpdの設定のために作成 touch /etc/vsftpd/chroot_list mkdir /etc/vsftpd/user_conf
vsftpd.confの設定
- vsftpd.confは以下の通り設定しております。
vi /etc/vsftpd/vsftpd.conf
vsftpd.confの設定内容
# 匿名ユーザのログインは許可しない anonymous_enable=NO # ローカルユーザによるログインを許可 local_enable=YES # ファイルに変更を加える FTP コマンドの使用を許可 write_enable=YES # ディレクトリ=755、ファイル=644 local_umask=022 # ログを取得する xferlog_enable=YES # ログの出力先 xferlog_file=/var/log/xferlog.log connect_from_port_20=YES # ユーザのchroot(ユーザーごとのルートディレクトリ)を有効にする chroot_local_user=YES # chroot_listの設定 chroot_list_file=/etc/vsftpd/chroot_list # chroot_listにリストアップしたユーザーはchrootの対象から除外される chroot_list_enable=YES # IPv4で動作させる listen=YES # IPv6で待機しない listen_ipv6=NO # パッシブモードを有効 pasv_enable=YES # IPアドレス pasv_address=【FTPサーバーのIPアドレス】 # PASVで使用するポートの最小番号 pasv_min_port=60001 # PASVで使用するポートの最大番号 pasv_max_port=60010 # ls時にドットファイルを含む force_dot_files=YES # ファイルのタイムスタンプはユーザのローカルタイムを使用する use_localtime=YES # ユーザ毎の設定ファイルを置くディレクトリ user_config_dir=/etc/vsftpd/user_conf # 書き込み権限があるとchroot出来ない機能を無効にする allow_writeable_chroot=YES
ファイアウォールの設定
- 初期状態ではFTPはファイアウォールでブロックされてしまいますので、設定を変更します。
# FTPを開放 firewall-cmd --add-service=ftp --permanent # Passive用ポートの開放 firewall-cmd --zone=public --add-port=60001-60010/tcp --permanent # ファイアウォールの再起動 firewall-cmd --reload
サーバーの設定
- 後述の
-s /sbin/nologin
指定によるユーザ作成をすると、CentOS 7以上だとFTP接続時に「530 Login incorrect.」で失敗してしまいます。 そのため以下の設定変更をする必要があります。
# rootでログイン vi /etc/shells # 下記を追記して保存します /sbin/nologin
こうすることで、nologin を指定したユーザーでもFTP接続できるようになります。
FTPユーザの作成
① FTPユーザを作成する
# rootでログイン useradd -s /sbin/nologin ftp-user
-s /sbin/nologin
ログインシェルを実行させないための指定です。これによりsshによるログインが不可となります。
② パスワードの設定
passwd ftp-user
- 任意のパスワードを設定します。
③ ftp-userのuser_confを配置
# rootでログイン vi /etc/vsftpd/user_conf/ftp-user # 下記を追記して保存 local_root=/var/www/ftp_dir
- こうすることで、local_rootに指定したディレクトリがftp-userのルートディレクトリになります。
続いてルートディレクトリを作成しておきます
# rootでログイン mkdir -m 777 /var/www/ftp_dir
接続確認
以上でFTPユーザの作成が完了しました。最後に接続確認を行います。
FTPで接続確認
ftp ftp-user@XXX.XXX.XXX.XXX 230 Login successful. ftp>
- 無事接続が成功し、ftpコマンドが使用可能となります。
SSHで接続確認
ssh ftp-user@XXX.XXX.XXX.XXX This account is currently not available.
- nologinの設定により、ログインシェルは無効となります。