Ansible: vsftpd でFTPサーバを構築する

はじめに

レガシーなシステムに携わっているとデータ置き場としてFTPサーバによく出くわします。今回は最低限の設定で vsftpd を構築する手順をPlaybook化してみました。

前提

  • OS は RHEL8 を利用する
  • FTPサービスとして vsftpd を利用する

実装

段取りとしては以下のようになります。

  1. vsftpd のインストール
  2. vsftpd の起動
  3. vsftpd の設定&反映(パッシブモード)
  4. firewallFTP 通信許可

上記を踏まえて今回書いたPlaybookは以下の通り。

---
- name: Setup vsftpd
  hosts: servers
  vars:
    pasv_min_port: 10021
    pasv_max_port: 10031
  become: true
  tasks:
    - name: Install vsftpd
      ansible.builtin.dnf:
        name: vsftpd
        state: present

    - name: Start vsftpd
      ansible.builtin.systemd:
        state: started
        name: vsftpd

    - name: Add passive mode to vsftpd
      ansible.builtin.blockinfile:
        path: /etc/vsftpd/vsftpd.conf
        state: present
        block: |
          pasv_enable=Yes
          pasv_min_port={{ pasv_min_port }}
          pasv_max_port={{ pasv_max_port }}
      register: _res

    - name: Restart vsftpd
      ansible.builtin.systemd:
        state: started
        name: vsftpd
      when: _res.changed

    - name: Permit ftp service with firewall
      ansible.posix.firewalld:
        service: ftp
        state: enabled
        permanent: true
        immediate: true

    - name: Enable nf_conntrack_helper kernel module
      ansible.posix.sysctl:
        name: net.netfilter.nf_conntrack_helper
        value: '1'
        sysctl_file: "/etc/sysctl.d/10-nf_conntrack_helper.conf"
        state: present
        reload: true

今回はvsftpdのの設定項目が少ないので blockinfile モジュールで済ませています。

また、パッシブモード時のFTP通信許可設定については sysctl の設定変更( ftp サーバをパッシブモードで起動する場合にfirewall 側で必要な通信許可を行うため、 nf_conntrack_helper カーネルモジュールをロードする)で対応しています。

実行結果は以下の通り。

PLAY [Setup vsftpd] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [server.test.local]

TASK [Install vsftpd] **********************************************************
changed: [server.test.local]

TASK [Start vsftpd] ************************************************************
changed: [server.test.local]

TASK [Add passive mode to vsftpd] **********************************************
changed: [server.test.local]

TASK [Restart vsftpd] **********************************************************
changed: [server.test.local]

TASK [Permit ftp service with firewall] ****************************************
changed: [server.test.local]

TASK [Enable nf_conntrack_helper kernel module] ****************************************
changed: [server.test.local]

PLAY RECAP *********************************************************************
server.test.local      : ok=1    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2回目以降は changed を可能な限りなくしたい派です。再実行結果は以下の通り。

PLAY [Setup vsftpd] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [server.test.local]

TASK [Install vsftpd] **********************************************************
ok: [server.test.local]

TASK [Start vsftpd] ************************************************************
ok: [server.test.local]

TASK [Add passive mode to vsftpd] **********************************************
ok: [server.test.local]

TASK [Restart vsftpd] **********************************************************
skipping: [server.test.local]

TASK [Permit ftp service with firewall] ****************************************
ok: [server.test.local]

TASK [Enable nf_conntrack_helper kernel module] ****************************************
ok: [server.test.local]

PLAY RECAP *********************************************************************
server.test.local      : ok=6    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

ok と skip のみになりました。

まとめ

vsfptd の構築方法についてまとめました。1年に1回くらいFTPサーバ構築のPlaybook作っている気がしたので今回アウトプットでもう大丈夫なはず。

参考情報:

2.8.6. FTP を使用するインストールソースの作成 Red Hat Enterprise Linux 8 | Red Hat Customer Portal

centos - How to configure vsftpd to work with passive mode - Server Fault