Debian 細々とした管理のための追加設定

管理するのに便利なように細々とした設定を追加。

ひと通り必要なパッケージはインストールが終わったので、これ以後はaptでパッケージの更新をする時に必ず更新内容が表示されるようにする。

すでにapt-listchangesはデフォルトでインストールされているので、dpkg-reconfigure apt-listchangesで最後の質問でインストール前に更新内容を表示するように変更する。

次に更新があったパッケージをroot宛にメールで通知するようにする。これは単純にapticronをインストールするだけ。

apt-get install apticron

多分デフォルトの設定で問題なし。ただ、デフォルトだと1時間ごとに実行されるのでさすがにそれはうざい。一週間に一度実行されるように/etc/cron.d/apticronを書き換えておこう。44 * * * *になっている部分を0 6 * * 7に変更する。これで、Weeklyスクリプトが動く時にその直前に実行される。

最後に、毎日ログをおさらいして問題があった場所をメールで報告してくれる便利パッケージも入れておこう。これはlogwatchパッケージをインストールする。

apt-get install logwatch

これも多分デフォルトのままでいいので、インストールしただけで放置。

Debian WordPressインストール その3 WordPress本体

ja.wordpress.orgから3.6.1-jaのパッケージをダウンロード。面倒なのでDebianのApacheのDocument Rootである/var/wwwの直下に展開しちゃう。

/var/www/wordpress以下すべてのファイルをApacheの実行ユーザーであるwww-data:www-dataの所有に変更しておく。

chown -R www-data:www-data /var/www/wordpress

とりあえず、http://[servername]/wordpress/にアクセスして画面の指示どおりにインストール。ついで、以前のエントリー通りにマルチサイト化するためのフレーズと自動アップデートのためのフレーズを/var/www/wordpress/wp-config.phpの最後に追記。

WordPressにadminでログインして、ツール->ネットワークからマルチサイト化する。ネットワークをなんと呼ぶか?という質問が増えているがとりあえずかっこつけて”BAM-System Blog Network”とでも入力しておく。後は指示どおりにごにょごにょすればマルチサイト化が完了する。

ここで、自分のユーザーを作成しようと思ったら、なんといつの間にか4文字よりも短いユーザー名はダメというルールになったらしい。それは困る。というわけで、4文字制限を3文字制限に強引に変えてしまおう。

いじるファイルは/var/www/wordpress/wp-includes/ms-function.php

if ( strlen( $user_name ) < 4 )

という行を見つけて、これを3にしておく。ついでにその次の行のエラーメッセージも4->3に変えておくか。これで3文字のユーザー名も受け入れてくれるはず。

自分用のユーザーとブログを作成した後、デフォルトで最初に作られるトップディレクトリのブログの所有権と特権ユーザーを自分に指定した後、adminユーザーは削除してしまおう。

Debian WordPressインストール その2 PHP5

というわけで、続けてPHP5とphpMyAdminのインストールを行う

apt-get install php5 phpmyadmin

インストール中にphpMyAdminがいろいろ設定を要求してくる。まずは、連携するhttpdにApacheを選択。サーバー管理をdbconfig-commonにおまかせにするか手動にするかの選択はおまかせに。次にデータベース操作のためのMySQLのルートパスワードを入力。最後に、非管理者権限でphpMyAdminがMySQLと連携するためのパスワードだが、どうせこれはphpMyAdminがMySQLとの間で使うだけなので空欄にして自動生成させる。

これだけでちゃんとApacheの設定にphpMyAdminが追加されてphpMyAdminがウェブベースで使えるようになっているはずデフォルトではサーバーのドキュメントルート直下の/phpmyadminにアクセスすれば立ち上がるはず。

とりあえずrootでログイン。次にデータベースタブから新規データベース’wordpress’を作成する。

次にWordPress用のユーザーを作成する。特権タブから新しいユーザーを追加する。ユーザー名はwordpress、パスワードは自動生成してメモしておいてもいいが、今回はパスワードジェネレーターで作成したものを貼りつけた。外部からアクセスすることはないので、localhostからのアクセスに制限しよう。作成後、特権を編集で、wordpressデータベースに対してすべての権限を有効にしておく。

以上でWordPress用のデータベースの準備は完了。WordPress本体はパッケージでなく手動でインストールすることで、WordPress内部からの更新でメンテできるようにする。

Debian WordPressインストール その1 MySQL

まずはMySQLをDebianにインストールする。

apt-get install mysql-server

途中、MySQLのrootのパスワードを要求されるので、パスワードジェネレーターで作ったパスワードをとりあえず入力。

例によってMySQLはインストール時には危険な状態(いい加減なんとかしろよ!)でインストールされるので、セキュリティを向上させる初期スクリプトを走らせる。

/usr/sbin/mysql_secure_installation

最後にWordPress用のデータベース作成だが、せっかくなのでphpMyAdminを利用して見ることにする。

Debian 古き良き時代のCGIのための準備

CGIを旧サーバーから移植するためにjcode.plを用意する必要がある。

調べてみると、Debianではlibjcode-perlパッケージをインストールすればいいらしい。

で、インストールされたはずのjcode.plが見当たらないと思ったら・・・

/usr/lib/perl5/jcode.pl

こんなところにインストールされていた。

移植する予定のCGIではjcode.plについてはフルパスを書かず、システムが認識するデフォルトのjcode.plを暗黙で使うように設定してあるが、移植後に日本語がちゃんと表示できなければ上記フルパスに書き換えることにしよう。

 

Debian NTPによる時刻合わせ

忘れちゃいけないNTPによる自動時刻合わせ。

とりあえずapt-get install ntpでntpのパッケージをインストール。

/etc/ntp.confをいじってデフォルトのサーバーをコメントアウト。代わりに日本国内なのでNICTの公開NTPサーバーを記入する。

server ntp.nict.jp

とりあえずこれを3行くりかえす。するとDNSラウンドロビンで3つの異なるサーバーが参照先に登録されるので少し時刻精度があがる。

あとはntpdを再スタートするか、サーバーを再起動する。

LAN内にブロードキャストで流してもいいんだけど、そこまで時刻を合わせたいマシンがないので見合わせる。

Debian mailmanの注意事項

ここで、mailmanを運用する場合の注意。

mailmanにはmmsitepassを使ってグローバル管理パスワードを設定すればウェブ上のインターフェースからメーリングリストの作成が可能だが、この方法で作成するとアーカイブディレクトリの所有者がwww-dataになってしまうので、mailmanが配信されたメールをアーカイブすることが出来なくなってしまう。

同様にコマンドラインからroot権限でnewlistでメーリングリストを作成した場合も、アーカイブディレクトリの所有者がrootになってしまって、これまた同じくmailmanがアーカイブできなくなってしまう。

これらはdebianのパッケージの設定に問題があると考えられるが、下手に修正してバイナリパッケージのアップデート時に整合性がとれなくなると嫌なので、ここは何も対処せず、su listしてからコマンドラインでnewlistを実行してメーリングリストを作成するようにする。すると作成されるファイルはすべてlistユーザー所有になるので、パーミッションの問題は起きない。バッドノウハウワークアラウンド。

 

Debian mailmanの構築

メーリングリストサーバーとしてmailmanを使う。パッケージのインストール内容をできる限り尊重する設定にする。

とりあえずapt-get install mailman

FQDNは最終的なサーバーの名前で、言語はjaを選ぶがなぜか最初はenしかインストールされない。なので、インストール後にもう一度dpkg-reconfigure mailmanで再びjaを選ぶ。すると今度はjaもインストールされる。

次にpostfixとの連携をさせるため、/etc/mailman/mm_cfg.pyを編集。といってもMTA=”postfix”の行を有効にするだけ。ついでにDEFAULT_URL_PATTERN = ‘http://%s/mailman/’と変更して間の余計な/cgi-bin/を抜いておく。これはFreeBSDでmailmanをインストールした時のデフォルトに合わせるため。これを合わせておかないとFreeBSDで既に運用しているリストを移植するときにいろいろ不整合が出ることが予想される。

Webベースの管理ページを表示させるため、

ln -s /etc/mailman/apache.conf /etc/apache2/site-enabled/010-mailman

を実行してapacheの起動時にパッケージが用意したデフォルトのmailman用の設定を読み込む様に設定する。さらに、/etc/mailman/apache.confを編集し、ScriptAliasの行の/cgi-bin/mailman/を/mailman/に変更してmm_cfg.pyと合わせておく。

次の作業ではmailmanのスクリプトがEUCでメッセージを吐き出すので、あらかじめターミナルの文字コードをEUCに一時的に変更しておく。root権限でsu listしてmailmanの実行ユーザーlistの権限に移行し(シェルがbashからshに切り替わるので戸惑わないこと)

/var/lib/mailman/bin/newlist mailman

を実行する。mailmanメーリングリストの管理ユーザーのメールアドレスと設定パスワードを入力すると最初のメーリングリストが作成される。

ここで、/var/lib/mailman/dataにaliasesとaliases.dbがlistユーザーの所有で作成されていることを確認してから、postfixのaliasesとして認識させるために、/etc/postfix/main.cfのalias_mapsの項目にカンマで区切ってhash:/var/lib/mailman/data/aliasesを追加しておく。

後は再起動すればapache,postfix,mailmanが起動してメーリングリストが使える様になる。

Debian メールサーバーの設定

一応、元からexim4がインストールされているのだが、後述するmailmanとの連携はpostfixの方がやりやすいので、postfixをインストールする。すると競合するexim4はアンインストールされる。

apt-get install postfix

まずは、サーバーの種類だが、このサーバーはメールをSMTP AUTHでISPのサーバーに全部丸投げするので、スマートホストを選ぶ。次にFQDNを尋ねられるので運用予定のサーバー名を入力。そして、丸投げする相手の入力を求められるので[xxx.xxx.or.jp]:587の様にFQDNを[と]で囲んだ上でコロンの後にSubmissionポートを追加したものを入力する。最終受け取り先にはなっても中継は受けたくないので、localhost以外からは中継を受け付けない様に、デフォルトの中継受け入れ設定127.0.0.1/8,::1/128のままにしておく。

次に、/etc/postfix/sasl/authinfoを作成し、以下の様に丸投げ相手のSMTP AUTHに必要な情報を記入する。

[xxx.xxx.or.jp]:587 userid:password

パーミッションを600に設定、postmap authinfoを実行してhash化したauthinfo.dbを作成する。

最後に/etc/postfix/main.cfにSMTP AUTHのための情報を追加する。

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/authinfo

以上が完了したら、postfix reloadか再起動でpostfixを新しい設定で立ち上げる。コマンドラインからmailコマンドでテストメールをlocalhostからpostfixに投げ、ちゃんとスマートホスト経由で宛先に届くことを確認しておこう。

Debian 攻撃からの守りを固める

次に、iptablesによる余計なアクセスの遮断とsshguardによるsshへのブルートフォースアタックの遮断を設定しておく。

Wheezyではiptablesの設定はiptables-persistentパッケージによって起動時に再設定されるが、この時点ではまだ設定しない。

以下のファイルを作成。とりあえず、ウェブサーバーとSSHサーバーとSMTPサーバーだけファイヤーウォールを開けておく。

iptables.rule

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn’t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 443 -j ACCEPT

# Allows SSH connections
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state –state NEW –dport 22 -j ACCEPT

# Allows SMTP connections
-A INPUT -p tcp –dport 25 -j ACCEPT

# Allow ping
-A INPUT -p icmp –icmp-type 8 -j ACCEPT

# Reject all other inbound – default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

せっかくなのでIPv6でもファイヤーウォールを設定しておきたいのでIPv6用には別ファイルを用意する。

ip6tables.rule

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn’t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d ::1/128 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 443 -j ACCEPT

# Allows SSH connections
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state –state NEW –dport 22 -j ACCEPT

# Allows SMTP connections
-A INPUT -p tcp –dport 25 -j ACCEPT

# Allow ping
-A INPUT -p ipv6-icmp –icmpv6-type 128 -j ACCEPT

# Reject all other inbound – default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

そしたら、これらのルールをiptablesに食わせる。

iptables-restore < iptables.rule

ip6tables-restore < ip6tables.rule

ルールを食わせてからおもむろにiptables-persistentパッケージをインストールする。

apt-get install iptables-persistent

するとインストール時にその時点でのiptablesの設定内容をファイルに書き出すか?と尋ねられるのでyesと答えるとIPv4用のルールとIPv6用のルールがそれぞれ/etc/iptables/rules.v4,rules.v6に書き出される。これで、再起動したらルールが復活する。

次にapt-get install sshguardでsshguardをインストールする。これは起動すると自動的にsshguard用のiptablesルールをiptablesに追加してくれるので特になにかする必要はない。

これで再起動すれば余計なポートの遮断とブルートフォース攻撃の遮断が始まる。

もしiptablesの設定に失敗した時は、sysv-rc-confでiptables-persistentとsshguardを無効にした上で再起動し、再びiptablesに新しいルールを食わせた後、dpkg-reconfigure iptables-persistentで再びルールを書き出し、その後、sysv-rc-confでiptables-persistentとsshguardを再度有効化して再起動すればよい。

注意すべきは、sshguradが立ち上がった状態でdpkg-reconfigure iptables-persistentをするとsshguard用のiptablesルールが含まれた状態でルールを書き出してしまい、結果、次に起動したときにiptables-persistentとsshguardがどちらもsshguard用のルールを登録して二重に登録されてしまうこと。その場合は、/etc/iptables/rules.v4,v6を直接書き換えてsshguard用の行を削ってもいい。