PostfixとDovecotでメールサーバを構築する

さくらのVPSで使用しているCent OS 6.0をメールサーバとして使えるように設定します。SMTPサーバとしてPostfixをIMAPサーバとしてDovecotを利用します。どちらもCent OS 6.0のデフォルトのソフトウェアです。

PostfixおよびDovecotは以下の要件で設定することにします。

  • 双方ともSSLは使用しない(証明書は取得していないので)
  • 双方ともPLAIN認証を使用する(危険だが)
  • PostfixはPort 25でメールを受け取る
  • 複数のドメインのメールを受け取るがvirtual_alias_mapsは使用しない
  • 送信はSubmissionポート(587)を使用する
  • SMTP Authで認証する
  • 認証にはsaslauthdを使用する
  • メールスプールはMaildir形式
  • DovecotはIMAPのみ使用する

Postfixの設定は以下のサイトのマニュアルの日本語訳を参照しながら行いました。

  • http://www.postfix-jp.info

詳細な説明は割愛すると、/etc/postfix/main.cfでサーバの名前やドメイン名、listenするネットワーク、受信するドメインなどを指定すると動作します。ドメインごとにアカウントは分けないので、virtual系は使用しません。リレーの条件は自分宛か自分からかSMTP Authです。

SMTP Authはsaslauthdを使用します。cyrus-saslパッケージです。PLAIN認証を使用する場合、cyrus-sasl-plainも入れないと動作しないので注意が必要です。単に動作しないというのだと分かりやすいのですが、インストールしていないと認証が失敗するのではまってしまいました。

Submissionポートの設定はmaster.cfで行います。

Dovecotの設定は/etc/dovecot/の下にあります。dovecot.confで有効にするプロトコルが選択できます。各項目の設定はconf.dに分かれています。10-auth.confで認証の設定ができます。デフォルトではPLAIN認証は(危険なので)無効になっているので、以下の通り設定を有効にする必要があります。

 

さくらのVPSにWordPressをインストールする

さくらのVPSで使用しているCent OS 6.0の環境にWordPressをインストールします。このブログのWordPressをインストールしたときのメモです。既にお分かりかもしれませんが、一連のサーバの設定などのメモは全てこのブログに使っているサーバについての話となっています。

まずは必要な環境を整えます。Webサーバapacheおよびphpとデータベースmysqlが必要です。yumを使用してインストールします。

そして以下の公式サイトから最新版の日本語版WordPressをダウンロードします。今回インストールしたのはバージョン3.2.1となります。ファイル名はwordpress-3.2.1-ja.tar.gzです。

  • http://ja.wordpress.org/

インストールしたファイルを展開します。今回は/var/www/wordpress/にインストールすることにします。そして、今使っているURLでアクセスしたときにこのフォルダのWordPressが表示されるようにapacheのバーチャルホストの設定をします。

次にデータベースを用意します。wordpressという名前のデータベースにwordpressというユーザでアクセスすることにします。mysqlの操作は以下のようになります。まず、wordpressというデータベースを作成します。次にlocalhostのwordpressというユーザはwordpressというパスワードでアクセスして、wordpressデータベースの全てのテーブルの全ての権限があるという設定になります。

準備が整ったところで、以下のインストール手順にしたがってWordPressの設定を行います。非常に簡単です。

  • http://ja.wordpress.org/install/

以上で完了です。デフォルトのデザインがなかなか気に入ったので、とくにテーマなどいれずに使うことにします。トップに表示される画像は自分で用意した写真に入れ替えました。こういった設定も管理画面から非常に簡単にできます。

apacheのデフォルトのバーチャルホスト

デフォルトではコメントアウトされている以下の設定を有効にすることで、apacheでバーチャルホストを使用することができます。

各<VirtualHost>の項目でServerNameを指定することで、特定の名前でアクセスされた時のDocumentRootなどの設定を分けることが可能になるわけです。

明示的に設定されていない名前やIPアドレス直打ちなどでアクセスされたときにはどうなるのでしょうか。直観的に<VirtualHost>の外側で設定されているDocumentRootなどの設定を使用してくれるのではと思っていたのですが、実際は違いました。

一番最初に定義されている<VirtualHost>の設定が使用されるのです。

これだけだと特に問題でもないのですが、デフォルトのhttpd.confではバーチャルホスト関連の設定が一番最後に書いてあるのが若干問題となります。

conf.dの仕組みを利用してバーチャルホストごとに設定ファイルを分けたいと考えるのは割と自然だと思いますが、conf.dの設定ファイルの読み込みはhttpd.confの中では真ん中あたりにあります。

したがって、httpd.confのバーチャルホストの設定の部分でデフォルトの<VirtualHost>の設定をしたつもりになっていても、実際にはconf.dの中で一番最初に読み込まれた(ファイル名が早かった)<VirtualHost>の設定がデフォルトの設定となるのです。

これ問題ではまらないための無難な方法としてはNameVirtualHostおよびデフォルトの<VirtualHost>の設定をconf.dの読み込みの上に移動することだと思います。

TeraTermでビープ音を消す

コンソールで存在しないコマンドでタブを押したときなどに、ssh越しにエラーを知らせるビープ音が鳴ってしまいますが、TeraTermでビープ音を鳴らさないようにするには設定ファイルの[Tera Term]セクションに以下の設定を書けばいいようです。

以下のマニュアルを参照してください。

VPSで使用する独自ドメインを自前のDNSサーバで運用する

VPSを使用する場合、多くの場合は独自ドメインを取得して使用することになるかと思いますが、その独自ドメインのDNSサーバの運用方法は大きく以下の3つになると思います。

  1. ドメインを取得した会社のDNSサーバを使用する
  2. 外部のDNSサーバを使用する
  3. VPSサーバでDNSサーバを運用する

ドメインの登録会社は多くの場合DNSサーバのサービスを提供していると思います。そのサービスで問題なければ一番手堅い方法です。今回はムームードメインで取得したドメインを使用しますが、ムームードメインでは関連サービスを使う用途以外のDNSサーバの設定はできません。

世の中にはDNSのサービスのみを提供しているものを多数あると思います。例えばFreeDNSというフリーのDNSサービスなどはフリーにもかかわらず自由度の高い設定が可能なのではないでしょうか。

今回は独自ドメインを使用するVPSサーバ自身で自前のDNSサーバを運用することにします。さくらのVPSとOsukiniサーバの二つのVPSでそれぞれプライマリとセカンダリのDNSを運用します。

ネームサーバはbindのバージョン9.7を使用することにします。CentOS 6.0ではデフォルトです。CenOS 5.6ではデフォルトはbindの9.3なのでbind97シリーズのパッケージをインストールすることにします。yumでbind本体と、chrootで運用するためのbind-chroot、digなどのツールをインストールするためのbind-utilsをインストールします。

bindの設定ファイルは/etc/named.confです。zoneファイルはchrootをしているので/var/named/chroot/var/named/の下におくことになります。今回は次のような方針で設定を行います。

DNSサーバには二つの機能があります。ひとつは自分の管理しているドメインの情報を発信する機能です。これはコンテンツサーバなどと呼ばれます。もうひとつはクライアントのために再帰的に問い合わせて目的のドメインの情報を引く機能です。これはキャッシュサーバなどと呼ばれます。

今回必要なのはコンテンツサーバの機能です。キャッシュサーバの機能はすでに提供されているものをそのまま利用することにします。(つまりresolv.confは変更しません。)

それと、最近のDNSサーバではDNSSECの機能が搭載されています。デフォルトの設定ファイルにもこれらの設定がいくつか見受けられます。しかし、今回はDNSSECの設定は行わないことにします。よく理解していないのでスルーするというのもありますが、まず、デフォルトの設定はキャッシュサーバ用の設定と思われます。今回はキャッシュサーバとしては使用しないのでこれは不要です。コンテンツサーバ用の設定は上位との連携などは必要でさらに難解ですが、ムームードメインにはそういった認証チェーンを連携するインターフェイスは提供されていないようです。

上記の内容で設定したnamed.confは以下のとおりです。実際のドメイン名とIPアドレスは伏字となっています。

要点を説明すると、まずlisten-onがanyですべてのインターフェイスでポート53でアクセスを受け付けます。IPv6は使用できない環境なので割愛します。allow-querryがanyでどこからでも問い合わせ可能です。allow-transferが可能なのはセカンダリのDNSサーバだけとします。キャッシュサーバには使用しないのでrecursionはnoです。

ログは上記の3つのカテゴリをnamed.logというファイルに取得することにします。 ローテートは他のサーバのログと同様にlogrotatedで行います。そしてゾーンファイルを指定します。ここではドメイン名と同じファイル名にしています。ゾーンファイルの設定については割愛します。

次にセカンダリ側のnamed.confです。基本的にはプライマリと一緒です。ゾーン転送は必要ないのでallow-transferがnoneなのとゾーンの設定が異なります。ゾーン設定はtypeがslaveで、ファイルはプライマリから取得した情報を保存するファイル名を設定します。そしてプライマリのIPアドレスをmastersの項目に設定します。ゾーンファイル自体は不要となります。

serviceの開始や、chkconfigおよびiptablesによる通信の許可なども忘れずに行います。

DNSサーバの設定が終わったら、ドメインのDNSの情報を変更します。ムームードメインの場合、コントロールパネルのネームサーバ設定変更のところから、取得したドメインで使用するという上級者向けメニューを選択することで、DNSサーバの設定とそのサーバのIPアドレスの登録が可能です。

設定は以上で完了です。しばらくすると世界中に設定がいきわたるはずです。

以上はDNSの正引きの設定になります。逆引きの設定についてはIPアドレスを管理しているDNSサーバで設定する必要がありますが、さくらのVPSとOsukiniサーバはともに管理画面から逆引きの設定が可能ですので、そこで逆引きの設定を行います。

emacsでUTF-8のファイルを編集する設定

昔とは違い昨今ではLinuxの多言語対応も申し分のない状況だと思います。ssh経由でUTF-8の日本語文字列を入力したときに、特に何も設定しなくてもシェルで日本語のファイル名を扱ったり、viで日本語を編集したりすることが可能です。ただ、emacsはデフォルトのままではUTF-8が文字化けしてしまうようです。設定ファイル.emacsに以下の設定を追加するとUTF-8の日本語がうまく扱えるようになります。

screenの設定

sshでログインしていろいろ作業をするときにscreenは大変便利です。ひとつの端末の中で複数の端末を切り替えて利用可能です。CLIのマルチウインドウです。詳しくは検索するといろいろ説明があると思います。screenだと一般名詞すぎて検索に引っかからない場合はGNU screenと検索してください。

設定はホームディレクトリの.screenrcに記述します。基本的には初期設定のままでも全然便利に利用できますが、screenの制御コマンドの入力に試用するエスケープキーの設定だけは変更したほうが便利だと思います。デフォルトはCtrl-aです。Ctrl-aを押してから他のキーを押すことでscreenの操作を行います。例えばウインドウの切り替えはCtrl-a Ctrl-a、ウインドウい一覧はCtrl-a wと入力します。

単にCtrl-aを入力したいときはCtrl-a aで入力できますが、Ctrl-aはシェルやemacsで行頭にカーソルを移動するときにわりと頻繁に使用するので、これは結構不便です。そこでお勧めのエスケープキー設定はCtrl-zです。Ctrl-zは通常サスペンドに使用しますが、screenを使って複数ウインドウを切り替えて作業するとサスペンドの使用頻度は低いので、ちょうどよい設定だと思います。

設定ファイル.screenrcでは以下のように設定を記述します。

設定ファイルを作成せずに一時的に使用したい場合は、コマンドラインから以下のようにオプションを指定してscreenを起動することも可能です。

あと、TeraTermなどからログインしてscreenを起動したときに、ウインドウのサイズを勝手に変更されてしまう場合があります。自動で変更されるのを防ぐには以下のような設定を行うようです。

まず、自分がログインしたときの環境変数TERMの値を確認します。printenv TERMなどで確認できます。例えばxtermだったとすると以下のようにxtermのときのtermcapinfoを設定ファイル.screenrcに記述します。

これで勝手にウインドウサイズが変更されないはずです。

公開鍵認証でsshを行う設定

sshでサーバにログインして作業することはたびたびあると思いますが、そのたびにパスワードを入力するのは非常に面倒です。またスクリプトなどで他のサーバにアクセスする場合にはそもそもパスワードを入力することができません。

公開鍵認証でsshを利用すると、最初の設定が終われば、以後パスワード入力なしでsshが可能となります。秘密鍵はパスフレーズで暗号化することができますが、ここではパスフレーズは設定しないものとします。

準備は非常に簡単です。まず以下のコマンドで公開鍵を作成します。パスフレーズや作成するファイル名を聞かれますが、ここではすべてデフォルトで改行を入力します。

すると~/.ssh/の下に公開鍵id_rsa.pubと秘密鍵id_rsaが作成されます。このうち公開鍵をid_rsa.pubをサーバに設定すれば設定は完了です。秘密鍵は他の人に見られないように気をつけます。

公開鍵をサーバにコピーした後に、以下のコマンドで認証に使う鍵に追加します。以上で設定は完了です。パスワード入力なしでsshが可能になっていると思います。うまくいかない場合には、.sshディレクトリを手動で作成した場合などは、パーミッションが自分以外から見えるようになっていないかなど確認してください。

公開鍵認証のみでログイン可能にする

サーバに不法侵入されるというようなトラブルは、なんらかの方法でアカウント情報が漏洩してしまったか、もしくは認証が破られてしまった場合に発生するわけですが、現実問題として暗号を解析してパスワードを解析されたり、システムがクラックされて情報が盗まれたりすることはほとんどありません。

それではなぜ侵入されてしまうかというと、パスワードが十分に安全ではないので機械的な辞書攻撃などで破られてしまうのです。それを防ぐためには、そのサーバに存在するすべてのユーザが十分に強度のあるパスワードを設定すればよいわけですが、それを徹底するのは簡単でありません。テスト用に作成したアカウントが消し忘れていた場合などもあります。

sshでパスワードによるログインを禁止し、公開鍵認証のみを使うようにするとその問題が一気に解消されます。すべてのユーザが十分に強度のある公開鍵というものを使ってのみ認証するからです。

sshサーバの設定は/etc/ssh/sshd_configにあります。以下のような設定項目があり、デフォルトではyesになっていますが、これをnoに変更することでパスワードによるログインを禁止できます。設定の変更後はsshdの再起動が必要です。

これは非常に簡単です。上記のようにパスフレーズなしの鍵を使用すれば、sshのログインの際のパスワード入力も不要となり手間も削減できるので、セキュリティ対応で面倒になるわけでもありません。

唯一気をつけなければいけない点は、あらかじめ鍵を登録しないとログインできないことです。上記設定を変更する前には既存のユーザは鍵の設定を完了しておく必要があります。また、新しく作成されたユーザはログインできないので管理者に鍵を登録してもらう必要があります。

パスワードなしでsuをする方法

sshでサーバにログインして管理をするときに、一般ユーザでログインをしてからsuでrootになるというのはよくあるパターンだと思います。

通常はそのときにrootのパスワードを入力する必要がありますが、パスワードを入力しなくてよいように設定することも可能です。毎回rootのパスワードを入力するのが面倒という場合にも適していますが、root権限は与えてもよいがrootパスワードは教えたくないユーザがいる場合にも活用できます。

必要な設定は次の二つです。まず該当するユーザをwheelグループに追加します。そのユーザのデフォルトのグループは/etc/passwdに設定されていますが、追加のグループは/etc/groupに設定があります。/etc/groupに以下のような行があると思います。これがwheelグループのメンバーです。最初はrootユーザだけのようです。この後ろにカンマで区切ってユーザ名を追加します。

次に/etc/pam.d/suを編集します。Linuxでは認証を行うのにPAMというモジュールが利用されていますが、このファイルはそのうちsuを行うときの設定になります。このファイルには以下のような行があると思います。

コメントにしたがってこの設定を有効にすると、めでたくwheelグループのユーザはパスワード入力なしにsuが可能となります。

CentOSをインストールして最初にする設定

サーバにOSをインストールしたあとで、最初にいろいろと設定が必要になります。サーバ自体の設定もありますが、管理を行うための環境の設定もあるでしょう。備忘のために今回行った設定を記録します。

CentOSは最初構成でインストールしていますので、必要なソフトはその都度yumでインストールします。最初からいろいろいれるより必要最低限にするがシンプルでよいと思います。yumでのインストールは非常に簡単ですし。

CentOS 6.0で驚いたのが最小構成にsshが含まれていないことです。もちろんsshサーバは含まれています。クライアントが含まれていないのでいきなりscpをしようとするとエラーになります。openssh-clientsパッケージをインストールします。

まずは環境を整えます。ログイン用の自分のアカウントを作成します。useradd -m hogeです。個人的なお勧め環境はscreenとzshです。エディタはemacsとvim-enhancedを両方入れておきます。そしてsshの鍵を~/.ssh/authorized_keysに追加します。

そしてネットワークの設定などをします。/etc/sysconfig/networkのHOSTNAMEにホスト名を設定します。/etc/hostsも変更します。/etc/resolv.confもインストール時にはひとつしか指定しないので追加します。IPv6は使えないみたいなので設定しませんが、デフォルトでついてるリンクローカルはそのままにしておきます。/etc/sysconfig/iptablesでiptablesの設定も変更します。最初はsshしか許可されていませんが、同様に他のサービスも許可とします。

selinuxは面倒なので使わないことにします。/etc/sysconfig/selinuxをdisabledに変更します。あとディスク容量は余裕があるので/etc/logrotate.confを変更してログの保存件数を増やします。デフォルトでは4週のローテートですが半年くらいに変更しておきます。

以上はさくらのVPSにインストールしたCentOS 6.0の作業ログですが、SaaSesのCentOS 5.6もほぼ同様にします。そして念のためユーザアカウントのuidをそろえておきます。SaaSesの環境にはデフォルトで作成されているユーザがあるので何も考えずにuseraddするとひとつずれてしまいますが、いったんデフォルトで作成されているユーザを削除してから作業します。