カテゴリー別アーカイブ: サーバ設定

MySQL接続にSSLを使用する – PHP MySQL SSL WordPress MYSQL_CLIENT_SSL 暗号化

 MySQLの接続にSSLを使う話。

 このブログはWordpressとMySQLが別のサーバで動いている(WindowsServer2003R2化したさくらのVPS上にMySQLサーバを設置して、Apache+PHPを設置したLinux状態のさくらVPSからmysqlコネクタを経由して接続している)
mysql接続は通常は平文なので、ネットワーク上で色々な情報がだらだら流れてしまうのは嫌なので、このコネクションをSSLで暗号化する。

 まず、WindowsServer2003R2上に設置したMySQLサーバにSSL設定を行う。
 MySQL5.5サーバのWindowsバイナリにはSSL機能が含まれているから、特別なプログラムを追加する必要はないけど、Windows上のSSL管理は複雑だ。
 MySQLサーバでは秘密鍵は暗号化されていないファイルでなければならないのだけど、Windowsではそもそも証明書ストアの内部に格納されているので、これを取り出さなければならないんだけど、その操作が証明書の取得と前後する(普通は秘密鍵をベースとして証明書の管理をするんだけど、Windowsでは証明書を取得しないと秘密鍵か取り出せない)
 まず、WindowsのIISマネージャを起動して、ナビゲーションからサーバ>Webサイト>既定のWebサイトを選択して、プロパティを開いて、「ディレクトリセキュリティ」タブにある「セキュリティで保護された通信」の「サーバー証明書」を叩いて「IIS証明書ウィザード」から、「証明書の要求を作成して後で送信する」処理でCSRを作成する(WindowsServer2003R2では古い1024ビットがデフォルトになっているけど、現在は2048ビットが一般的なので、それを選択してCSRを作成する)
 CSRを生成したら、普通にSSL証明書を取得してきて(今回はSSLボックス
からRapidSSLを取得)、適当なcer(※α)としてファイルに保存して、再度「IIS証明書ウィザード」から証明書を登録する(証明書を取得したときに、認証局の証明書も来ると思うので、これも適当なcer(※β)としてファイルに保存しておく)
 証明書の登録処理が完了したら、「セキュリティで保護された通信」の「証明書の表示」を開いて、「詳細」タブの「ファイルにコピー」を実行して、「秘密キーのエクスポート」で「はい」を選んで進むと、PKCS#12形式に固定されているので、チェックボックスを全て解除して、適当なパスワードを設定してpfxファイルにエクスポートする。
 OpenSSLが導入された環境で・・・

openssl pkcs12 -in 出力したpfxファイル -out 中間.cer

で、PFXをデコードする。 この時、聞かれるパスワードは、エクスポート時に設定したパスワードで、パスフレーズはCERに設定するパスフレーズである。
 で、CERにすると、秘密鍵はRSA暗号化された状態なので、再度opensslで

openssl rsa -in 中間.cer -out 平文.pem

とすると、パスフレーズを聞かれるから、先ほど設定したパスフレーズを入れて平文の秘密鍵(※γ)を得る。

 この手順で、α:サーバ証明書、β:認証局証明書、γ:秘密鍵が揃うので、MySQLサーバのあるホストの適当な場所に配置する。
 後は、MySQL設定ファイル(Unixではmy.cnfだが、WindowsではMySQLインストールディレクトリのmy.ini)の[mysqld]セクションに設定を追記する。

ssl-cert=”αのフルパス”
ssl-ca=”βのフルパス”
ssl-key=”γのフルパス”

の、3設定を入れてMySQLサービスを起動する。
 MySQLクライアントで「SHOW VARIABLES LIKE ‘%ssl%’;」とか打つと、

have_openssl : YES
have_ssl : YES

になっていれば、サーバはSSL動作可能な状態になっている。

 PHPのMySQLクライアントでSSL接続する場合には、mysql_connectの第五引数にMYSQL_CLIENT_SSL定数を設定すればOK。
 Wordpressでは、/wp-include/wp-db.php で、@mysql_connect(…)としている部分で、第四引数までセットされているから、「, MYSQL_CLIENT_SSL」と第五引数を追記してやれば、WordpressのDB接続時にはSSL接続を使うようになる。
 正常にSSLに接続されているか確認するために、mysql_connectの下あたりに

$res = mysql_query(“SHOW STATUS LIKE ‘Ssl_cipher'”);
var_dump(mysql_fetch_assoc($res));

とか書いてWordpressサイトに接続してみると、DHE-RSA-AES256-SHAとかの値がべたっと入っていれば、接続はSSLで保護されている(空文字が戻っていたらSSL保護されていない)

 これで、ネット経由のmysql接続が保護されるので、安心して使うことが出来る。

(1207)


カテゴリー: MySQL, PHP, Windows VPS, サーバ設定 | コメントをどうぞ

postfix初期設定 – postfix main.cf

 メールにpostfixを使う場合の/etc/postfix/main.cf設定値のメモ。 デフォルト

myhostname = host.hoge.piyo #自分のホスト名(フル)
mydomain = hoge.piyo #自分のドメイン名(ホスト名を取った部分)
myorigin = $mydomain #ユーザ名のみでポストしたメールのFromの@以降に付けるアドレス(この場合、user@$mydomain=user@hoge.piyoになる)
inet_interfaces = $myhostname, localhost #メールをリッスンするIP(デフォルトではlocalhostのみなので、127.0.0.1[localhostのhosts値]からの送信専用になっているので、外部からメールを受け取れない。 ホスト名で指定する場合、ルックアップでIPを取得できないといけないので、ServersMan@VPSみたいに複数IP割り振ってもらったサーバの場合に受け入れる仮想アダプタを設定できる。 NAT経由でプライベートIPなLAN上のサーバの場合とか、ホスト名をDNSでルックアップするとグローバルが帰ってくるけど、持ってるアダプタのIPはプライベートになるから、ホスト名じゃなくIP指定が良い) 
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain #自分が最終転送先であるアドレスのリスト($mydomainを追加して、user@hoge.piyoを受信出来るようにする)

とりあえずこの辺を設定すれば動く。
さくらのVPSServersMan@VPSデフォルト共通。

参考

(415)


カテゴリー: サーバ設定 | コメントをどうぞ

ServersMan@VPSのフルバックアップを取る – rsync sshfs

 さくらのVPSでは完全仮想化のおかげでddやdumpで簡単にイメージバックアップによるフルバックアップが取れるのだが、ServersMan@VPSでは準仮想化のためイメージバックアップが出来ないのでrsyncを使ってバックアップを取ることにした。
 バックアップ先は自宅のファイルサーバを利用する。
 ファイルサーバのサービスを追加したくないので既存のファイル共有サービスを利用してバックアップしたいのだが、ServersMan@VPSではリモートのnfsやsmbのファイルシステムをサポートしていない。 だが、fuseがサポートされていた↓

#cat /proc/filesystems
ext2
ext3
nodev proc
nodev sysfs
nodev tmpfs
nodev devpts
nodev binfmt_misc
nodev fusectl
nodev fuse
nodev rpc_pipefs

 fuseがサポートされていると、sshfsが使える。
 sshfsは名前の通り、sshを経由してリモートの記憶域を利用できるファイルシステム。
 標準のyumリポジトリにはsshfsは入っていないので、rpmforgeから取ってくる。

#wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm #リポジトリ追加のためのRPMを取得
#rpm -iv rpmforge-release-0.5.2-2.el5.rf.i386.rpm #取得したRPMからリポジトリを追加
#vi /etc/yum.repos.d/rpmforge.repo #標準でrpmforgeが有効になっているので無効にする↓enabledを1から0へ変更
enabled = 1 > enabled = 0
#yum install –enablerepo=rpmforge fuse-sshfs #rpmforgeリポジトリを使ってfuse-sshfsパッケージを導入する(おそらく依存関係も表示される)
#mkdir /mnt/fileserver #マウントポイントを作る
#sshfs remoteuser@fileserver.hoge.piyo:/home/remoteuser /mnt/fileserver #fileserver.hoge.piyo=自宅サーバのユーザー名remoteuserで/home/remoteuserをServersManの/mnt/fileserverにマウントする

 これで/mnt/fileserverが自宅のファイルサーバに繋がったので、後はディレクトリ指定でrsyncすればOK

 rsyncバックアップで除外するリストを作る。

#cat > /root/rsync_exclude_list
– /dev
– /sys
– /proc
– /mnt
ctrl+d

※本当は他にも除外した方が良い物があるが、最低限の記述で済ませた。

 rsyncを実行する。

rsync -avzHAX –exclude-from=/root/rsync_exclude_list / /mnt/fileserver/backup

オプション:
a:各種属性やソフトリンク等を維持する
v:進行状況を詳細に表示する
z:圧縮する
H:ハードリンクも維持する
A:ACLを維持する
X:拡張属性を維持する

 これでフルバックアップが取れる。
 普通はrsync to rsyncでバックアップを取る方法もあるけど、経路暗号化とサービス追加不要というポイントでrsync on sshfsにした。

(711)


カテゴリー: サーバ設定 | コメントをどうぞ

安いサーバには安いなりの設定を その2 – Apache設定 httpd.conf prefork.c

 httpd.confのデフォルト設定では、
MaxClinets 256
ServerLimit 256
になっている。

 これは、Apacheが最大256プロセス起動して256コネクションに応答するという設定。
 さて、これは適切な設定なのだろうか?
 メモリ状況をベースに検討してみる。
 Apacheが停止した状態でメモリ状況を確認。
#free

total used free shared buffers cached
Mem: 514912 376800 138112 0 144052 203260
-/+ buffers/cache: 29488 485424
Swap: 1048568 2852 1045716

 Apacheの1プロセスが消費するメモリを確認。
#ps alx|grep httpd
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
5 48 32222 32212 21 0 39112 3872 374588 S ? 0:00 /usr/sbin/httpd
・・・

 RSSが実際に使用されているメモリ量で、この場合、3872KB使われていると言うこと。
 256プロセスだと、3872KB*256=968MBのメモリを消費するという計算。
 空きメモリはいくつあったかというと、freeの結果に、138112KB(134MB)と書かれている。 Linuxでは、bufferとcacheについては必要に応じて切り出して使用できる(と言っても、少し残しておかないと応答が低下するので、全ては使えないが)ので、buffers:144052KB(140MB)とcached:203260KB(198MB)を加えた472MB位まで使える(-/+ buffers/cache:のfree値)わけだが、使えるメモリの2倍ほどを消費してしまうことになる。

 使えるメモリをhttpdの消費メモリで除算すると
485424/3872=125
であるから、125プロセスまでが物理メモリに収まると言うことになる。

 ServerLimit 256だと、126プロセス目が立ち上がるとスワップが発生し、その応答が遅くなり、処理できないうちに次のリクエストが来ると127プロセス目を立ち上げようとして、処理できずに更に128プロセス・・・となって、プロセスが増え続ける。
すると最終的にシステムが応答不能に陥って見かけ上ダウンする(あるいは、高負荷で実際にダウンする)
 故に、MaxClients/ServerLimitを125以下に制限するべきである。

 ついでなので、prefork.c設定を解説しておく。
・StartServers
 httpd startしたときに起動するプロセスの数。 多くすると初期の起動が遅くなるし、必要に応じてプロセスはServerLimitまで追加されていくので、数個起動しておけば問題ないはずだ。
・MinSpareServers
 プロセスの予備数の最低値で、アクセスがない状態ではプロセスを自動終了するけど、この数のプロセスは最低限残しておく。 これが小さいと、急にアクセスが来たときにプロセスを起動する遅延が発生するが、大きいとアクセスがない状態でもメモリを消費し続ける。
・MaxSpareServers
 MinSpareServersの逆で、アクセスが集中してプロセスが大量に立ち上がった後に、アクセスが減ると、アクティブな接続がないプロセスはこの数を残して自動終了される。
・MaxRequestsPerChild
 一つのプロセスが処理するリクエストの上限を設定する。 この数までリクエストを受け付けたプロセスは終了される。 プロセス内でメモリリークを起こした場合等に一度停止させることでメモリを解放させる効果などがある。

 あるPHPプログラムでメモリを消費したときに、Apacheの1プロセスが300MB近いメモリを確保しながら、ページ読み込みが終了しても開放せず、予想外のメモリ消費を起こしてシステムがダウンする事があったので、MaxRequestsPerChildに適当な値を設定しておくことで運用的に暫定対応した事もある。

(214)


カテゴリー: サーバ設定 | コメントをどうぞ

安いサーバには安いなりの設定を その1 – OS 基本設定 ServersMan@VPS さくらVPS

 そもそもの基本
 x86_64(64bit)だと消費メモリがとても多い(Apacheのデフォルトで実メモリ30MB以上消費する)
 安いプランでレンタルサーバを使う場合には、i386(32bit)をインストールする。
 これは、単純な話、変数の基本型を特に指定せずに使う場合、32bit環境では32bit、64bit環境では64bitの長さになるので、64bit環境は32bit環境の2倍のメモリを消費する。
 32bitの長さで表現できる値を扱う限りにおいては、64bit環境より32bit環境の方がコンパクトであるわけである。
 基本的には64bit環境はメモリアドレスが4GBを超える場合に必要になってくる物と考えて良いだろう(私は4GBプランを32bitで使っている)

 後は、デフォルトで入っていて不要なiSCSIサービスを止める。
chkconfig iscsi off
chkconfig iscsid off
iSCSIはSCSIをIP上に乗っけたプロトコルだが、レンタルサーバで使うことはまず無いだろう。

 さくらのVPS 512では、512MBメモリで64bitOSがデフォルトになっているが、パフォーマンスを考えると、64bit変数が重要でなければ32bitに切り替えるのをオススメしたい。 256MBしか保証メモリがない ServersMan@VPS
Entryプランだったら必ず32bitを選ぶべきだろう。

(210)


カテゴリー: サーバ設定 | コメントをどうぞ

パーミッションを許可すると逆に動作しなくなる – sendmail 777 error World writable directory

 普通、パーミッションが不足して読み書きできずに動作不良が起こることがあるけど、sendmailは逆に、パーミッションが許可しすぎで止まることがある。
 このとき出るのが、World writable directoryと言うエラーメッセージ。

 /etc/mail と言うディレクトリにsendmailの設定ファイルが入っているのだけど、このディレクトリを777にしていると、このエラーが出て止まってしまう。
 セキュリティを考慮して、sendmailは自由に読み書きできるディレクトリを許容しない。
 755とかに変更して、書き込み権限を除去すると動作するようになる。
 デフォルトの設定では問題ないんだけど、操作ミスとかで許可してしまったりすると動作停止してしまうので注意したい。

 また、sudoを許可する /etc/sudoers も0440に設定しないと動作しない。

(838)


カテゴリー: サーバ設定 | コメントをどうぞ

cronでログ出力とメール送信を同時にしたい – パイプ リダイレクト tee

 cronでバッチを走らせた場合に良くやるのが、リダイレクトを利用したロギング

0 * * * * /root/test.sh >> /va/log/test.log

みたいにリダイレクトすればtest.shを実行して標準出力の内容をtest.logに追記できる(上書きなら>一個)

 また、出力内容をメールしたい場合には、リダイレクト(>)の代わりにパイプ(|)を使って、

0 * * * * /root/test.sh | mail user@hoge.piyo

みたいにmailコマンドに入力してメールを飛ばす。

 で、本題はロギング(リダイレクト)しつつ、メール送信(パイプ)もしたい場合。
 プログラムの中に何かしら書いてしまえば出来るけど、手を入れずに済ませる場合に使えるのが tee と言うコマンド。
 tee は、入力された情報をファイルに書き込みつつ標準出力にエコーするだけの単純なプログラムだ。

0 * * * * /root/test.sh | tee /var/log/test.log | mail user@hoge.piyo

のように使うと、/var/log/test.log に書き込んで、メールも飛ばせる。

デフォルトで上書きなので、追記したい場合は

0 * * * * /root/test.sh | tee -a /var/log/test.log | mail user@hoge.piyo

のように、-a(append)オプションを付けてやればいい。

 ほんとに単純なコマンドではあるが覚えていると便利である。

(1860)


カテゴリー: サーバ設定 | コメントをどうぞ