CentOS8でvsftpdをソースからインストールしてログを日本語対応にする

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

 

 

コメント

タイトルとURLをコピーしました