raspberrypi4b+docker-compose+alpine+xinetd+vsftpd

ftpサービスとしてvsftpdをお使いの方も多いかと思いますが、vsftpd.confで

listen=YES
pasv_addr_resolve=YES
pasv_address=kamikopanda.ddns.net

こんな感じでftpサービスをdnsでアクセスできるようにしていると、IPアドレスが変更された際にパッシブモードでアクセスできなくなる。vsftpdのプロセスが一度解決した名前は、再解決しないことが原因です。対策は、listen=NOとしてxinetdでアクセスの都度vsftpdが起動されるようにすることです。その対策を実施したのが下記。

FROM alpine

COPY startup.sh /
CMD ["/bin/sh","/startup.sh"]
version: "3.5"
services:
  ftp:
      build: .
      container_name: ftp
      hostname: ftp
      networks:
        - shared
      volumes:
        - /etc/localtime:/etc/localtime
        - ../../letsencrypt:/etc/letsencrypt
        - ./libpam-pwdfile.zip:/tmp/libpam-pwdfile.zip
        - ./vsftpd.conf:/etc/vsftpd/vsftpd.conf
        - ./passwd:/etc/vsftpd/passwd
        - ./xinetd.conf:/etc/xinetd.conf
        - ./vsftpd:/etc/pam.d/vsftpd
        - /mnt/disk/ftp:/mnt/disk/ftp
        - ../log:/var/log
      privileged: true
      ports:
          - "20:20"
          - "21:21"
          - "990:990"
          - "60000-60030:60000-60030"
      restart: always
networks:
  shared:
    external: true
#!/bin/sh

cd /tmp

apk add --update build-base git linux-headers bsd-compat-headers

wget https://downloads.sourceforge.net/project/libtirpc/libtirpc/1.2.6/libtirpc-1.2.6.tar.bz2
tar xvjf libtirpc*.tar.bz2
cd libtirpc*
./configure --enable-static --disable-gssapi
make
make install
cd ..

git clone https://github.com/xinetd-org/xinetd
cd xinetd
CFLAGS="-s -I/usr/include/tirpc" CPPFLAGS="-DHAVE_RLIM_T" ./configure
LDFLAGS="-Wl,-Bstatic -ltirpc -Wl,-Bdynamic" make
make install
cd ..

apk --update add vsftpd apache2-utils build-base linux-pam-dev

touch /etc/vsftpd/chroot_list
touch /etc/vsftpd/deny_user

cd /tmp

unzip libpam-pwdfile.zip
cd libpam-pwdfile
make install

xinetd
tail -f /dev/null
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=000
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO

log_ftp_protocol=YES
dual_log_enable=YES

ascii_upload_enable=YES
ascii_download_enable=YES

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

ls_recurse_enable=YES

listen=NO
use_localtime=YES
force_dot_files=YES

pasv_min_port=60000
pasv_max_port=60030
pasv_addr_resolve=YES
pasv_address=kamikopanda.ddns.net

file_open_mode=0777

virtual_use_local_privs=YES
anon_umask=000
anon_world_readable_only=NO
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
guest_username=ftp
guest_enable=YES

userlist_enable=YES
userlist_file=/etc/vsftpd/deny_user

pam_service_name=vsftpd

local_root=/mnt/disk/ftp/$USER
user_sub_token=$USER

allow_writeable_chroot=YES

ssl_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=kEECDH+AESGCM+AES128:kEECDH+AESGCM:kEECDH+AES128:kEECDH+AES:!aNULL:!eNULL:!LOW:!EXP
rsa_cert_file=/etc/letsencrypt/live/kamikopanda.ddns.net/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/kamikopanda.ddns.net/privkey.pem
require_ssl_reuse=NO

force_local_logins_ssl=NO
force_local_data_ssl=NO
service ftp
{
         disable                 = no
         flags                   = NOLIBWRAP
         socket_type             = stream
         protocol                = tcp
         wait                    = no
         user                    = root
         server                  = /usr/sbin/vsftpd
         server_args             = /etc/vsftpd/vsftpd.conf
         nice                    = 10
}
auth required pam_pwdfile.so pwdfile /etc/vsftpd/passwd
account required pam_permit.so

ftpユーザーのパスワードはpamを使って認証するが、その際のユーザー名とパスワードはpasswdファイルに次のように記録しておく。ここで、ハッシュはhtpasswdコマンドなどで求めておく。

注意:htpasswdで生成したパスワードが$apr1$で始まる場合は使用できない。openssl passwd -1で$1$で始まるパスワードを使用する。

ユーザー名1:**************ここにパスワードハッシュ***************
ユーザー名2:**************ここにパスワードハッシュ***************
sudo docker-compose up -d --build

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です