アクセス制限の設定とCentOSのアップデート:仕事で使える魔法のLAMP(3)
前回はsshでVPSにログインして、一般ユーザーを作成しました。今回は、アクセス制限、パケットフィルタリングといった不正アクセス対策の設定をしてから、CentOSをアップデートします(編集部)
もはやrootでログインする必要はない
前回に引き続き、サーバの準備編です。前回、最低限やっておくべきこととして、以下の4点を挙げました。前回は一般ユーザー「atmarkit」を作って、sudoコマンドを使えるようにしました。、以下に挙げた4項目のうち、最初の1つが終わったところです。今回はアクセス制限の設定から続けていきます。
- 一般ユーザーの作成
- アクセス制限
- パケットフィルタ
- CentOSのアップデート
この連載で使っているさくらインターネットのVPSのほか、多くのサーバサービスでは、初期設定では、どこからでもsshによるリモートログインが可能になっています。もちろん、ログイン時にユーザー名とパスワードを入力しなければならないので、誰でも簡単にログインできてしまうということはありません。
しかし、ユーザー名が分かっていれば、パスワードは総当たりによるクラッキングで突き止められてしまう可能性もあります。しっかりしたパスワードを使っていれば、ログインに失敗した後の応答が遅延されるので、総当たりで当てるのは現実的にはほぼ不可能でですが、そうはいってもできる対策はしておくべきです。
まず、rootユーザーがログインすることを禁じてしまいましょう。前回、一般ユーザーを作成しました。もうrootユーザーでログインする必要はありません。以下のようにコマンドを実行してsshdの設定ファイルを編集しましょう。
$ sudo vi /etc/ssh/sshd_config
このファイルの中にPermitRootLoginという行があります。これをnoに書き換えましょう(図1)。
(略) # Authentication: #LoginGraceTime 2m PermitRootLogin no ←この行を書き換える #StrictModes yes #MaxAuthTries 6 (略)
書き換えたらログアウトして、以下のようにコマンドを入力してください。sshdをリロードします。
$ sudo /etc/init.d/sshd reload Reloading sshd: [ OK ]
そして、rootユーザーでログインし直してみましょう。正しいパスワードを入力しても失敗することが確認できれば完了です。
IPアドレスでアクセス制限
次に、sshログインを許可するIPアドレスを指定します。オフィスなどからログインするなら、これが最も簡単で効果的なアクセス制限の方法です。
しかし、インターネットに接続するたびにIPアドレスが変わるような、ダイヤルアップ接続などを使ってVPSに接続する時は、この方法でアクセス制限することは難しくなります。このようなときはパスワード認証を禁止した上で公開鍵認証を使うことで、無関係なユーザーのログインを防げるようになります。この件については、長くなるので解説は次回とします。
許可するIPアドレスは、/etc/hosts.allowファイルを開いて、以下のように設定します。許可したいIPアドレスが複数ある場合はカンマで区切っても良いですし、複数行にしても問題ありません。限定しない場合は、IPアドレスの部分を“ALL”とします。
sshd: 許可するIPアドレス1, 許可するIPアドレス2 sshd: 許可するIPアドレス3
最後に、/etc/hosts.denyファイルに以下の行を追加します。
ALL: ALL
この状態で、許可していないIPアドレスからsshでログインしようとすると、接続しようとするところで失敗し、パスワードの入力まで進みません。
この2つのファイルはTCP Wrapperの設定ファイルです。TCP Wrapperに対応している他のサーバソフトウェア、例えばMySQLなども参照します。今の/etc/hosts.denyファイルの設定は、sshを含め「すべてのサーバで、許可していないアクセスを拒否する」というものです。これを標準と考えて、必要に応じて/etc/hosts.allowファイルにアクセスを許可するIPアドレスを追記していくようにします。
設定を間違えてログインできなくなったら
アクセス制限が働いているかどうかを確認するときは、設定をしているターミナルはそのままにしておき、別のターミナルを開いて動作確認するようにしましょう。設定ファイルに記述するIPアドレスを間違えたままログアウトしてしまうと、ログイン不能になってしまうこともあり得ます。
なお、さくらインターネットのVPSであれば、リモートログインができなくなったとしてもWebブラウザで開ける管理画面があり、そこからログインできるという特長があります。ログイン不能になったとしても、この機能を利用すればやり直しができます(図3)。
もしこのような仕組みを用意していない業者を利用する場合、ログイン不能になったら初期化せざるを得なくなります。ネットワーク関連の設定だけ初期化できるのであればいいのですが、そうでなければOSごと初期化することになるので、ご注意ください。
不要なパケットをシャットアウト
さくらインターネットのVPSでは標準でntpサーバが有効になっていて、正確な時刻を保つようになっています。しかしそのままでは、誰でもntpサーバにアクセスして時刻を参照できてしまいます。ntp側の設定で制限することもできますが、ファイアウォールでパケットごと遮断してしまうというのも1つの手です。今後のことも考え、明示的に許可していないパケットは遮断することにしましょう。
Linuxでファイアウォールといえばiptablesです。/etc/sysconfig/iptablesを図4の内容で作成してください。
*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp ! --syn -j DROP -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT COMMIT
設定ファイルに必要事項を記入できたら、保存して、以下のコマンドを実行してください。iptablesの設定がリロードされて、ファイルに記述したパケットフィルタのルールが有効になります。
$ sudo /etc/init.d/iptables restart
iptablesは非常に多機能ですが、ここではルールをごくシンプルにしています。サーバから外部へ向かうパケットはすべて許可し、外部からのパケットは許可したもの以外をすべて遮断します。現在はsshのポート番号22のみ接続を許可しています。いずれは、httpなどのポートの設定も追加することになるでしょう。
CentOSを最新の状態に
最後に、OSのアップデートです。標準状態ではCentOSのバージョンは5.5です。つい最近5.6がリリースされたのでアップデートしましょう。以下のコマンドを実行すると5.6にアップデートできます。
$ sudo yum -y update
yum-cronパッケージを使って毎日同じ時間に自動的にアップデートさせることも可能です(図5)。しかし、アップデートを安易に自動化するのは好ましくないこともありますので、よく考えて設定してください。アップデートに起因する問題が発生することもあります。あるいは、環境をチームのメンバーや本番環境と一致させておきたいということもあるでしょう。バージョンによって挙動が変わることもあるので、全体で一致していないと無用なトラブルを招きかねません。
$ sudo yum install yum-cron $ sudo chkconfig yum-cron on $ sudo /etc/init.d/yum-cron start Enabling nightly yum update: [ OK ]
ここまで設定すればひとまずサーバの準備は完了です。次回は家庭向けブロードバンド接続を利用する方のために、公開鍵暗号を利用してsshでVPSに接続する方法を解説します。
- CMakeでMySQLをビルドしてみる
- MySQLのビルドに欠かせないCMakeを準備する
- いよいよMySQL編、ソースからビルドすべきか?
- PHPでセッションを利用するための設定
- クライアントがアクセスできる範囲を制限する
- エラーメッセージをどう扱うか?
- ファイルのアップロードを制限する
- リクエストデータを受け取る変数の扱い
- マジッククオート機能には頼らない
- 安全を考えてPHPの実行時設定を調整する
- Apacheの設定ファイルでPHPの設定を変える
- PHPの設定ファイルを作って配置してみる
- PHPスクリプトを実行できるようにする準備
- PHPエクステンション組み込みの仕上げ
- 単純なデータを管理するDBMを使えるようにする
- エクステンションの組み込み状況を確認する
- PHPでデータベースを使う準備をする
- XMLを処理できるようにする
- エクステンションを有効にしてビルドに挑戦!
- PHPテスト失敗の原因を追究する
- 早速PHPをビルド! そしてテスト!
- PHP編に突入! まずはソースをダウンロード
- 設定ファイルを作成してApacheを動作させる
- 設定ファイルや公開ドキュメントの配置を考える
- 1つのサーバに複数の仮想サーバ?
- Apacheの設定ファイルを記述する前に
- サードパーティのApacheモジュールをビルドする
- 認証DBにアクセスするライブラリを組み込む
- Apache同梱ソフトウェアに引数を渡してビルド
- OpenSSLをビルドしてApacheで利用する
- proxyやsslのモジュールを使ってみる
- ライブラリが足りなくてビルドできないときは?
- Apache HTTP Serverのビルドを始めよう
- configureでソフトウェア固有の設定を変更してみる
- configureの設定を変更してみる
- 配布パッケージの中身と、configureの役目を知る
- ダウンロードファイルが真正なものであるかを確認
- Makefileをいろいろ書き換えながらビルドしてみよう
- makeを使ってソフトウェアをビルドしてみよう
- ダイナミックリンクとスタティックリンク
- 「ビルド」という作業は何を指しているのか
- 公開鍵認証でsshを安全に使う
- sshを便利にする公開鍵暗号
- アクセス制限の設定とCentOSのアップデート
- サーバに接続して、一般ユーザーのアカウントを作る
- LAMP環境、自分で作りませんか?
Copyright © ITmedia, Inc. All Rights Reserved.