vsftpdは日本語のログ出力に対応していません。調べてみるとソースを1行変えるだけでひとまず出力されるようになるとのことなので、やってみることにしました。少し躓いたので、メモとして残しておきます
環境
CentOS 8.1(x64)
vstpfd 3.0.3
インストール
関連パッケージのインストール
# dnf install openssl openssl-devel libcap libcap-devel gcc make
ダウンロード
公式サイトでURLを確認してダウンロード。この記事ではver 3.0.3を使いました
# wget https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz # tar xzfv vsftpd-3.0.3.tar.gz # cd vsftpd-3.0.3
SSL対応にする
# vi builddefs.h
SSLに対応する場合はビルドの設定を変更します
5行目を#undefから#defineに変更します
#undef VSF_BUILD_TCPWRAPPERS #define VSF_BUILD_PAM #define VSF_BUILD_SSL
この記事ではTCPWrapperは使いません
ログを日本語対応にする
# vi logging.c
logging.cファイルを修正します
str_replace_unprintable(p_str, '?');
171行目付近のこの行を削除なりコメントアウトなりします
make
# make # make install
makeエラー1
/usr/bin/ld: -lcap が見つかりません collect2: エラー: ld はステータス 1 で終了しました make: *** [Makefile:29: vsftpd] エラー 1
こんなエラーは、/usr/lib64にlibcap.soが見つからない場合におきます。libcapをインストールしていても、今のバージョンのlibcapはファイル名がlibcap.soから変わってしまっています
./vsf_findlibs.shを書き換えるか、シンボリックリンクを貼ることで解決します。今回は後者の手段を取ります。まずライブラリフォルダを確認します
# ls -l /usr/lib64/libcap* /usr/lib64/libcap-ng.so.0 -> libcap-ng.so.0.0.0 /usr/lib64/libcap-ng.so.0.0.0 /usr/lib64/libcap.so.2 -> libcap.so.2.26 /usr/lib64/libcap.so.2.26
libcap.soがなく、libcap.so.2.xxのようなファイルがあったらシンボリックリンクを貼ります
# ln -s /usr/lib64/libcap.so.2 /usr/lib64/libcap.so
libcap.soとlibcap.so.2.xxを紐づけます
# ls -l /usr/lib64/libcap* /usr/lib64/libcap-ng.so.0 -> libcap-ng.so.0.0.0 /usr/lib64/libcap-ng.so.0.0.0 /usr/lib64/libcap.so -> /usr/lib64/libcap.so.2 /usr/lib64/libcap.so.2 -> libcap.so.2.26 /usr/lib64/libcap.so.2.26
確認。再度makeします
makeエラー2
ssl.o: 関数 ssl_cert_digest' 内:
ssl.c:(.text+0x31): SSL_get_peer_certificate' に対する定義されていない参照です
以下ずらーっと
このようなエラーが出る場合は、Makefileを少し編集します
# vi Makefile
13行目に-lcryptoと-lsslを追記します
LDFLAGS = -fPIE -pie -Wl,-z,relro -Wl,-z,now,-lcrypto,-lssl
makeエラー3
make install時に
/usr/share/man/man5/
/usr/share/man/man8/
のディレクトリがないと怒られたら作ってからやりなおします(投げやり)
# mkdir /usr/share/man/man5/ # mkdir /usr/share/man/man8/ # make install
設定
vsftpd.confの編集
# vi /etc/vsftpd/vsftpd.conf
適宜設定します
ssl_enable=YES rsa_cert_file=/***/*****.pem rsa_private_key_file=/***/*****.pem ssl_sslv2=NO ssl_sslv3=NO ssl_tlsv1=NO force_local_data_ssl=YES force_local_logins_ssl=YES seccomp_sandbox=NO require_ssl_reuse=NO
私の設定の一部。 ssl_tlsv1_1 ~ ssl_tlsv1_3 のオプションがあるようですが、使えませんでした
CentOS8のopensslパッケージは1.1.1以上なのもあり、この設定でもTLS1.2、TLS1.3で動作します(クライアント次第)
起動できない、ログインできない場合は seccomp_sandbox=NO の1行を追加します。vsftpdのseccompオプションは、最新のカーネルバージョン(3.5以上?)でftpコマンドを処理できない原因となるようです
require_ssl_reuse=NO は ssl_reuse に対応してないクライアントから接続したい場合に追加します。クライアントが 522 SSL connection failed; session reuse required のエラーを出して接続できない場合は、追加することで繋がるようになります。例えば、私の場合、Androidの X-plore File Manager が追加しないと接続できませんでした。不要であれば初期値(YES)のままでいいです
SSLの確認
# openssl s_client -connect localhost:21 -starttls ftp
CentOS8(opensslが1.1.1以上)ならプロトコルがTLS v1.3になっているはずです
サービス化
# vi /etc/systemd/system/vsftpd.service
[Unit]
Description=Vsftpd ftp daemon
After=local-network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf
ExecStop=/bin/kill ${MAINPID}
[Install]
WantedBy=multi-user.target
# systemctl daemon-reload # systemctl start vsftpd
ログ確認
あとは日本語ファイル名のものをやりとりしてログを確認
# cat /var/log/vsftpd.log



コメント