まず,一般ユーザーの作成を行います.
今の時点でサーバに存在しているユーザーはroot,すなわち管理者ユーザーです.
rootは何でもできる権限を持っているかわりに誤操作で重要なファイルを削除したり,設定を変更してしまう可能性もあります.そのため普段は管理者権限を持たない一般ユーザーでログインして管理者権限が必要なときのみsuコマンドによってrootになるようにします.
以下の操作(コマンド)で一般ユーザーを作成します.
また,この操作はさくらインターネットの"VPSコントロールパネル","リモートコンソール"で行ってください.
サーバが動作していなかったら"VPSホーム"の"仮想サーバ操作"の"起動"ボタンをクリックしてサーバを起動してから一般ユーザーを作成します.
# useradd [新しい一般ユーザー名]
# passwd [新しい一般ユーザー名]
パスワードを設定します.
確認のため2回の入力を要求されます.
# usermod -G wheel [新しい一般ユーザー名]
新しい一般ユーザーでsuコマンドが使えるようにします.
# nano /etc/pam.d/su
エディタを起動して,
#auth requared pam_wheel.so use_uid
という行の先頭の"#"を消して(コメント解除)保存します.
次に,以下のコマンドで一般ユーザーでSSH接続時に使用する公開鍵を置いておくディレクトリを作成します.
# mkdir -p /home/[新しい一般ユーザー名]/.ssh
"Secure Shell" の略.
安全にリモートコンピュータと通信ができます.
リモートサーバにアクセスして操作するときは基本的にSSHを用います.
認証方法には,大きく次の2つがあります.
デフォルトでは,パスワード認証が有効な設定になっています.
パスワードでの認証を許可すると,総当たり攻撃を受ける可能性があるため,
ここではより安全な「公開鍵認証」方式を使います.
2つの鍵を用いてデータの暗号化,復号を行う暗号方式の公開鍵暗号方式を利用した認証方式です.
(対して,パスワード認証の様な認証方法を「共通鍵認証」と言います.)
暗号化に用いる鍵を「公開鍵」,復号に用いる鍵を「秘密鍵」といいます.
秘密鍵でなければ公開鍵によって暗号化されたデータを復号できないのが特徴です.(公開鍵は暗号化専用の鍵)
実際の認証時には,接続先サーバに公開鍵を,手元に秘密鍵を用意して接続,認証を行います.
ダウンロードしたときにPuTTY本体と一緒についてくるputtygen.exeを使用します.
以下の手順で公開鍵と秘密鍵を生成します.
- "Generate"ボタンをクリック
- 上半分の"Key"の枠内でマウスをランダムに動かして鍵を生成します.
- 次に"Key passphrase"と"Confirm passphrase"に鍵のパスフレーズを入力します.(パスフレーズは公開鍵認証の接続時に入力する必要があるので覚えておきましょう)
- "Save private key"ボタンをクリックし,適当な名前をつけて秘密鍵を保存します.
公開鍵であるが,PuTTYで生成される形式はLinuxで使われているSSHの実装のOpenSSHとの互換性がないので"Save public key"ボタンからは保存しません.
- メモ帳を起動して,上部の"Public key for pasting into OpenSSH authorized_keys file:"という枠の中の文字列をコピー&ペーストします.
これが公開鍵になります.適当な名前(~.pubという名前が一般的)をつけて保存します.
公開鍵認証では接続先のリモートコンピュータに公開鍵を登録しておく必要があります.
そこで,WinSCPを用いてファイルを公開鍵をリモートコンピュータに転送した後,SSH接続を行います.
今回,サーバとのファイルのやり取りにはWinSCPというソフトを使用します.
http://winscp.net/eng/index.phpからダウンロードできます.
以下の手順で日本語化できます.
- WinSCP起動すると最下部左に"Languages"というボタンがあるのでクリックします.
- 表示されたメニューの"Get More"をクリックすると言語ファイルのダウンロードサイトがブラウザで開かれます.
- Japaneseを選び,"jp.zip"をダウンロード,解凍して,"WinSCP.jp"をWinSCP.exeと同じフォルダに置きます.
- 先ほどの"Langages"メニューで日本語が選べるようになります.
公開鍵は接続先のコンピュータに転送しておく必要があります.
また,この時点ではまだ公開鍵認証での接続はできないので,ユーザー名とパスワードを使って接続します.
以下の手順で公開鍵を転送します.
- WinSCPを起動して"Host name"にサーバのIPアドレス,"User name"にユーザー名(作成した一般ユーザー名),"Passward"にパスワードを入力して最下部の"Login"ボタンをクリックします.入力した項目が正しければサーバに接続されます.
- 接続できたらホームディレクトリ(/home/[一般ユーザー名]/)内の".shh/"というディレクトリに公開鍵をコピーします.公開鍵のファイル名は"authorized_keys"とします.
".ssh/"がなければ作成してからコピーします.
コピーできたら接続は切断してかまいません.
- SSHコマンド
- PuTTY(今回使用するクライアント)
- Tera Term
- Poderosa
今回はPuTTYというWindows向けSSHクライアントを使用します.
英語版はhttp://www.chiark.greenend.org.uk/~sgtatham/putty/から,日本語版はhttp://hp.vector.co.jp/authors/VA024651/PuTTYkj.htmlからダウンロードできます.
鍵生成から接続まではhttp://www.atmarkit.co.jp/fwin2k/win2ktips/1321putykey/putykey.htmlを参考にするとわかりやすいです.
そのままの設定だと使いにくい部分があるので,次の設定をしましょう.
- 端末-キーボード-ファンクションキーとキーパッド:Xterm R6
- ウィンドウ-外観-フォントの設定:お好みで
- ウィンドウ-変換-文字コードの設定:UTF-8
- 接続-Keepaliveの間隔:1
- 接続-TCP keepalivesを有効にする:チェックを入れる
- 接続-SSH-優先するプロトコルバージョン:2のみ
以下の手順でSSHを用いてサーバに接続します.
- puttyjp.exeを起動します.
- "ホスト名"に"[作成した一般ユーザー名]@[サーバのIPアドレス]"と入力します.左側のカテゴリ内の"SSH"から"認証"を選んで,"認証のためのプライベートキーファイル"に保存した秘密鍵を指定します.
- 最下部の"開く"ボタンをクリックすると接続が開始されます.
- 初回接続時には"PuTTYセキュリティ警告"という警告ダイアログが表示されますが,"はい"をクリックして接続します.
- 公開鍵認証で接続する旨を示すメッセージが出た後に"Passphrase for key"と表示されるので鍵のパスフレーズを入力してEnterキーを押します.
サーバへのログインに成功するとプロンプトが表示され,サーバを操作することができるようになります.
デフォルトの設定のままだと,日本語の表示がおかしくなるので,次のコマンドラインを実行します.
$ echo "export LANG=ja_JP.UTF-8" >> ~/.bash_profile
$ source ~/.bash_profile
CentOSのそのままの設定では不必要なポートが開いているため,インターネット上から様々な攻撃を受ける危険性があります.(特に,自動化された攻撃は日常的に行われています)
ここでは,攻撃を予防する基本的な手段として,「ファイアーウォール」の構築を行います.
ここで構築する「ファイアーウォール」は,サーバを出入りする通信を監視し,不正な通信を防ぐ役割を果たします.
Linuxカーネルには,「iptables」というファイアーウォールのための仕組みが備わっています.
ここでは,iptablesを利用してファイアーウォールを構築します.
https://gist.github.com/4319634にiptablesの設定を用意しました.
iptablesは基本的に全てコマンドラインから設定します.
1行1行入力していては,同じ設定を復元できないので,この様にスクリプト形式で作っておくと便利です.
https://gist.github.com/raw/4319634/2187775b83241b0cd48fd889b314a9f61ec487f7/iptables.shから,このスクリプトをダウンロードできます.次のコマンドラインを実行して,このスクリプトを適用してみましょう.
$ su -
# wget https://gist.github.com/raw/4319634/2187775b83241b0cd48fd889b314a9f61ec487f7/iptables.sh
# chmod +x iptables.sh
# ./iptables.sh
# chkconfig iptables on
ポートがきちんと閉じられている,あるいは開いているか確認する方法としては次の方法があります.
ただし,ポートを開いていても,そのポートを使っているサーバソフトウェアが動作していなければ,検知できません.(当たり前ですが)
- ポートスキャンサービスを利用する
- nmapを使う
- 高度な様々なスキャンを行える
- サーバの中からスキャンしても意味ないよ!(内側からのアクセスと外側からのアクセス許可が異なるため)
以下に参考になりそうなサイトをまとめて示します.