「Web技術」タグアーカイブ

LinuxでのFTPのログローテーション方法

Linuxサーバーに自分で追加設定していたFTPのログが溜まってたのでローテーションかけることにしました。

/etc/logrotate.d/proftpdというファイルが存在するので、そこに以下の記述を追加して下さい。

/var/log/proftpd/*.log {
	missingok
	notifempty
	postrotate
		/usr/bin/kill -HUP `cat /var/run/proftpd.pid 2>/dev/null` 2>/dev/null || true
	endscript
}

原理は、logrotateが配下のディレクトリを調べて、そこにある設定に従いログを循環させているだけです。同ディレクトリにはproftpd以外の設定ファイルもありますので、参考に覗いてみては如何でしょうか。

ProFTPの設定方法

Vine Linuxでの設置方法です。FTPには標準ディストリビューションのProFTPを使うことにします。パッケージから探してインストールしましょう。

次に難解な設定です。構築するディレクトリ構成は、少し特殊にしてみようと思います。rootの下にあるpubディレクトリは、全FTPアカウントで共通、同一ディレクトリを表示させる。そこを読み取り専用で公開し、更新モジュール等を管理側から提供できるようにする。FTPユーザ側から見ると下記のようになります。

root (0777)
|
|-pub (0744)

ここでつまづいたのが、この共有ディレクトリpubの作り方。Windows環境でFTPを運用していたときは、WarFTPの機能でバーチャルマッピングで自由に構成可能でした。しかし、ProFTPにはそんな便利な機能ありません。探しに探して行き着いたのはmount。Linuxのファイルシステムを利用しろと言うことです。詳細は/usr/share/doc/proftpd-x.x.x/howto/Chroot.htmlの文末に載っています。ProFTPの機能だけを検索していたばかりに、このシンプルな解答に気づかず苦労しました。灯台下暗し…皆さんも探し回る前にまずはマニュアルを熟読してください。

mount情報は再起動すると初期化されてしまいます。そこで、これをPC起動時に自動的に反映させるようにします。起動時に必ず読み込まれるスクリプト/etc/rc.localに以下の要領で追記。

$ mount --bind olddir newdir <-olddirが共有元

これでnewdirにアクセスするとolddirが操作できるようになります。ちなみに、300個ほどマウントしても大丈夫らしいです(詳細)

次はWAN側からの接続を受け入れるようにしましょう。ProFTPは標準ではPORTコマンドを受付けません。固定ポートが空いてしまうのでセキュリティ的な問題からでしょうか。私も通常ポートの21番は避けたいので、全く別のポートをPASVモードで使用するようにしました。

また、動作方法は、inetd経由でセッション毎に起動するように変更。個人利用ということもあり、メモリ節約のためにデーモン起動での常駐は外しました。少々動作が重くなりますが、セッション毎に設定ファイルを読直すので、DDNSでのIP変化にも対応できるというメリットがあります。

まずはFTP通信ポートの設定、21番以外にしたい場合、inetd設定のためにポート定義名を/etc/servicesに追加します。

ftpEX xxx/tcp <-xxxはポート番号、定義名はftpEX
ftpEX xxx/udp

この定義名(ftpEX)を使って/etc/inetd.confに起動条件を追記してください。tcpwrapperを使って後々通信制御をしたいのでtcpd経由で起動させるようにします。

ftpEX stream tcp nowait root /usr/bin/tcpd in.proftpd

以上でinetdで動作させる下準備は整いました。

お次は一番悩むftpdの詳細設定です。/etc/proftpd.confのコメントやマニュアルを参考にして設定しました。また、パソコンおやじさんのProFTPD設定も参考にしています。

Port xxx <-/etc/servicesと同じ番号にする
MasqueradeAddress xxx <-ルータのWAN側アドレス又はドメイン名(DDNS等)
PassivePorts xxx yyy <-最小ポート番号 最大ポート番号
ServerType inetd <-inetd起動<
DefaultRoot ~/ftp <-各アカウント以下のftpディレクトリをルートとするように設定

LogFormat allinfo "%t :  %u (%a [%h]) : [%s], %T, %m (%f)"
LogFormat write "%t : %u : %F (%a)"
LogFormat read "%t : %u : %F (%a)"
LogFormat auth "%t : %u (%a [%h])"

ExtendedLog /var/log/proftpd/all.log ALL allinfo
ExtendedLog /var/log/proftpd/write.log WRITE write
ExtendedLog /var/log/proftpd/read.log  READ read<
ExtendedLog /var/log/proftpd/auth.log AUTH auth

UseReverseDNS off
IdentLookups off

# Allow clients to resume downloads (default on)
AllowRetrieveRestart on
# Allow clients to resume uploads (default off)
AllowStoreRestart on
# The maximum number of clients allowed to connect per host.(default none: no limit)
MaxClientsPerHost 3
MaxClients 30
# Sets the idle connection timeout (default: 600)
TimeoutIdle 300

<Directory ~/pub>
<Limit READ DIRS RETR>
AllowAll
</Limit>
<Limit WRITE STOR DELE MKD RMD RNFR RNTO SITE_CHMOD>
DenyAll
</Limit>
</Directory>

デーモン常駐はさせないのでサービスはオフに変更です。

最後に、inetdを-HUPオプションで再起動させて設定完了。

$ chkconfig proftpd off
$ chkconfig --list proftpd
$ killall -HUP inetd

samba専用アカウントの追加設定方法

我が家のLinuxに、sambaサーバと、その設定管理画面SWATを追加しました。Windowsの共有フォルダを扱う場合、ftpとsambaを比較すると、明らかに後者のほうが転送が早いです。ファイル転送の速度が体感で100倍は違うかと思われます。LANで繋がってるPC間で、わざわざFTP転送するのも愚かな話ですしね。

さて、私の環境では、WindowsとLinux間で、ユーザ名とパスワードが一致しません。全く同一であれば、何も設定をしないでもフォルダの共有が可能です。私のようなケースでは解決策は2つ。Windowsと同じアカウントをLinuxに作成する。もう1つはsamba専用にWindowsと同一アカウントを追加することです。私は後者を選択しました。本来は、アカウント管理がシステムユーザと別々になるため、保守を考えるとよろしいことではないです。samba専用アカウントの存在を忘れているとLAN内部からファイル転送し放題で脆弱性に繋がってしまうからです。管理は徹底しましょう。

samba専用アカウント追加方法。aオプションは追加の意。foo1はパスワードのフレーズ。コンソールから次のように入力。

$ smbpasswd -a <foo1>

その他はSWATを使ってブラウザから設定です。SWATで設定すると、/etc/samba/samba.confのコメントが全て消されるので、このファイルを後の読解のためにバックアップしておいたほうがいいでしょう。設定項目は難しいところは特にありません。必要な部分をマニュアルを見ながら設定してください。

完了したら、デーモンとして起動させるために、以下のコマンドをコンソールからタイプ。

$ chkconfig smb on  <-サービスon
$ chkconfig --list smb <-on設定になっているか確認
$ service smb start  <-smbdのスタート(同時にnmbdも自動起動)