vsftpdは日本語のログ出力に対応していません。調べてみるとソースを1行変えるだけでひとまず出力されるようになるとのことなので、やってみることにしました。少し躓いたので、メモとして残しておきます
環境
CentOS 8.1(x64)
vstpfd 3.0.3
インストール
関連パッケージのインストール
1 |
# dnf install openssl openssl-devel libcap libcap-devel gcc make |
ダウンロード
公式サイトでURLを確認してダウンロード。この記事ではver 3.0.3を使いました
1 2 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対応にする
1 |
# vi builddefs.h |
SSLに対応する場合はビルドの設定を変更します
5行目を#undefから#defineに変更します
1 2 3 |
#undef VSF_BUILD_TCPWRAPPERS #define VSF_BUILD_PAM #define VSF_BUILD_SSL |
この記事ではTCPWrapperは使いません
ログを日本語対応にする
1 |
# vi logging.c |
logging.cファイルを修正します
171 |
str_replace_unprintable(p_str, '?'); |
171行目付近のこの行を削除なりコメントアウトなりします
make
1 2 |
# make # make install |
makeエラー1
1 2 3 |
/usr/bin/ld: -lcap が見つかりません collect2: エラー: ld はステータス 1 で終了しました make: *** [Makefile:29: vsftpd] エラー 1 |
こんなエラーは、/usr/lib64にlibcap.soが見つからない場合におきます。libcapをインストールしていても、今のバージョンのlibcapはファイル名がlibcap.soから変わってしまっています
./vsf_findlibs.shを書き換えるか、シンボリックリンクを貼ることで解決します。今回は後者の手段を取ります。まずライブラリフォルダを確認します
1 2 3 4 5 6 |
# 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のようなファイルがあったらシンボリックリンクを貼ります
1 |
# ln -s /usr/lib64/libcap.so.2 /usr/lib64/libcap.so |
libcap.soとlibcap.so.2.xxを紐づけます
1 2 3 4 5 6 7 |
# 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
1 2 3 4 |
ssl.o: 関数 `ssl_cert_digest' 内: ssl.c:(.text+0x31): `SSL_get_peer_certificate' に対する定義されていない参照です 以下ずらーっと |
このようなエラーが出る場合は、Makefileを少し編集します
1 |
# vi Makefile |
13行目に-lcryptoと-lsslを追記します
13 |
LDFLAGS = -fPIE -pie -Wl,-z,relro -Wl,-z,now,-lcrypto,-lssl |
makeエラー3
make install時に
/usr/share/man/man5/
/usr/share/man/man8/
のディレクトリがないと怒られたら作ってからやりなおします(投げやり)
1 2 3 |
# mkdir /usr/share/man/man5/ # mkdir /usr/share/man/man8/ # make install |
設定
vsftpd.confの編集
1 |
# vi /etc/vsftpd/vsftpd.conf |
適宜設定します
1 2 3 4 5 6 7 8 9 10 11 |
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の確認
1 |
# openssl s_client -connect localhost:21 -starttls ftp |
CentOS8(opensslが1.1.1以上)ならプロトコルがTLS v1.3になっているはずです
サービス化
1 |
# vi /etc/systemd/system/vsftpd.service |
1 2 3 4 5 6 7 8 9 10 11 |
[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 |
1 2 |
# systemctl daemon-reload # systemctl start vsftpd |
ログ確認
あとは日本語ファイル名のものをやりとりしてログを確認
1 |
# cat /var/log/vsftpd.log |
コメント