vsftpdを一発で設定してしまおう

2010.12.06 0:21
 ある程度知識があったらperlでいろいろと一発インストールスクリプトを作るといいと思います。オライリー系の本を読んでいると何かとPerlでごにょごにょするという例が多いし、自分で作るとわかりやすくてなかなかいいです。但し自分のサーバーでRoot権限が自由に使えるというのが条件でレンタルサーバーだと難しいです。また、vsftpdは今現在(2010-2011)はあらゆるセキュリティーホールを孕んでいて、平文のFTP通信はヤバいということになっているのでできればLAN内の設定にとどめておいた方が無難です。FTP over SSLみたいなことを考慮してグローバルに開放した方がいいかもです。

vsftpの設定内容

  • 匿名ユーザー接続を禁止
  • ユーザーはアップロード(put)ダウンロード(get)削除(delete)を行うことができる
  • アップロードファイルはデフォルトでパーミッション644(umask=022)
  • PASVモードのポート設定
  • ポート番号を設定(指定しない場合は標準の21)
  • ユーザーはchrootでhomeディレクトリより上位のアクセス禁止

解説

 基本的にはかなり普通の設定です。FTPは要ログインでrootなんかのログインを禁止。ユーザーは基本的なファイル転送の操作のみ許可。デフォルトでは転送したファイルがパーミッション600になっているので644に変更。Webサーバーなどを設定しているとすぐに公開されるのでこの方が便利です。当然ユーザーが使用することを目的としているのでPASVモードを設定。ポートはデフォルトの1050以降のポートを任意で開きます。(だったと思う。)
 ポート番号の指定ですが、サーバー複数台あるとポートがかぶったりするので一応パラメーターで指定できます。何もしない場合は21に設定されます。
 chrootの設定は、通常のシステムユーザーを対象ってことでUbuntuでUIDが1000番以降ということでそれを設定。ユーザーは/etc/passwdから読んでます。
 最後にvsftpdを再起動するわけですが、"#/etc/inid.d/vsftpd restart"はちょっとダメですよ...と警告されることがあるので、ここでは、"#service vsftpd restart"です。

 実行方法は、適当な場所にvsftpd_config_set.plをおいて、実行権限を与えます。それから、
# perl vsftpd_config_set.pl [ポート番号]
でOKです。ポートは自分で開くこと。
 /etc/vsftpd.confは、設定前のものを/etc/vsftpd.conf_bkでもってバックアップしているので、おかしなことになったら元に戻してください。

#!/usr/bin/perl


#-----------------------
#     任意のポート番号指定
#-----------------------
my ($listen_port) = @ARGV;        # 21以外のポート指定の場合
if (!$listen_port) {
    $listen_port = '21';        # ポート開放デフォルト
}

my $path = '/etc/vsftpd.conf';
my $backup_path = '/etc/vsftpd.conf_bk';
my $chroot_list_file = '/etc/vsftpd.chroot_list';
my $passwd = '/etc/passwd';

# 既存のファイルをバックアップ
my $backup_result = `cp $path $backup_path`;

# 書き込む内容
my $write_down = <<"EOM";
#-------------
# vsftpd.conf
#-------------

listen=YES
#listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=whoever
#xferlog_file=/var/log/vsftpd.log
#xferlog_std_format=YES
idle_session_timeout=600
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
#ftpd_banner=Welcome to blah FTP service.
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd.banned_emails
#chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=$chroot_list_file
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#--------------------------------
listen_port=$listen_port
pasv_promiscuous=YES
EOM

#-------------------------
# vsftpd.confファイル作成
#--------------------------
umask 0;
open(DATA, ">$path");
flock(DATA, 2);
seek(DATA, 0, 0);
print DATA "$write_down";
truncate(DATA, tell(DATA));
close(DATA);
my $chown = `chown root. $path`;
my $chown = `chmod 600 $path`;
print $chown."\n";

#----------------------
# chroot_list_file作成
#----------------------
# (形式) root:x:0:0:root:/root:/bin/bash
open (OUT, "$passwd");   
while (<OUT>) {
    chomp $_;
    my($username, $passwd, $uid, $gid) = split (/:/,$_);   
    if ($uid >= 1000) {
        my $re = push(@user, "$username\t\#$uid");
    }
}   
close(OUT);

umask 0;
open(DATA, ">$chroot_list_file");
flock(DATA, 2);
seek(DATA, 0, 0);
foreach (@user) {
    print DATA "$_\n";
}
truncate(DATA, tell(DATA));
close(DATA);
my $chown = `chown root. $chroot_list_file`;
my $chown = `chmod 600 $chroot_list_file`;

#my $restart = `/etc/init.d/vsftpd restart`;
my $restart = `service vsftpd restart`;

#----------
# 結果表示
#----------
print "Port:: $listen_port\n";
print "Success:: vsftpd.conf set done !\n";
print $restart;
exit;








プロフィール



  • Name :: 山上オサム ♂(39)
  • Hobby :: 武術
  • Work :: Web Designer