sshでアクセス出来るユーザを制限する
CentOS4でsshポートを空けておきつつ,アクセス出来るユーザを制限する場合は以下の行を追加する。
# vi /etc/ssh/sshd_config
---
AllowUsers hoge1 hoge2
---
追加が終わったら再起動して出来上がり。
# service sshd restart
« 2007年01月 | メイン | 2007年03月 »
CentOS4でsshポートを空けておきつつ,アクセス出来るユーザを制限する場合は以下の行を追加する。
# vi /etc/ssh/sshd_config
---
AllowUsers hoge1 hoge2
---
追加が終わったら再起動して出来上がり。
# service sshd restart
vsftpdはCentOS4ではパッケージインストール出来ます。
anonymousサービスは受け付けずシステムユーザだけ使えるようにします。
標準ではlastコマンドで接続履歴が見れないので見えるように設定します。
FTP接続ユーザは自身のディレクトリ以外移動出来ない設定しようと思ったのですが
RedhatES4のリファレンスを見ると chroot_local_user を使うのは危険とあったので今回は見送ることにします。
今回はパッケージを使ってインストールし,実運用するまでを書きます。
まずシステムにインストールされていない場合は以下のコマンドでインストールしましょう。
# yum install vsftpd
設定ファイルはvsftpd.confだけでいけるようです。
注意点としてイコールの前後にスペースが入ってはいけないようです。
# vi /etc/vsftpd/vsftpd.conf
設定は以下。
---
anonymous_enable=NO # anonymousサービスはしない
local_enable=YES # ローカルユーザは利用可能
write_enable=YES # 書き込み可能
local_umask=022 # マスクの設定
dirmessage_enable=NO # ディレクトリ移動の際,.message(デフォルト)ファイルの内容を表示しない
vsftpd_log_file=/var/log/vsftpd.log # ログファイルの指定
xferlog_enable=YES # 接続とファイル転送情報のログを取る
xferlog_std_format=NO # wu-ftpd互換のログファイルにしない
connect_from_port_20=YES
ascii_upload_enable=YES # Asciiモードによる転送を許可
ascii_download_enable=YES
banner_file=/etc/vsftpd/welcome.msg # ウェルカムメッセージ。接続した時点で表示される内容を書くファイル
ls_recurse_enable=YES # 再帰的アップロード,ダウンロードの許可
pam_service_name=vsftpd # PAMを利用する時の名前
listen=YES # スタンドアロンモードで実行
max_clients=50 # スタンドアロンモードの時の最大接続数
tcp_wrappers=YES # hosts.allow hosts.deny によるアクセスを可能に
use_localtime=YES # コンピュータのローカル時間を使う
session_support=YES # ログインセッションの保全(lastコマンドで表示されるようにする)
---
これでOK。
後はシステムに自動起動登録をして起動して様子を見ます。
# chkconfig --level 35 vsftpd on
# chkconfig --list vsftpd
# service vsftpd start
一度接続してみてファイルをアップロードなりダウンロードなりしてみましょう。
そして/var/log/vsftpd.logを見てみます。
接続情報とファイル情報が書かれていればきちんとログがとれています。
lastコマンドも確認しておきましょう。
vsftpdのログが表示されていればOK。
●事前準備
# vi /etc/fstab
---
/dev/md2 /home ext3 defaults,usrquota,grpquota 1 1
---
# mount -o remount /home (再マウント)
or
# reboot
確認コマンド
# mount
---
/dev/sda2 on /home type ext3 (rw,usrquota,grpquota)
---
このような表示がされたらquota機能が使える状態です。
次は実際にユーザ使用量を確認します。
# quotacheck -faugv
# quotacheck -faugvm
a: /etc/mtab にある NFS 以外の全てのファイルシステムをチェックする
f: quota が有効にされているファイルシステムに対して quota ファイルをチェック
u: ユーザクオータのチェック
g: グループクオータのチェック
v: 画面に進行状況を表示
m: ファイルシステムをリードオンリーで再マウントしない(強制的なチェック)
quotacheckコマンドはファイルシステムを読み出し専用で再マウントし,チェックします。
(mオプションをつけるとこの動作はしない)
終わったら元のモードに戻します。
もし/(ルート)ファイルシステムをチェックする場合は -m オプションもつけます。
これでファイルシステムのルート(/home)に aquota.usesr と aquota.group が作成されています。
次のコマンドでquota機能をonにします。
# quotaon -augv
●実際に制限をかける
ユーザhoge1に対して1Mしか許可しない設定の場合はブロック単位でのハード制限を設定する。
edquotaコマンドを実行するとデフォルトでviが起動します。
# edquota hoge1
---
Disk quotas for user hoge1 (uid 502):
Filesystem blocks soft hard inodes soft hard
/dev/sda2 40 0 1024 11 0 0
---
それぞれの意味は順番に,
ファイルシステム名
使用中のブロック数
ブロック単位でのソフト制限
使用中のノード数
ノード数でのソフト制限
ノード数でのハード制限
となります。
●運用時の注意点
マシン再起動時に自動的にクオータのチェックが行われますが,24時間起動のマシンだとcronで定期的にquotacheckコマンドをかけてquota.userとquota.groupを更新してやる必要があります。
●確認コマンド
# repquota -augv
コマンドラインから簡単にPERLのモジュールをインストールする方法としてCPANモジュールと対話するシェルがある。
# perl -MCPAN -e shell
いろいろ聞いてくるが基本的にそのままOKでよさそう。
ncftpget,ncftpがシステムになかったので以下からダウンロードしてインストールした。
http://www.ncftp.com/download/
ftp は /usr/bin/ftp を指定した。
設定が終わったらプロンプトが現れるので必要なモジュールをダウンロードする。
cpan> install Net::SSLeay.pm
CPAN: Storable loaded ok
Fetching with LWP:
ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/authors/01mailrc.txt.gz
・ ・・・
cpan> bye
help と打てばコマンドが分かる。
rootパスワードを聞いてくることもあるようだ。
どのようなモジュールがインストールされているかは以下のコマンドで確認出来る。
# rpm -qa | grep perl
or
# find `perl -e 'print "@INC"'` -name '*.pm' -print
●プロセス概要
postfixは内部的に処理が分割されていてそれぞれが自分の仕事をこなすことで成り立っています。
主なものは以下。
master
postfix全体の管理する。
sendmail
ローカルからの送信処理を担当。
smtpd
メールの受信処理を担当。その後cleanupプロセスに渡す。
cleanup
メールをincomingキューに保管するプロセス
qmgr
incomingキューを監視し,メール配送の準備をするプロセス
active
qmgrが配送中のメールを管理するプロセス
local
届いたメールをローカルスプールに格納するプロセス
incoming
受信したメールを保存し,配送プロセスに渡す。
pickup
maildropキューを監視するプロセス。メールを検知するとcleanupプロセスに渡す。
メール送受信の流れの概要は,
外部からメールを受信した場合のプロセスは,
smtpd -> cleanup --> incoming --> qmgr --> active --> local
内部からメールを送信する場合のプロセスは,
sendmail --> postdrop --> maildrop --> pickup --> cleanup --> incoming --> qmgr --> active --> smtp
●インストール
実際にpostfixによるメールサーバの構築をします。
CentOS4ではsendmailとpostfix関連のパッケージが入っていると思うのでアンインストールしてソースからインストールします。
依存関係で必要なパッケージをおいておきたい場合は --nodeps をつけてアンインストールします。
例えばこんな感じ。
# rpm -e --nodeps sendmail
postfix ユーザと postfix, postdrop グループがなければ作成しておきます。
オプションの設定によってはpcre-develが必要になるかもしれません。
ソースの入手先は http://www.postfix.org
現時点での最新バージョンは postfix-2.3.7.tar.gz でした。
ではさっそくダウンロードしてインストール準備をしましょう。
# tar zxvf postfix-2.3.7.tar.gz -C /usr/local/src
# cd /usr/local/src/postfix-2.3.7
以前のコンパイル情報を初期化する場合は以下のコマンドを打ちます。
# make tidy
コンパイルオプションは必要に応じて適宜設定してください。
CCARGSにコンパイルオプション,AUXLIBSにライブラリを指定します。
特に拡張機能を有効にする必要がない場合は make とシンプルに入力です。
# make makefiles 'CCARGS=-DHAS_LDAP -DHAS_PCRE -I/usr/include/pcre -DUSE_SASL_AUT\H -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS -DDEF_MANPAGE_DIR=\"/usr/share/m\an\"' AUXLIBS="-ldb -lldap -llber -lz -lm -lpcre -lsasl2 -lssl -l crypto"
# make install
以下のようなことを聞いてきますがいろいろ聞いてくるが基本的にはデフォルトでOKです。
私は好みでcommand_directoryを /usr/local/sbin にしました。
install_root: [/]
tempdir: [/usr/local/src/postfix-2.3.7]
config_directory: [/etc/postfix]
daemon_directory: [/usr/libexec/postfix]
command_directory: [/usr/sbin]
queue_directory: [/var/spool/postfix]
sendmail_path: [/usr/sbin/sendmail]
newaliases_path: [/usr/bin/newaliases]
mailq_path: [/usr/bin/mailq]
mail_owner: [postfix]
setgid_group: [postdrop]
html_directory: [no]
manpage_directory: [/usr/share/man]
readme_directory: [no]
これでインストールは終了です。
設定は次回書きます。
前回でインストールまで済んだので今度は起動スクリプトを書いてシステム起動時にpostfixが起動するように設定しましょう。
スタートストップスクリプトを書きましょう。
# vi /etc/init.d/postfix
---
#!/bin/bash
#
# Startup script for the Postfix-2.3.7
#
# chkconfig: 35 99 1
# description: MTA Server program
export PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin"
LOCKFILE=/var/lock/subsys/postfix
POSTFIX=/usr/local/sbin/postfix
# ネットワークが利用可能かチェック
. /etc/sysconfig/network
if [ ${NETWORKING} = "no" ]; then
exit 0
fi
case "$1" in
start)
if [ -x $POSTFIX ]; then
if [ -f $LOCKFILE ]; then
echo "postfix already started!!"
else
touch $LOCKFILE
echo "Starting Postfix-2.3.7 Please wait : "
$POSTFIX start
sleep 5
fi
else
echo "postfix program Not Found"
fi
;;
stop)
if [ -x $POSTFIX ]; then
if [ -f $LOCKFILE ]; then
echo "Shutting down postfix: "
$POSTFIX stop
rm -f $LOCKFILE
sleep 5
else
echo "postfix already Stopped!!"
fi
else
echo "postfix program Not Found"
fi
;;
*)
echo "Usage: postfix {start|stop}" 1>&2
exit 1
esac
exit 0
---
スクリプトを書いたらシステムに登録します。
# chmod 755 /etc/init.d/postfix
# chkconfig --add postfix
これでランレベル3と5で起動するようになりました。
●基本設定
設定は/etc/postfix/main.cf で行います。
とりあえず基本的な設定をしましょう。
# vi /etc/postfix/main.cf
---
# ホスト名をFQDNで
myhostname = hostname.domain.com
# ドメイン名
mydomain = domain.com
# メール送信時に付けるドメイン名(@のうしろ)
myorigin = $myhostname
# 受信するインターフェイスの設定
inet_interfaces = all
# 受け取るドメイン
mydestination = $myhostname, $mydomain, localhost, localhost.$mydomain
# 中継を許可するネットワーク
mynetworks = 127.0.0.0/8, 192.168.1.0/24
---
それではpostfixを起動してみましょう。
# service postfix start
他のメールサーバからメールを送ってみてから/var/log/maillogを見るとエラーが出ています。
/etc/aliases.db がないと言われているのでnewaliases コマンドを打っておきます。
# newaliases
また,warning: dict_nis_init: NIS domain name not set というエラーが出たので
main.cfに以下を追加しました。
---
alias_maps = hash:/etc/aliases
---
postfixの設定ファイルの再読込みをします。
# postfix reload
これでエラーもなくなり基本的な動きが可能になりました。
前回でmain.cfへの基本設定がすんだのでいろいろなスパム対策をしましょう。
●送信元ホストによるアクセス制御
スパム対策など不必要なメールの受信をしないためにアクセス制御をしましょう。
アクセス制御には smtpd_client_restrictions を使います。
--- smtpd_client_restrictions = permit_mynetworks, check_client_access regexp:/etc/postfix/client_access, reject_unknown_client, permit ---
reject_unknown_clientのレスポンスコードはデフォルトで450ですがこれでは再送されてしまうため気になる人は550などにしましょう。
---
unknown_client_reject_code = 550
---
上の例では mynetworks で指定したネットワークを受信し,/etc/postfix/client_access ファイルによるアクセス制御を行い,reject_unknown_client でDNS逆引きができないサーバからの接続を拒否し,permitでそれ以外のデフォルト動作は接続を許可するという意味になります。
reject_unknown_client を指定すると結構メールをはじきますので注意が必要です。
regexp はそれ以降に指定したファイルの記述に正規表現を使うという意味です。書式は以下のような感じ。
--- /^223-123-45-67\.example\.net$/ OK /\.domain\.com$/ OK /^223\.123\.45\.67$/ REJECT /^[^\.]*[0-9][^0-9\.]+[0-9]/ 450 may not be MX ---
/パターン/ 制御パラメータ
といった形式になります。
制御パラメータには,OK, REJECT, 4xx コメント, 5xx コメント, DISCARD コメント,などがあります。
4xxを指定した場合はエラーメッセージを返しメールは再送されますが,5xxを指定した場合はエラーメッセージをすぐに返し,メールは再送されません。
●送信元ドメインによるアクセス制御
ドメインによるアクセス制御は以下のようにします。
--- smtpd_sender_restrictions = permit_mynetworks, # 送信者のドメインがMX,Aレコードいずれでもない場合拒否 reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/sender_access, permit ---
reject_unknown_sender_domainもデフォルトレスポンスコードが450なので550にします。
---
unknown_address_reject_code = 550
---
sender_accessの書式はhashにしています。hashはいたって簡単。ただ,hashはpostmapコマンドでdbファイル形式に変換する必要があります。
# postmap /etc/postfix/sender_access
---
spammer@domain.com REJECT
domain.jp OK
spam.com REJECT
---
●RBLの利用
オープンリレー(第三者中継を許してしまっているサーバ)の情報を集め,データベースにしているサイトを利用して受信を拒否する設定が可能です。もし,データベースに登録されていれば受信を拒否出来ます。
設定は smtpd_client_restrictions に記述します。
---
reject_rbl_client list.dsbl.org
reject_rbl_client all.rbl.jp
---
RBL提供サイト一覧は以下のサイトで調べることが出来ます。
http://www.sdsc.edu/~jeff/spam/cbc.html
RBLサイトの中には精度に問題があるところもあるので慎重に選びましょう。
●メッセージ内容による制御
ヘッダー情報による制御を行うには以下の記述のコメントをはずし/etc/postfix/header_checksに制御したい内容を記述する。
header_checks = regexp:/etc/postfix/header_checks
# vi /etc/postfix/header_checks
---
/^X-Mailer:.*Emacs/ REJECT header_check RULE1
---
このように記述するとX-MailerにEmacsという文字を含んでいるとはじきます。またログには header_check RULE1 のコメントが書き込まれます。
同様にメッセージ内容による制御を行うには body_checks を使う。main.cfには以下のように記述する。
body_checks = regexp:/etc/postfix/body_checks
# vi /etc/postfix/body_checks
body_checksに制御したい内容を書きましょう。
●存在しないユーザ宛のメール
でたらめなユーザ宛によくきます。レスポンスコードは550になっていることを確認しましょう。
---
unknown_local_recipient_reject_code = 550
---
その他設定しておきたい項目をいくつか上げておきます。
●メールの配送関係の設定
何度配送しても配送できないメールの保存期間(デフォルト5日)
maximal_queue_lifetime = 1d
配送できないエラーメールの保存期間(デフォルト5日)
bounce_queue_lifetime = 1d
●メールサイズに関する設定
1つのメールで指定できる宛先の数
smtpd_recipient_limit = 50
1通のメールサイズ制限を行う
message_size_limit = 5120000 (5M)
メールボックスの最大容量
mailbox_size_limit = 51200000 (50M)
openLDAPなどのディレクトリサービスは冗長構成をとるのが一般的です。なので前回でマスターサーバの設定が済んだので今回は複製サーバを構築しましょう。
複製側サーバもCentOS4を前提にしています。同じバージョンのldapを使っていればきれいに動くと思います。
●マスターサーバ側の作業
複製サーバ側のslapd.confの設定はマスター側とほとんど同じなので複製サーバにslap.confをコピーして利用すると便利です。以下はマスター側のslapd.confへの追加です。
修正情報を記録するログファイルを指定
---
replogfile /var/lib/ldap/openldap-master-replog
---
複製サーバ情報を指定
---
replica host=replica.domain.com:389
suffix="dc=domain,dc=com"
binddn="cn=Manager,dc=domain,dc=com"
credentials=Password
bindmethod=simple
tls=yes
---
binddnにManagerを指定しましたが書き込み権限のあるユーザなら誰でもOKでcredentialsでパスワードを指定します。
tlsをyesに設定したのでサーバ間のデータは暗号化通信を行います。
はじめは複製サーバ側へデータを手動で入力する必要があります。
ということで現在の登録データをファイルに書き出します。
# slapcat -l /etc/openldap/export.ldif
できたexport.ldifファイルを複製サーバ側にコピーしておきます。
●複製サーバ側の設定(slapd.conf)
基本的に設定はマスター側と同じです。以下複製サーバ特有の設定だけ記入します。
マスター側からコピーしてきたslapd.confを使います。
マスターから送られてくる複製情報を書き込むユーザの指定。当然書き込み権限のある
ユーザを指定する必要があります。
---
updatedn "cn=Manager,dc=anan-nct,dc=ac,dc=jp"
---
マスターのアドレスを記述する必要があります。
---
updateref ldap://ldap.domain.com
---
次にマスターサーバから持ってきたデータをインポートします。
# slapadd -l /directory/export.ldif
データベースに既にデータが入っている場合はいろいろエラーがでますがログなどを見
て適宜データを削除するなどして対処してください。データの削除にはWindowsで動作するldap browserが便利だと思います。Javaで作成されていてちょっとしたデータの修正などに大いに役立ちます。
↓ldap browser
http://www-unix.mcs.anl.gov/~gawor/ldap/
●起動
設定がすんだら次は起動です。複製サーバ,マスターサーバの順に起動していきます。
うまく起動できたら正常に複製されているかログを確認しましょう。