Monday, September 26, 2011

さくらのVPS 設定ガイド: 基本的な設定とLAMP環境の構築

今回さくらのVPSを使用してVPS (仮想専用サーバー)を何台か立ち上げることになったので、備忘録ついでに設定方法を書いておきます。

この記事の内容
  1. はじめに
  2. OSの再インストール
  3. ユーザーの作成
  4. 特権アクセスの制限
  5. SSHで接続
  6. ファイヤーウォールの設定
  7. SSHの公開鍵認証
  8. アップデート
  9. 必要なサーバーソフトウェアの導入
  10. クリーンアップ

はじめに

環境

この記事では「さくらのVPS」を使用し典型的なサーバー環境、LAMP(Linux, Apache, MySQL, Perl/Python/PHP)を構築するにあたって必要な作業・設定を取り上げています。

今回はさくらのVPSに標準でインストールされている「CentOS 5.5 x86_64」(※2011年9月時点)を使用しています。

Note: 標準インストールではいくらかの設定(不要サービスの停止など)がすでに行われていますので、今回はその前提で書いています。他のOSをインストールした場合やカスタムOSインストールからCentOSをインストールした場合はこの限りではありません。

Yum

CentOSでは、パッケージ管理システムとしてYum(ヤム)が利用できます。

Yumを利用すると簡単にソフトのインストールや削除、アップデートを行えます。OSのアップデートもこのYumで行います。

vi/vimの使い方

この記事ではテキストエディタとしてviとその高機能版であるvimを使用しています。このエディタの主な使い方を以下に記します。

モード

viには「コマンドモード」と「編集モード」があります。起動時にはコマンドモードです。

コマンドモードでは一行削除や保存など様々なコマンドが実行でき、編集モードではキーボードでタイプした文字がそのまま入力されます。

編集モードに入るには「i」キー(挿入モード)などを押し、コマンドモードに戻るには「ESC」キーを使用します。

カーソル移動

さくらVPSのリモートコンソールなどでは、矢印キーによるカーソル移動が行えません。代わりにh,j,k,lキーが対応します。

Note: 矢印キー以外は、コマンドモードのみで利用できます。

hjkl0 行頭
$ 行末
ctrl+b 前の画面
ctrl+f 次の画面
編集方法
i   編集モードに入る(ESCで抜ける)
x   カーソル位置の文字を削除する
dd  一行削除(カット)
u   操作の取り消し(Undo)
.   直前の編集操作を繰り返す
:w  上書き保存
:wq 保存して終了
:q! 変更を破棄して終了

基本的には、希望の位置までカーソルを移動し、「i」を押して編集し「ESC」「:wq」で保存して終了するという流れになります。

上記以外にもviには多数のコマンドが用意されています。「viエディタの使い方」などをご参照ください。

ディスク構成

さくらのVPS 1.5G以上のプランでは、そのHDD容量が仮想ドライブ2台に分割され割り当てられています(詳細)。

標準インストールでは全容量-20GBが/homeに割り当てられているので、肥大化しそうなディレクトリは/home下に置くことをお勧めします。/varに膨大なデータが溜まって気づいたら/dev/hda2が一杯になっていた、というケースも起こり得ます。

OSの再インストール

rootパスワードの決定

rootは全て権限を持つ管理者アカウント(スーパーユーザー)です。このアカウントは不正使用されると大変なことになるので、複雑なパスワードにしましょう。通常時は使用することがない(すべきではない)ので、24桁くらいの長い英数字混合のパスワードにすることをお勧めします。

Note: ただしrootパスワードを忘れると緊急時にどうしようもなくなるので、漏洩・紛失しないよう厳重に保管しておいてください。

再インストール

まずさくらの「VPSコントロールパネル」にログインし、おもむろに「OS再インストール」をクリックします。先ほど決めたrootパスワードを入力し、再インストールを開始しましょう。

Tips: より万全を期す場合はここで仮のパスワードを設定しておき、インストール直後にSSHで接続してpasswdコマンドでパスワードを変更します。

インストールを開始したら、VPSホームに戻りステータスを確認します。数十秒ごとに更新し、ステータスが「稼働中」になればインストール完了です。

サーバーにログイン

インストールが終わったら、VPSコントロールパネルの「リモートコンソール」を開きます。

www******.sakura.ne.jp Login:

と出たら、rootと入力してログインします。パスワードは先程設定したものを入力します。

Note: リモートコンソールはしばらく応答しないことがあります。コンソールを開いたあとLoginが出ないときはEnterキーを押してみたり、それでも動かないときは5分程度放置するといいようです。

vimのインストール

設定作業ではテキストエディタを多用するので、viより高機能なvimをインストールしておきます。Yumでインストールできます。

# yum -y install vim-enhanced

ユーザーの作成

普段rootを使用するのは危険なため、管理用のユーザーを作成しましょう。

今回はユーザー名をstaffとします。適宜読み替えてください。passwdの後には2回パスワードが聞かれます。

# useradd staff
# passwd staff

作ったユーザーをwheelグループ(管理者の特殊グループ)に参加させます。

# usermod -G wheel staff

特権アクセスの制限

特権アクセス(重要な変更)が必要なときに、いちいちrootにログインするのは面倒です。

そこで一時的にroot権限を得られる幾つかの方法が用意されているのですが、その機能を実行できるユーザーを制限します。

suの制限

シェルのユーザーを切り替えてroot権限を得られるsuを実行可能なユーザーを制限します。

wheelグループに所属するユーザーのみsuを実行できるようにしましょう。

まず /etc/login.defs を編集します。

# vim /etc/login.defs

以下の内容を追加します。

SU_WHEEL_ONLY yes

次に /etc/pam.d/su を編集します。

# vim /etc/pam.d/su

以下の行のコメントを外します。なければ追加します。

auth required pam_wheel.so use_uid
suを使うべきか

できるかぎりsuではなく後述するsudoを使用すべきです。従ってここではsuの使い方の説明は省きます。

sudoの設定

sudoは、コマンドの実行ごとにroot権限を与えられる機能です。wheelグループのユーザーにsudoの実行を許可します。

sudoを実行可能なユーザーを設定するにはsudoersファイルを編集します。構文チェック機能を備えた専用のエディタ「visudo」が用意されていますので、それを使用します。

# /usr/sbin/visudo

次の行のコメントを外します。

Note: 誤ってNOPASSWORD:ALLの行を有効にしないように気をつけてください。これはパスワードなしでのsudoを許可してしまいます。

%wheel ALL=(ALL) ALL
sudoの使い方

sudoを使うには、特権アクセスが必要なコマンドの前に「sudo 」を入力します。初回はパスワードが聞かれますので、当該ユーザーのパスワードを入力します。短い時間パスワードが保存され、その間はパスワードなしでsudoを実行できます。

SSHでのrootログイン禁止

標準ではSSHでrootにログインできます。危険なので潰しておきましょう。

# vim /etc/ssh/sshd_config

PermitRootLoginのコメントを外しnoにします。

PermitRootLogin no

保存して閉じたら、これまでの設定を反映させるために一旦再起動します。

# reboot

SSHで接続

再起動したら、SSHでサーバーに接続します。

接続

Unixや、Macであればターミナル(Macなら/Applications/Utilities/Terminal.app)から以下のコマンドを実行します。staffは先程作成したユーザー名、***はサーバーのIPアドレスに読み替えてください。

$ ssh staff@***.***.***.***

Windowsであれば、PuTTYなどを使って接続します(使い方)。

初回接続警告

なお、ホストに初めて接続したときは下記の警告が出ます。yesと答えましょう。

The authenticity of host 'www.example.com (***.***.***.***)' can't be established.
RSA key fingerprint is **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
Are you sure you want to continue connecting (yes/no)?
ログイン

接続できたら、先ほど作成したユーザー・パスワードでログインします。

ちなみに今後はもうrootを使用しません。特権アクセスはsudoで行います。

環境設定
vim

今後の設定でvimを多用するので、その前に取り急ぎvimの設定を済ませておきましょう。

# vi ~/.vimrc

文字コードを設定します。

set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,sjis
パスを通す

新規作成したユーザーは/sbin等にパスが通ってないので、この中のプログラムを実行する際にはフルパスで指定しなければなりません。面倒な場合は予めパスを通しておきましょう。

Note: 一応今後の説明もフルパスで書いていますが、パスを通してしまえば/sbin抜きでも実行できます。

# vim ~/.bash_profile

以下を追加します。

PATH=$PATH:/sbin
PATH=$PATH:/usr/sbin
PATH=$PATH:/usr/local/sbin

変更を適用します。

# source ~/.bash_profile

ファイヤーウォールの設定

使わないポートはさっさと塞いでしまいましょう。iptables(パケットフィルタ)の設定ファイルを編集します。

# sudo vim /etc/sysconfig/iptables

以下のように設定します。この設定では内向きのHTTP,SSHが許可されています。他にもサービスが必要なときはコメントを外してください。

Note: ここで設定しているのはすべて内向き接続であることに注意してください。外部へのアクセスや名前解決には影響しません。

Tips: 設定の詳細はこちらのサイトをご覧ください。

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##################################################

# SSH
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22   -j ACCEPT

# HTTP
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80   -j ACCEPT
# HTTPS
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443  -j ACCEPT

# FTP
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20   -j ACCEPT
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21   -j ACCEPT

# MySQL
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

# SMTP
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25   -j ACCEPT
# POP3
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 110  -j ACCEPT
# IMAP
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 143  -j ACCEPT

# DNS
#-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53   -j ACCEPT
#-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p tcp --dport 53   -j ACCEPT


##################################################
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

設定できたらiptablesを再起動します。

# sudo /etc/init.d/iptables restart

SSHの公開鍵認証

現在の設定ではSSHにはユーザー名とパスワードで接続できますが、「公開鍵認証」を導入するとよりセキュリティーを強化できます。パスワードの代わりに予めサーバーに公開鍵を登録しておき、対応する秘密鍵を持っていなければ接続できないようにするのです。

引き続きパスワードで認証する場合はこの節を読み飛ばしてください

鍵ペアの生成
サーバー

下準備として、サーバーに.sshディレクトリを作成しておきます。パーミッションは700にします。

# mkdir ~/.ssh
# chmod 700 ~/.ssh
ローカル

Unixや、Macであればターミナルから以下のコマンドを実行します。

$ mkdir ~/.ssh
$ ssh-keygen -t rsa
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa
$ scp ~/.ssh/id_rsa.pub staff@***.***.***.***:~/.ssh/authorized_keys

ssh-keygenでは鍵のファイル名の確認・パスフレーズが2回聞かれます。ファイル名はyesと答えましょう。パスフレーズは秘密鍵を暗号化するもので、万が一鍵が盗まれても容易には鍵を使用できないようにするためのものです(ログイン時にパスフレーズを聞かれます)。

できあがった秘密鍵はパーミッションを変更してオーナー(自分)以外はアクセスできないようにしておきます。なおこれ以外のパーミッションだと認証を通りません。

scpでは公開鍵をサーバーに転送しています。***にはIPアドレスを、staffにはユーザー名を入力してください。

Note: すでにサーバーにauthorized_keysが存在する場合、上記のscpコマンドは上書きしてしまいます。複数の公開鍵を登録する場合は別ファイル名で転送しておき、サーバー上でauthorized_keysに結合してください。

Windowsであれば、PuTTYgenを利用して鍵ペアを生成できるようです(詳細)。

サーバー

公開鍵のパーミッションを変更しておきます。

# chmod 600 ~/.ssh/authorized_keys

これで公開鍵認証が可能になりました。

パスワード認証の禁止

さて、現状では公開鍵とパスワードの「どちらかを」パスすれば認証するようになっています。それでは本末転倒なので公開鍵でのみ認証を行うようにします。

# sudo vim /etc/ssh/sshd_config

以下の項目をそれぞれnoにします。

PasswordAuthentication no
ChallengeResponseAuthentication no

設定が完了したらSSHサービスを再起動します。

# sudo /etc/init.d/sshd restart

これで公開鍵認証の設定は完了です。以後は秘密鍵がなければSSHで接続できません。

アップデート

さて、OSインストール後となればOS/ソフトのアップデートがいくらか溜まっています。まとめて更新しておきましょう。

Note: ここでは初期段階なのでupgradeしていますが、運用開始後の定期的な更新はupdateで行うほうが安心です(両者の違い)。

# sudo yum -y upgrade
自動アップデート

さくらのVPSでは、標準インストール環境では規定でほとんどの不要サービスが停止されているのですが、その中にはyum-updatesd(Yum自動更新ツール)も含まれています。もっともyum-updatesdは常駐してメモリを食うので止めたままでいいのですが、それでも自動更新を有効にしたい場合はcronで定期的に起動するyum-cronを代わりに使いましょう。

Note: バージョン依存のものを動かすなど、自動更新されると困る場合は気をつけてください。あるいはYumの設定で特定のソフトを更新対象外にすることも可能です。

# sudo yum -y install yum-cron
再起動

さて、ここらで一旦再起動しておきます。一旦SSHが切断されるので、数分後にもう一度接続しましょう。

# sudo reboot

必要なサーバーソフトウェアの導入

お疲れ様です。やっと下準備が整いました。いよいよ各種サーバーソフトの導入作業に入ります。

Apache

Yumでインストールします。

# sudo yum -y install httpd

Apacheの設定ファイル(httpd.conf)を編集します。

# sudo vim /etc/httpd/conf/httpd.conf

この設定に関しては使用目的により大きく異なってきますので、ここでは示しません。分からない場合は、有用なリソースは多数ありますのでそちらをご参照ください。

なお、パフォーマンスに関わる設定は別記事にまとめています。特にさくらのVPS 512などではメモリ容量も限られていますので、最適な設定を行うようにしましょう。

さくらのVPS 1.5G以上のプランでは、冒頭で述べた理由によりDocumentRoot/home下に移動することをお勧めします。

設定が終わったらサービスを起動します。

# sudo /sbin/chkconfig httpd on
# sudo /etc/init.d/httpd start
MySQL

MySQLサーバーをインストールします。

# sudo yum -y install mysql-server

設定ファイルを編集します。

# sudo vim /etc/my.cnf

old_passwords=1 の後に以下を追加します。

Tips: old_passwords設定はパスワードに対し旧式のハッシュ化を行うことを意味します。これを0にするとより長いハッシュが記録されますが、古い仕様のアプリケーションで問題を起こす可能性があります。

default-character-set = utf8

ファイルの最後に以下を追加します。

[mysql]
default-character-set = utf8

MySQLサーバーを起動しましょう。

# sudo /sbin/chkconfig mysqld on
# sudo /etc/init.d/mysqld start

MySQLのrootパスワードを設定するため、一度rootにログインします。

Note: ここでいうrootとはMySQLにおけるrootアカウントであり、サーバーのrootとは別物です。

# mysql -u root

パスワードを設定します。NEW_PASSWORDおよびwww******cは適宜書き換えてください。

mysql> SELECT host, user, password FROM mysql.user;
mysql> SET PASSWORD FOR root@localhost=PASSWORD('NEW_PASSWORD');
mysql> SET PASSWORD FOR root@www******c.sakura.ne.jp=PASSWORD('NEW_PASSWORD');
mysql> SELECT host, user, password FROM mysql.user;
mysql> exit;

これでMySQLサーバーが使用可能になりました。

PHP

PHPもyumでインストールしましょう。ただしphpでインストールされるのは5.1系です(2010年10月時点)。5.3系はphp53という名前になっています。

まずphp53関連のパッケージ一覧を取得します。

# yum list | grep php53

リストアップされた中から必要なパッケージを選んでインストールしましょう。

# sudo yum -y install php53 php53-gd php53-mbstring php53-pdo php53-xml
Perl/Python

PerlやPythonは標準インストール済みです。ただしバージョンが古いので、新しいバージョンを走らせたいときはソースからインストールする必要があります。方法の説明は省きます。

Perlモジュールのインストールは?

PerlモジュールのインストールはCPANを使うのが一般的ですが、実はYumからもインストールできます。依存関係も解消してくれる上簡単なのでオススメです。

# sudo yum -y install ImageMagick-perl

もっとも、標準リポジトリに掲載されているモジュールはあまり多くありません。必要なモジュールがないときはrpmforgeリポジトリを追加しましょう(初回のみ)。

# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
# sudo rpm -Uvh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
# rm -f rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
# sudo sed -i 's/enabled = 1/enabled = 0/g' /etc/yum.repos.d/rpmforge.repo

利用可能なPerlモジュールの一覧・インストールは以下のように行います。--enablerepo=rpmforgeを指定することでrpmforgeリポジトリが有効になります。

# yum --enablerepo=rpmforge list | grep perl
# yum --enablerepo=rpmforge -y install perl-File-Temp

クリーンアップ

セットアップがすべて終わったら、一応Yumのキャッシュを削除しておきましょう。

# sudo yum clean all

参考サイト

No comments:

Post a Comment