Warning: Declaration of FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Tags::wrap($content, $before, $sep, $after) should be compatible with FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Category::wrap($content, $sep, $parents) should be compatible with FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Post_Thumbnail::wrap($html, $post_id, $post_thumbnail_id, $size) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Post_Meta::wrap($data, $post_id, $key, $ui, $single) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Widget::wrap($params) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/widget.php on line 0

Warning: Declaration of FEE_Field_Comment::wrap($content) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Term_Field::wrap($content, $term_id, $taxonomy) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Single_Title::wrap($title) should be compatible with FEE_Field_Term_Field::wrap($content, $term_id, $taxonomy) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Option::wrap($content, $key, $ui) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0
さくらのVPS導入 | Sabakura Blog

「さくらのVPS」導入解説 その10:iptablesの設定

この記事は「さくらのVPS導入解説 その9」の続きです。

今回はiptablesによるファイアウォールの設定を行います。これでVPSを利用する前提としてのセキュリティ設定が一通り完了します。

ファイアウォールとは

ファイアウォールとは、不正アクセスを防ぐための技術の総称です。
ファイアウォールにも幾つかの種類がありますが、もっとも一般的なのが、アクセス(パケット)の通信元・通信先や通信経路を調べ、それが怪しいものである場合に通信を遮断するものです。「パケットフィルタリング」とも呼ばれます。

iptablesとは

Linuxでは、このパケットフィルタリングを設定するために「iptables」というコマンドが用意されています。今回はこのiptablesを使って、パケットフィルタリング型ファイアウォールを設定します。

iptablesの設定

iptablesの設定は量が多くなるため、vi/vimの操作になれていない場合は、ローカルでテキストエディタで編集したあとに貼り付けするのが良いと思います。

以下が、iptablesの設定内容です。
さくらのVPS を使いはじめる 3 — iptables を設定する – アカベコマイリを参考にさせていただきました。

*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, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-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
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT

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

COMMIT

iptablesの内容について

とにかく設定するだけであれば上記を貼り付けですみますが、ここではiptablesによってどのようなパケットフィルタリングを行っているか理解するために少し解説します。
なおこの解説部分の作成にあたっては、iptablesの設定 – サーバの実験室を参考にさせていただきました。

*filter

iptablesでは、設定は一覧テーブル(表)にまとめられます。
iptablesでは3種のテーブルが用意されていますが、パケットフィルタリングを行うためのテーブルがこの「filter」です。つまり、ここではfilterテーブルの使用を宣言しています。(なお、この記述を省略した場合でも、デフォルトではfilterテーブルが利用されます)

:INPUT   ACCEPT [0:0]

INPUT(インプット)つまり、このホストに対して入ってくるパケットを通過させるか遮断させるかを設定します。ここでは「ACCEPT」を設定して、いったんすべてのパケットを許可しています。
また[0:0]は「パケットカウンタ:バイトカウンタ」を表しています。今回は[0:0]にすることで、カウンタをそれぞれ0に初期化しておきます。

:FORWARD ACCEPT [0:0]

INPUT同様に、FORWARDのパケットに対する設定です。
FORWARDでは、このホストを経由するパケットに対しての設定を行います。

:OUTPUT  ACCEPT [0:0]

OUTPUTでは、このホストから送られるパケットに対する設定を行います。
なお、これらINPUT、FORWARD、OUTPUTは正確には「チェイン」と呼ばれます。(INPUTチェイン、のように呼びます)

:RH-Firewall-1-INPUT - [0:0]

前述のINPUT、FORWARD、OUTPUTとは別に、ユーザー定義のチェインを定めます。
このユーザー定義チェインで、細かいパケットフィルタリングの設定を行います。

-A INPUT -j RH-Firewall-1-INPUT

「-A」は新しいルールの追加を表します。半角スペースに続けてチェイン名を入力することで、どのチェインにルールを追加するか示します。ここではINPUTチェインに対して、新しいルールを追加しています。

また「-j」はjumpの略で、あるチェインを別チェインにジャンプさせる場合に使います。
ここではINPUTチェインを、ユーザー定義チェインにジャンプさせています。これにより、INPUTチェインで入ってくるパケットが、ユーザー定義チェインでチェックされるようになります。

-A FORWARD -j RH-Firewall-1-INPUT

同様にしてFORWARDチェインも、ユーザー定義チェインにジャンプさせてチェックするように設定しています。

-A RH-Firewall-1-INPUT -i lo -j ACCEPT

「lo」は「ループバック」と呼ばれる、自分自身への通信(INPUTとFORWARDが同じ)を指します。ループバックの場合は「ACCEPT」にて通信を許可します。

-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT

「icmp」とは通信にエラーが生じた際にエラーメッセージを送るプロトコルです。ICMPの場合は「ACCEPT」にて通信を許可します。

-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT

「-p」に続けて番号を入力することで、プロトコルを指定して通信を制御できます。
上記では50(ESP)と51(AH)を許可していますが、この二つはどちらもパケットが改ざんされていないかをチェックするためのプロトコルです。
参考:IPプロトコル番号一覧 – ネットワークエンジニアとして

-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT

ポート「5353」はマルチキャストDNSというプロセスです。これは専用のアドレス「224.0.0.251」にパケットを投げて応答をもらうことで、わざわざIPアドレスとホスト名の変換を行わなくてもマシンを認識できる仕組みです。

-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT

ポート「631」は印刷データの送受信のためのプロトコルです。これも「ACCEPT」で許可しておきます。

-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

「-m」はiptablesの拡張モジュールを使うための設定です。上記の例では「state」と続けて入力することで、stateモジュールの利用を可能にしています。

この「state」はパケットの状態を指定するためのモジュールです。今回は「ESTABLISHED(過去に接続されたことがある)」または「RELATED(既存の接続に関係している)」と見なされた場合に、接続を許可しています。
※なお、この一行がないと通信を行うことが出来なくなりますので注意してください。

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT

こちらも「state」を使ったルールです。
パケットの状態が「New」である場合でも、SSH接続にあたるポートであれば、接続を許可します。

※ここで「10022」を指定しているのは、前回の記事でSSHのポート番号を10022にしたためです。もしポート番号を変更していない場合は「22」、また任意で別の番号にした場合はその番号を入力してください。

また「-m tcp」でtcpモジュールを有効にした後に、「-p tcp」でプロトコルがtcpの場合に限定しています。

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-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
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

同様にして「80(HTTP)」「20・21(FTP)」「25(SMTP)」の接続を許可します。
ここまでで、許可したい接続のルールが終わりました。

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

すでに接続を許可したいパケットのルールは読み込まれているため、この行を読み込むのは、接続許可のルールに一致しなかったパケットになります。それらのパケットはすべて「REJECT(エラーパケット送信)」します。

「–reject–with」はエラーパケットの種類を指定するためのもので、今回は「icmp-host-prohibited(ホストによって禁止されました)」というメッセージを送るように指定しています。

COMMIT

最後にこれらのルールをコミット(登録)します。

iptablesを設定する

それでは作成したiptablesの設定をVPSに登録します。

  1. 以下のコマンドを入力し、iptablesの設定ファイルを開きます(作成します)。
    $ sudo vi /etc/sysconfig/iptables
    
    • Poderosaのステータスラインに[New File]と表示されていると思いますが、これはiptablesファイルは新規作成されるファイルのためです。
  2. テキストエディタからコピーしたiptablesの設定を貼り付けします。
    • Poderosaのメニューバー「編集」→「貼り付け」で貼り付けできます。
    • 行頭・行末に空白スペースが入ってはいけないので注意してください。また最終行での改行も行わないようにしてください。
  3. 「:wq」を入力して上書き保存と同時にviを終了します。
    :wq
    
  4. 以下のコマンドを入力し、iptablesを再起動します。
    $ sudo /etc/rc.d/init.d/iptables restart
    
  5. 「Applying iptables firewall rules: [ OK ]」と出たらOKです。
  6. 以下のコマンドを入力することで、現在のiptablesの状態を確認できます。
    $ sudo /sbin/iptables -L
    

以上でiptablesの設定は完了です。

「さくらのVPS」導入解説 その9:SSHのポート番号を変更する

この記事は「さくらのVPS導入解説 その8」の続きです。

今回はSSHのポート番号を変更します。

SSHのポート番号の変更

SSHは初期設定では22番ポートを使っています。
ただし、22番をそのまま使った場合、不正侵入の危険性が高まります。(何番のポートを使って通信しているかが分かれば、当然そこからの侵入の可能性が高まってしまうためです)

そこでSSHのポート番号を変更します。これは前回も編集したSSHの設定ファイル「sshd_config」をviで編集します。これもsudoしてから編集します。

  1. VPSにログインし、以下のコマンドを入力します。
    $ sudo vi /etc/ssh/sshd_config
    
  2. カーソルキーで移動して「#port22」の最後でaキーを押して挿入モードに入ります。
  3. Enterで改行し「Port10022」と入力します。
    #port22
    Port10022
    
  4. Escキーを押して挿入モードを抜けます。
  5. 「:wq」を入力して上書き保存と同時にviを終了します。
  6. ポート番号が変更できたら、以下のコマンドを入力してsshdを再起動します。
    $ sudo /etc/rc.d/init.d/sshd restart
    
  7. 「Stopping sshd」と「Starting sshd」がそれぞれOKと出たら再起動完了です。

以上でポート番号の変更は完了です。

ここで一度SSHを切断して、Poderosaから新しく設定したポート番号で接続できるか確認してください。また念のため、22番ポートでは接続できなくなっているかも確認しておきましょう。

参考:利用するポート番号について

なお今回ポート番号を10022にしたのは、さくらインターネット創業日誌を参考にしています。

・CentOSをサーバーとして活用するための基本的な設定

もちろんこのほかのポート番号を割り当ててもらってもOKです。
ポート番号は0~65535まで使えますが、あまり数字が小さいと他のサービスとかぶったり
ポートスキャンで早々と見つかったりするので、できれば大きめの数字を割り当てておくことをおすすめします。

参考:現在使っているポート番号を確認する

また現在 netstat -ln することで
StateがLISTENになっているポート(現在使っているポート)を確認することもできます。

Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN  

次回は、iptablesによるファイアウォールの設定を行います。

「さくらのVPS」導入解説 その8:システムのアップデート

この記事は「さくらのVPS導入解説 その7」の続きです。

前回までで通常ユーザーの作成と公開鍵認証ができるようになり、セキュアなログインが行えるようになりました。そこで今回からはサーバーのセキュリティ設定を行います。

システムのアップデート

まずOSのシステム自体のアップデートを行います。
さくらのVPSではOSも自由に選択できますが、ここではCentOSを導入しているものとして進めます。

Linux/UnixではOSおよびソフトウェアのアップデートについては、パッケージ管理システムと呼ばれるシステムを利用します。

たとえばWindowsでも、WindowsUpdate(MicrosoftUpdate)によってWindows自体のアップデートおよび各種ソフトの更新がなされますが、それと類似の機能を提供するものと考えると理解しやすいと思います。

パッケージ管理システムには幾つか種類がありますが、CentOSの場合はYum(Yellowdog Updater Modified)と呼ばれるシステムを採用しています。そしてこのYumを利用するために、そのままの名前ですが「yum」というコマンドが用意されています。

では実際にYumを利用してシステムをアップデートします。なお、yumコマンドはroot権限でしか利用できませんので、今回もsudoコマンドを使うことになります。

  1. Poderosaを使って、SSHの公開鍵認証でログインします。
  2. 「sudo yum update」と入力してEnterキーを押します。
  3. ユーザーパスワードを聞かれるので入力(貼り付け)してEnterキーを押します。
  4. ダウンロードするパッケージ一覧が表示され「Is Is this ok [y/N]:」と聞かれるのでyを入力してEnterキーを押します。
    Install       5 Package(s)
    Upgrade     154 Package(s)
    
    Total download size: 186 M
    Is this ok [y/N]: 
    
  5. さらにGDPキーをインストールするかどうか問われますので、再びyを入力してEnterキーを押します。
    warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID e8562897
    base/gpgkey                                                                   | 1.5 kB     00:00     
    Importing GPG key 0xE8562897 "CentOS-5 Key (CentOS 5 Official Signing Key) <centos-5-key@centos.org>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
    Is this ok [y/N]:
    
  6. すべてが完了すると「Complete! 」と表示されます。

以上でシステムのアップデートは完了です。

次回はSSHのポートを変更します。