Smart -Web Magazine

WEB開発者に嬉しいステキ講座

MENU

MySQLのセキュリティ対策

2009年8月6日 コメントの追加

MySQL のセキュリティ

MySQLサーバに接続するときは、パスワードを使用すべきだ。パスワード以外の全ての情報はテキストで転送されるので、覗き見される恐れがある。
 より安全にしたい場合、 ssh (http://www.cs.hut.fi/ssh) をインストールする。これを使用すれば、MySQL サーバーと MySQL クライアント間の TCP/IP コネクションは全て暗号化される。

MySQL システムを安全にするための注意点

  • 全ての MySQL ユーザにパスワードを使用する
  • mysqld を実行している Unix ユーザだけが読み込み/書き込み可能
  • process 特権を全てのユーザに与えない(この許可がある人は誰でも mysqladmin processlist コマンドで実行されているクエリーの中身を見ることができる)。
  • file を全てのユーザに与えない(ユーザがこの特権を持つ場合、mysqld デーモンを実行している Unix ユーザーの権限で、ファイルシステム内のどこにでもファイルを書き込むことができる)。
  • DNS を信用しない場合、特権テーブル内にはホスト名の代わりに IP を使用すべきだ。mysqld への --secure オプションは原理上はホスト名を安全にする。どんな場合でも、ホスト名へのワイルドカードの使用については、注意深くすべきだ。

MySQLの安全な起動法

MySQL デーモンを Unix の root ユーザーで実行しないように。 mysqld は任意のユーザで実行できる。MySQL を動作させるユーザーは以下のようにするといい。

  • login を許可しない (shell や passwd を与えない) 
  • wheel や root group にしない
  • 全く新しく作成した group に属する 

MySQLサーバの起動

# mysqld -u mysqluser [オプション] &

※mysqld を 他の Unix ユーザーで起動したとしても、 MySQL の user テーブルの root ユーザーの名前を変更する必要はありません。

セキュリティに影響するmysqlオプション

--secure
gethostbyname() から返される ip がオリジナルのホスト名に戻せるかどうかをチェックする。これは、外の誰かが他のホストを真似てアクセスを得ることを難しくなる。
--skip-grant-tables
特権システムを全く使用しない。これは全員に全てのデータベースへの 完全なアクセス を与える。
--skip-name-resolve
ホスト名を解析しない。特権テーブル中の全ての Host項目は IP 番号か localhost でなければならない。
--skip-networking
ネットワーク (TCP/IP) 経由の接続を許可しない。mysqld への全ての接続は、 Unix ソケットで行われる。
このエントリーをはてなブックマークに追加

Apacheのセキュリティ情報

2009年8月5日 コメントの追加

サーバサイドインクルード

サーバサイドインクルード (SSI) を許可していると、ユーザによってシェルにアクセスされる可能性があるので、必要なければ無効にした方が良いでしょう。Options命令にIncludesNOEXECオプションを加えます。

スクリプトエイリアスを使わないCGI

ユーザにどこのディレクトリででもCGIを実行できるように許可する際は、次のことを注意しましょう。

  • ユーザーが故意に攻撃、あるいはシステムをあばくスクリプトを書く。
  • セキュリティーホールを空けることによって、サーバ全体のセキュリティが弱くなる。

スクリプトエイリアスを使ったCGI

特別なディレクトリだけにCGIの実行を許可しておけば、スクリプトエイリアスを使わないCGIよりも安全です。

一般的なCGI

すべてのCGIスクリプトは同じユーザーとして作動するので、それらは衝突しあう可能性があります。例えば、ユーザAがユーザBのCGIがアクセスするファイルを消してしまう等です。Apacheは異なったユーザ権限でスクリプトが実行できるので、必要があればそのような環境を用意したほうが良いでしょう。

.htaccessの禁止

必要がなければ、管理者が設定したセキュリティを最優先して、ユーザが.htaccessファイルを設定することを禁止したほうが良いでしょう。

サーバ設定ファイルに追加

<Directory />
AllowOverride None
Options None
allow from all
</Directory> 

これでアクセス設定の上書きが全てのディレクトリで禁止されます。

サーバファイルのプロテクト

もしユーザが下記のコマンドを実行した場合、それがセキュリティーホールとなります。

# ln -s / public_html

ブラウザから http://localhost/~root/ とすれば、rootのディレクトリが表示されてしまいます。回避策として、サーバのコンフィギュレーションに以下のブロックを追加しておきましょう。

<Directory />
    Order deny,allow
    Deny from all
</Directory> 

これはファイルシステムのロケーションへのデフォルトアクセスを禁じます。それから、望むエリアにだけアクセスを許可します。<Directory> ブロックの割り当てを追加しましょう。

<Directory /home/*/public_html>
    Order deny,allow
    Allow from all
</Directory>
<Directory /home/httpd/html>
    Order deny,allow
    Allow from all
</Directory> 

<Location> と <Directory> 命令の相互作用には特別な注意が必要です。 例えば、<Directory />がアクセスを拒否したとしても、<Location />命令はそれを覆してしまいます。

また、UserDir命令も用心したいところです。 "./"のようなものにそれを設定することは、最初の上の例のように、ルートに同じ影響をもたらします。設定ファイルに以下の行を追加しておくと良いでしょう。

UserDir disabled root
このエントリーをはてなブックマークに追加

Jump to the top