契約及び準備~初期設定

以下より、今回契約したVPSのための準備や行った設定などを、作業順通りに書いていきたいと思います。なので、記述が下に行くほど新しい作業内容になります。

 

VPS契約

メインのVPSですが、選定について色々と迷いました。がしかし、結局は金銭的コストを重視して国内かつ安っすいで有名なServersMan@VPSのEntryプランに決めました。

もし非力に感じてきたらリソース拡張すればいいかなと思い・・・。拡張は割高になるかな?まぁそんなヘビーな使い方はする予定ないのでEntryで十分でしょう(適当)。

以下、契約概要です。

プラン名 → Serversman@VPS

メモリ → 1GB

CPU → 2コア

ストレージ → HDD50GB

OS → CentOS, Debian, Ubuntuから選べる

バックアップ機能 → オプションであり(有料)

料金 → 467円(税抜)

 

初見ですと、ブラウザのコントロールパネルがちょっと使いづらい印象ですね。あと、ServersManから自動で割り当てられたお客様IDと、こちらが指定したメールアドレスによる2通りのIDでログイン可能なようで、ちょっと戸惑いました。もちろんそれぞれにパスワードを設定します。まあ、2通りあるからには何か理由があるのでしょう。

また、ブラウザ経由のSSHコンソールというAirDisplayという機能なのですが、対応ブラウザがIE6.0~9.0というのが難点ですね。IEユーザーでない者によっては少し不満です。

とまぁ、不満ばかり言って申し訳ないですが、その他は概ね満足。もちろん契約直後なので細かいことは不明ですが、これから趣味を兼ねてイジっていく分には費用対効果十分ではないでしょうか。

 

独自ドメイン取得

サーバーを取得したからにはドメインも取りたいとこです。ただ、独自ドメインは少なからずカネがかかる・・・と思っていたら、無料で独自ドメインを取得できる方法を見つけました。

freenomというオランダのドメインプロバイダ様が幾つかのccTLD(国別コードTLD)を無料提供して下さっているそうです(露骨)。

http://www.freenom.com/ja/index.html

やはり無料なのでgLTD(.com, .net等)や.jpドメインとかはダメですが、.mlや.gqや.cfなどのccTLDは無料で取得できるそうです(えっとドコの国デスカ?)。

 

無料の反面いくつか注意が必要です。以下、「私のドメインが無効になることはありますか?」という質問に対する回答を本家サイトから抜粋したものです。

無料ドメイン名を持つことはあなたに法的な登録者の権利を与えるものではありません。

・・・

あなたが期限内にドメイン名を更新しない場合登録は解除されます。各登録期間の最後の15日間に無料ドメインの無料更新ができます。

なるほど、つまり無料ドメインの権利を運営側の判断で万が一剥奪された場合も、文句は言えないということですね。ただよっぽどの限り、期間内に勝手に解除することはないでしょう。

更新作業は当たり前のことですね。でも15日前にメール通知とかはしてくれるのかしら (・∀・)

 

とにかく無料ですから、なんにも文句はありませんよ。タダより高いもんは無いなんて言いますが、多少のリスクはあってもタダに越したことはありません!

 

※追記※

初期準備に時間がかかってしまい、なかなか取得ドメインでWebサイトを公開することができませんでした。それで・・・まんまとドメイン使用権を剥奪されてしまいました\(^o^)/

前述の本家サイトのQ&Aには以下のような続きがあります。

あなたのウェブサイトが長期間停止している場合や受け入れ難い内容、またはアップロードしていない場合、そのドメインはキャンセルされます。

長期間の停止以前にまだ公開すらしてないのですが、恐らくはこの部分に引っかかったのでしょう。しかも迷惑メールに割り振られていて気づきませんでしたが、freenomから「我々がサイト見に行ったけど公開されてなかったよ。だからキャンセル処理するよ~」という旨のメールが届いていました。なるほど、これが無料の副作用ですが・・・ 予想外に早く実感できて良かったです(笑)

取得し直すのはWebサイト公開準備ができてからのほうが良さそうですね。

 

実際の取得の仕方ですが、トップ画面から取得したいドメインを入力して右のボタンを押します。

すると使用可能なドメインリストが一覧されますので取得したいドメインを「今すぐ入手!」を押します。下図のように、無料と書いてあるドメインが無料で取得できるやつです。下のオレンジ色の部分は普通に有料のドメインなので今回は無視します。選択したら「チェックアウト」を押します。

2016-03-28xxxxx

急に英語ページに遷移しますが警戒せずに進めていきましょう。

Use your new domainForward this domain(このドメインから別ドメインに転送)かUse DNS(DNSを使う)を選択します。今回はいわゆるドメイン名なのでUse DNSを選択します。

Period(契約期限)には何ヶ月使用するか指定します。一度の契約で無料なのは12ヶ月までみたいですね。あとは、Continueを押します。

次にメールアドレス認証のために、有効なメールアドレスを入力します。するとそのアドレス宛に認証コードが書いてあるメールがfreenomから届くので、遷移後の画面に入力しましょう。

あとは、登録者情報を入力します。ちなみにこの情報はWhoisで公開されることはなく、freedomがWhois情報代行をしてくれます。無論、freedomのプリバシーポリシーは不明ですので自己責任ですねこれは。

これで無料で独自ドメインを取得できました。あとは、DNSレコードの設定を行い、契約したVPSとドメイン名を紐付けませう。

 

独自ドメイン設定

さて、DNSレコードの設定ですが、Freenomへログイン後のホーム画面からMyDomainsを選択します。背景画像はデフォルトで🐈です。猫好きとしてはかなり高評価です(n*´ω`*n)

2016-03-28 (2)

↑↓

2016-03-29 (2)

 

とりあえずAレコードを設定します。VPSのIPアドレスを入力するだけでOKです。

 

 

ホスト名の変更

ドメイン取得してDNS設定をしたので、VPSのホスト名を変更しておきます。ここでは、先ほどタダで取得したドメイン名をホスト名として設定します。

ドメイン名はホスト名を含んだ大きな概念ですが、今回取得したドメイン名はDNSレコードに設定してVPSと関連付けた時点でホスト名とも言うことができるので、まぁそういうことです。

# 現状確認 最初はだいたい適当なホスト名が運営側によって付けられている
hostname
first.com

# ホスト名変更(一時的)
hostname next.com

# ホスト名変更(恒常的)
vim /etc/sysconfig/network
HOSTNAME=next.com

# ホスト名再確認
hostname
next.com

 

BASHやVIMとかの入力系の設定

これからVPSの設定を色々していくうえで、バシバシとコマンドを打つことになりますしエディタだって使います。それら入力周りの強化は作業効率の向上に寄与しますので絶対にやっておきましょう。

BASHコマンド自動補完

バッシュシェルでコマンドを打つときに続くオプションコマンド等をTABキーで補完できるよう設定します。普通でもTABで候補を表示したり補完してくれますが、オプションまではやってくれません。

これはかなり有能なので是非入れときます。

さて、bash_completionというパッケージをインストールするのですが、これはEPEL(エンタープライズLinux向け拡張パッケージ)リポジトリが入ってないとyum install bash-completionとしてもインストールできません。なのでEPELを追加する必要があります。

# EPELリポジトリを追加
yum install epel-release

# EPELリポジトリを有効化 ※インストール後は自動的に有効になってる
vim /etc/yum.repos.d/epel.repo
enabled=1

# インストール
yum install bash-completion

# インストールの確認
ls -l /etc/bash_completion
-rw-r--r-- 1 root root 57739 4月 3 00:00 2013 /etc/bash_completion

# bash_completionの有効化
> . /etc/bash_completion

以降、各コマンドについて補完機能があった場合、そのスクリプトファイルを/etc/bash_completion.d/下に置けば、自動的にその補完機能が有効となります。

最後の有効化作業は今すぐに補完機能を有効化するものであり、次回ログイン時には自動的に有効となるので毎回この作業を行う必要はありません。

 

履歴(history)の上限を変更

historyコマンドは非常に便利で、以前打った長いコマンドの記憶を呼び覚ましてくれます。でも、デフォルトの1000件ではいくら何でも少なすぎますので増やしましょう。

環境変数やエイリアスなどは個々のユーザーレベルではホームディレクトリの.bashrcや.bash_profileなどに記述しますが、全ユーザー共通の設定を行いたい場合は/etc/bashrcや/etc/profileなどに書きます。

しかしながら、それらのファイルを覗いてみるとIt’s not a good idea to chage this file…的なことが書いてあり、いいアイデアではないみたい(´ω`)

なんで、CentOSさんの言う通りに/etc/profile.d/内に設定用のスクリプトを追加していきます。

# 名前は何でも良いが分かりやすいものを指定
vim /etc/profile.d/history.sh

HISTSIZE=100000
HISTTIMEFORMAT='%Y/%m/%d %H:%M:%S '

10万は多すぎかもしれないのでそこは好みで適当に・・・ またコマンドを打った日時が出るような設定も行いました。

VIMエディタ設定

vim(viの後継?)というエディタはLinuxディストリビューションにはほぼ標準で入っているエディタであり、様々なファイル編集に使います。これも使いやすく設定しておきましょう。

vimの設定は各ユーザのホームディレクトリ内の.vimrcというファイルに記述しますが、一々ユーザー毎に設定するのは面倒なので全ユーザー共通で設定できる/etc/vimrcに記述していきます。これは好みですので一概にどうということはありませんが、当方は下のように設定しています。

> vim /etc/vimrc

" ファイル末尾に↓を追記する

"ファイル名表示
set title
"行番号表示
set number
"<TAB>を含むファイルを開いた際に何文字の空白に変換するか
set tabstop=4
"シフト移動幅
set shiftwidth=4
"キーボードで<TAB>を入力した際に何文字の空白に変換するか
set softtabstop=0
"行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする。
set smarttab
"新しい行のインデントを現在行と同じにする
set autoindent
"新しい行を作ったときに高度な自動インデントを行う
set smartindent
"カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
"タブの代わりに空白を使う
set expandtab

SSH接続設定

さて、ServersMan標準で付属しているAirDisplayが使いづらいので、例によってSSH関連の設定を行いたいと思います。またSSH設定に伴ってファイアーウォール等の設定もついでに行います。やっぱりここはじゅうようですよね~

http://adachi-kyotaku.net/6CJV5nepZTmR/wordpress/vps%E8%A8%AD%E5%AE%9A%E3%83%A1%E3%83%A2/

を参照させる

サーバー側のSSH現状確認

まずSSHの現在の状態を確認。とりあえずはどのポートがSSHポートに指定されているか確認します。最近のVPSはご親切にも最初からSSH標準の22番以外が設定されてることもあるんで・・・

vim /etc/ssh/sshd_config
# もし22番から変更したければ以下の番号を任意に変更する
# ちなみにServersManでは 3843 になっていたよ
# ServersManの場合はWeb経由SSHクライアントのAirDisplayのポート設定も合わせて変更する必要がある
Port 22

# 通常のパスワード認証になっている
PasswordAuthentication yes

# 次にSSHデーモンが起動しているかどうかを確認
service sshd status
openssh-daemon (pid 568) is running...

# もしもsshd is stopped と出てたら起動させておこう
service sshd start

 

この時点で、SSHデーモンはshd_configの設定にあるポート番号上でパスワード認証によってアクセスを受け付けている状態です。

つまり任意のSSHクライアントからパスワードでリモートログイン可能になっています。

めでたしめでたし・・・いやちょっと危険かもな・・・(;’∀’)

 

ファイアーウォールの確認及び設定

さて、SSHアクセスの準備ができていることが確認とれたので、ファイアーウォールがどうなっているのか確認しときます。

Linuxでファイアーウォールといえばiptablesですが、ServersManでのiptablesの初期設定は以下のようになっていました。

iptables -nL

Chain INPUT   (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT  (policy ACCEPT)
target     prot opt source               destination

壮観ですね、完全に無防備ですわ。

 

さて、FORWORDとOUTPUTはとりあえず置いといて、INPUTのpolicy(ポリシー: 対象チェイン内で全体的に有効なベース設定)がACCEPT(許可)になっています。これでは、iptablesを起動しても外からの全アクセスを許可してしまいファイアーウォールの意味を成さないので、とりあえずINPUTチェインを設定しておきます。

さて設定内容ですが、現時点では「任意のSSHクライアントからの接続」のみを考えているので、基本的にはSSHポートのみを許可すれば良いでしょう。本当は特定のクライアントからのみ接続する状況がほとんどですが、万が一別のネットワーク環境からアクセスする場合は事前に許可設定を変更しなければならず、正直それが面倒くさいので任意にして楽します(゚∀゚)

あと、サーバーとしてping応答はしたいのでICMPパケットも許可します。

あとあと、ServersManではAirDisplayというブラウザ経由でアクセスするSSHクライアントがあって、Apacheを使っているので80番も許可しといたほうが良さそうです。ただ正直、使い勝手もレスポンスも悪いので使うことはほぼほぼ無いと思いますが・・・ ただ、WordPressなどを設置する予定なので80番はいずれにせよ全面的に許可します。

結果的には以下のような初期設定を行います。あと、iptabelsコマンドによる設定は、そのままだと再起動後に設定がリセットされてしまうので、大元の設定ファイルに直接記述していきます。ちなみに、service iptables saveとすれば設定を書き出して恒常化できますがやってることは結局同じなので直接設定していきます。

ちなみにvimエディタを使用しており、かつコピペ環境があるならset formatoptions-=roというvimオプションを有効にすると正しくコピペできて便利ですので参考までに。これがないと、改行による自動コメントアウト機能が働いて上手くコピペできません。

vim /etc/sysconfig/iptables

##################
# 基本ポリシー設定
# ※上から順に評価していく。 ACCEPTとDROPの場合、他条件が同じならば、より上に記述したほうで処理が停止する。
# ・INPUTは基本的に拒否
# ・FORWARD(ルーティング機能)は全て拒否する
# ・OUTPUTは全面的に許可する
##################
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

##################
# ICMP設定
# ・【サーバー ← クライアント】の受入用
# ・【サーバー → クライアント】の返答用 ※RELATED,ESTABLISHED を許容しているので別途設定は不要だが一応明記
##################
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
-A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

##################
# SSH関係
# ・最初のSYNパケットのみ許可 ※state NEW のみではSYN以外でも通すことある
# ・アクセス量制限は1秒あたり1回まで
##################
-A INPUT -m state --state NEW -m limit --limit 1/s -p tcp --syn --dport <sshポート> -j ACCEPT

##################
# HTTP関係
# ・最初のSYNパケットのみ許可 ※state NEW のみではSYN以外でも通すことある
# ・アクセス量制限は1秒あたり10回まで
##################
-A INPUT -m state --state NEW -m limit --limit 10/s -p tcp --syn --dport 80 -j ACCEPT

##################
# その他の設定
# ・ループバックアドレスの場合は無条件で許可
# ・上記ルールで既に許可された接続は許可 ※--state NEW のルールはこれがないと接続を維持できない
##################
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

##################
# ログ設定
# ・上記のルールに当てはまらないINPUTチェインパケットは全てログとる
# ・ログレベルは一般的なwarningに設定
# ・ただし、1秒あたり5パケットまで
##################
-A INPUT -j LOG --log-level warning --log-prefix "[INPUT DROP] " -m limit --limit 5/s

COMMIT

※SSHのポート番号は絶対に間違えないようにすること。でないと、以降SSHでのアクセスができなくなります。

 

FORWORDをDROPしているのは、このVPSはルーティング用途には使わないですしそもそもIPパケットのフォワーディング自体がデフォルトで無効になっているからです。sysctl -n net.ipv4.ip_forwardというコマンドを打ってみると0: 無効であることが確認できると思います。

–syn指定しているのは–state NEWだけでは設定不足のことがあるからです。TCP接続では開始時の最初のパケットには必ずSYNフラグが付与されています。なのでSYN以外のパケットがいきなり届けば正規のパケットではないというわけです。ところが–state NEWではSYNが無いパケットでも条件があえば通してしまうようです。これにはファイアーウォール構成などでの事情があるようですが、今回のVPSはそういう用途ではないので、最初の接続はSYNのみ許容します。詳細は http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/newnotsyn.html に書いてあります。

またこのルールだけでは以降のやりとりを全て破棄してしまいますので、コネクション確立済みのパケットに関しては–state RELATED,ESTABLISHEDで許可します。これがないとホントに最初のパケット以外は破棄してしまい、Webページすらアクセスできませんので注意しましょう。

ループバックアドレスからのINPUTは無条件で許可します。OUTPUTは全面的に許可してるので別段設定しません。

最後に、いずれの条件にも当てはまらなかったパケットをログする設定を記述してます。ログの設定方法は色々ありますので省略します。

・・・軽く設定するつもりでしたが結構ちゃんとやってしまいました・・・(;´・ω・)

今後は必要に応じて、ルールを追加・編集していきます。また、本設定にあたって以下サイトが大いに参考になりました。

http://www.unix-power.net/linux/iptables.html

http://www.atmarkit.co.jp/ait/articles/0503/18/news122_2.html

 

あとはiptablesを再起動して、設定を確認してみましょう。

service iptables restart
iptables: Setting chains to policy ACCEPT: nat mangle filte[  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW limit: avg 1/sec burst 5 tcp dpt:3843 flags:0x17/0x02
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW limit: avg 10/sec burst 5 tcp dpt:80 flags:0x17/0x02
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
LOG        all  --  0.0.0.0/0            0.0.0.0/0           limit: avg 5/sec burst 5 LOG flags 0 level 4 prefix `[INPUT DROP] '

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

OKですね。最初の設定と全然違います(笑)

 

ログ設定

先ほどのiptablesの設定だけではログ出力がされないので、syslog.confをはじめとしたログ関係の設定をしておきます。具体的な設定は http://tweeeety.hateblo.jp/entry/2014/11/06/233432 が参考になります。当方の場合は/etc/rsyslog.confに以下のような設定を追加しました。

# iptablesログ出力設定
kern.warn                                               /var/log/iptables

kern.* の*部分は–log-levelで設定したものに合わせましょう。

あと、ログが溜まってディスクをひっ迫しないようにlogrotateの設定も行いました。

 

DROP? REJECT?

これは余談ですが、各チェインのポリシーについてDROPにすべきかREJECTにすべきか迷いました。しかしながら、「Internetからの不要アクセスはDROPでLAN内からの不要アクセスはREJECTにすべき」というような記事を思い出したので、今回の場合はとりあえず全面的にDROPで大丈夫と判断しました。

 

パケットカウンターについて

DROP[x:x]ACCEPT[x:x]のように数字がコロン区切りで2つ指定されている箇所がありますが、ちょっと意味が分からなかったので調査しました。

これらはパケットカウンターバイトカウンターと呼ばれるもののようで、文字通り当該チェインに一致したパケット及びそのサイズをカウントする値らしいです。形式は[パケットカウンター:バイトカウンター]となっています。さて、これはどこでどのように使われるのか?ということですが、/etc/sysconfig/iptablesに書かれているカウンターはiptablesの起動時や再起動の時に読み込まれて、[x:x]というように指定した値でカウンターが初期化されます。んでそのカウンターはどう見るのかといえば、次のコマンドから確認できます。

# パケット及びバイトカウンターの確認
iptables -L -v

Chain INPUT (policy ACCEPT 14257 packets, 1167K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 12512 packets, 1658K bytes)
 pkts bytes target     prot opt in     out     source               destination

色付き数字部分が 現在のカウンター情報です。INPUTチェインでは14257パケットがACCEPTポリシーにマッチしたという意味になります。OUTPUTチェインも 同様です。これが何の役に立つのかというと、ネットワークの調査やパケット統計などに使用するそうなんですが、少なくとも当方は暫く使う予定はありません (確信)。

んで、先ほどの/etc/sysconfig/iptablesの[x:x]と何が関係してるかというと、例えばiptablesを再起動すると-L -vで 見たカウンター情報が[x:x]の値でリセットされます。なので、[0:0]と指定した場合はそれぞれ0でリセットされるということです。パケット統計な どで使用する場合、iptabels再起動の度にカウンター0でリセットされていたのでは都合が悪いですね。なので、有用な使い方としては、①「現在のカ ウンター情報を/etc/sysconfig/iptablesに書き出す」→②「iptablesを再起動させる」→③「自動的に先のファイルが読み込 まれカウンター情報が復活する」という感じです。これによって、iptablesを再起動させてもカウンター情報がリセットされません。

しかしながら、これはあくまでパケットカウンター情報を利用したい人がiptablesやシステムを再起動する際に意識することです。

長々となりましたが、当方には関係ないので今回は全て[0:0]にしてます。

 

 

SSHクライアント側の設定

さて、iptablesの設定ができたところでSSHの設定を行っていきましょう。そういう章でしたからね・・・

 

SSHクライアントからログインのたびにパスワードを入力するのは面倒なので、公開鍵暗号化方式による鍵認証設定を行いたいと思います。鍵認証のメリットはパスワード入力の手間が省けるだけではなく、セキュリティレベルも上がります。SSHはリモートログインという性質上、外部から狙われやすいサービスなので、しっかりと対策していきたいですね。

大まかに以下のような手順を踏んでいきます。

  1. サーバー側での鍵認証準備
  2. クライアント側で鍵ペアを生成+接続テスト
  3. サーバー側でパスワード認証を無効に設定

 

1.サーバー側での鍵認証準備

まずは、サーバー側で鍵認証を受けるための基本的な準備を行っていきます。

SSHの設定ファイルsshd_configを以下のように鍵認証用に変更します。

vim /etc/ssh/sshd_config

# SSH2でのみ接続を許可
Protocol 2
# sshdログを/var/log/secureに記録する
SyslogFacility AUTHPRIV

# パスワードでのRootログインを禁止
#PermitRootLogin without-password

# パスワードログイン禁止(鍵方式によるログインのみ許可)
#PasswordAuthentication no

# パスワードなし(空パス)でのログインを禁止
PermitEmptyPasswords no

# RSA認証を許可 ※SSH2のみならnoでもいいか?
RSAAuthentication yes

# 公開鍵認証を許可
PubkeyAuthentication yes

# クライアント側公開鍵の場所
AuthorizedKeysFile .ssh/authorized_keys

# SSHデーモン再起動
service sshd restart

パスワード認証拒否の部分はとりあえずコメントアウトしておきます。というのも、もし鍵認証設定を誤った場合はパスワード認証拒否にするとSSH接続できなくなってしまうからです。なので、ちゃんと鍵認証を確立してから後でコメントを外します。

次に各ユーザ毎のSSH関連ファイルを置くディレクトリを作成します。

# ホームディレクトリに .ssh ディレクトリを作成する
mkdir ~/.ssh

# .ssh ディレクトリのパーミッションを700に変更する
chmod 700 ~/.ssh

# .ssh 以下の所有者とグループがこのユーザでなければそのように変更
chown -R <user>:<user> ~/.ssh

 

とりあえずサーバー側の基本準備はこれでOKです。つづいてクライアント側の準備に移ります。

 

2.クライアント側で鍵ペアを生成

鍵認証に使用するRSA暗号鍵をクライアント側で生成します。作成方法は色々とあるかと思いますが、当方はssh-keygenというコマンドツールを使用して生成します。

https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90

クライアント側のPCで以下のような作業を行います。

# まず鍵ペア(秘密鍵・公開鍵)を生成
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/hoge/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):←不要なので空Enter
Enter same passphrase again:←不要なので空Enter
Your identification has been saved in /c/Users/hoge/.ssh/id_rsa.
Your public key has been saved in /c/Users/hoge/.ssh/id_rsa.pub.
~ 省略 ~

# 鍵ペアができたのでid_rsa.pub(公開鍵)をサーバーにアップロードする
# ポート番号はsshd_configで指定したものを指定
$ scp -P <sshポート> ~/.ssh/id_rsa.pub root@<ホスト名orIPアドレス>:~/.ssh/authorized_keys


# id_rsa(秘密鍵)を指定して鍵認証で接続テスト
ssh -p <sshポート> -i ~/.ssh/id_rsa root@<ホスト名orIPアドレス>

 

接続テストに成功すれば、鍵認証準備は完了です。ただ、いちいち接続テストのようなコマンドを打ち込むのは大変なので、クライアント側で簡単に接続できるよう設定します。

以下の設定を行うことで、今後はssh <任意の名称>だけでアクセスできるようになります。

vim ~/.ssh/config

# 以下を末尾あたりに追加

#ServersMan
Host <任意の名称>
HostName <ホスト名orIPアドレス>
Port <sshポート番号>
User root
IdentityFIle ~/.ssh/id_rsa


# 上記設定後は以下でSSH接続できる
ssh <任意の名称>

 

サーバー側でパスワード認証を無効に設定

最後にパスワード認証を拒否します。これによって、sshクライアントからパスワードでリモートログインすることが出来なくなりますので、必ず鍵認証成功を確認してからこれを行いましょう。

vim /etc/ssh/sshd_config

# パスワードでのRootログインを禁止
PermitRootLogin without-password

# パスワードログイン禁止(鍵方式によるログインのみ許可)
PasswordAuthentication no

 

セキュリティ的にRootログインを拒否したい場合は、PermitRootLogin noに設定しますが、今回はwithout-password(パスワードによるルートログインを拒否)とだけ設定してます。

また、上記の設定はPasswordAuthentication noの効果と重複するでしょうが明示する意味であえて設定しています。

最後にパスワード認証が拒否されていることをクライアント側から確認します。以下のような返答が来ればOKです。

ssh -p <sshポート> root@xxx.xxx.xxx.xxx
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

 

さて、これで基本的なファイアーウォール設定とSSH接続設定は完了です。SSHは有用な反面、狙われやすい部分なのでしっかり設定しないと不安で眠れません・・・

 

~ 追記 ~

サーバー側のautherized_keysについて以下のことを確認して、なっていなければ適宜変更しいます。

  • パーミッションが600(所有者のみ読み書き可能)になっている
  • 所有者及びグループがそのユーザーになっている
ls -l ~/.ssh/authorized_keys
-rw------- 1 <user> <user> 707 X月 XX XX:XX XXXX authorized_keys

また、SSHの守りをより強固なものにするためにアクセス元を制限することも考えられます。アクセス制限はクライアントのIPアドレスレベルで行います。

アクセス元制限の手順としては、通常、全クライアントを拒否した上で、特定のクライアントのみを許可する方法を取ります。ちょうど、iptablesのDROPポリシーとACCEPTルールみたいな感じ。

制限するためには下記の2ファイルを編集します。

# ブラックリスト(拒否リスト)
vim /etc/hosts.deny
# 全ての接続を拒否
sshd : all

# ホワイトリスト(許可リスト)
vim /etc/hosts.allow

#10.10.10.1を許可する場合
sshd : 10.10.10.1
#192.168.1.0/24ネットワーク内を許可する場合
sshd : 192.168.1.
# .yahoo.jpのつくホストを許可する場合
sshd : .yahoo.jp

ちなみにdenyはデニーではなくディナイと読みます、これマメね。

ここの設定は場合によってはアクセスできなくなってしまうことがあるので慎重に行いましょう。特にフルIPアドレスで制限する場合、家庭のグローバルIPアドレスは大体動的なので、知らないうちに変わってるかもしれません。もちろんそうなるとアクセスできなくなります。

 

一般ユーザーを追加

慣例に習って、作業用の一般ユーザーを追加します。また、一般ユーザーを追加したらルートでのSSHログインを拒否に設定するとよりセキュリティ強度が高まります。まぁ当方はわざわざそういったことはしませんが・・・

 

ユーザ作成とグループ追加

ここでは仮にusernameというユーザーを追加します。もちろん任意に変更します。そしてそのユーザーをwheelグループに追加します。これは、このユーザーにsuを許可するためです。

余談ですが、以前から何故suを許可するグループをwheelというのか由来が気になっていました。http://codaholic.org/?p=1757に由来っぽいことが説明されています、う~ん納得。

# ユーザ追加
useradd username

# パスワード設定
passwd username
new password: p@ssw0rd

# wheelグループ(管理用グループ)に追加
usermod -G wheel username

 

suの制限等の設定

次に、 su可能なグループをwheelのみに制限します。というのもCentOS(Linux系?)はデフォルトで誰でもsuが可能になっているからです。ここで先ほどのwheel追加が生きてきます。

vim /etc/pam.d/su

#auth required pam_wheel.so use_id 
# ↑コメントを解除する
auth required pam_wheel.so use_id

次に、suコマンドに関して試行回数の制限などを設定します。suをする場合、変身するユーザーのパスワードが必要になります。例えばsuのみだとデフォルトでrootユーザーになるのでrootのパスワードが要求されます。試行回数を制限しないとブルートフォース攻撃を可能にする余地を与えるため一定回数認証に失敗するとロックするように設定します。

以下のdeny=5では、5回を超えて認証失敗するとロックするという設定ですので適宜数字を変えます。このオプションにはdeny以外にも次のようなことを指定できます。

  • deny=n → n回を超えて認証失敗するとアカウントをロックする
  • onerr=[fail|succeed] → 何か予期せぬことが起きた場合、succeedならPAM_SUCCESS、またfailなら該当するPAMエラーコードを返す
  • unlock_time=n → アクセスに失敗した場合、n秒後にロックを解除
  • even_deny_root → ルートもロック対象とする
  • root_unlock_time=n → ルートに関してのunlock_time

ちなみにデフォルトでrootはロック対象ではありませんが、rootへのsuが一番攻撃されやすいでしょうからrootもロック対象に含めます。別にrootアカウント自体がロックされたわけではないのでそこは安心してください。あくまでsuによるルート変身が出来なくなるだけです。

vim /etc/pam.d/system-auth
# auth部の先頭に以下を追加
auth        required      pam_tally2.so even_deny_root root_unlock_time=600 deny=5

# account部の先頭に以下を追加
account required pam_tally2.so

※ 重要 ※ 今回はdenyのみの指定なので、万が一ロックされてしまうと手動によるロック解除しかロック解除方法がありません。アカウントが一度ロックされると、以降変身したいユーザーにsuから入れなくなるので解除方法を知っておきましょう。

pam_tally2 –user username –reset

 

sudo可能ユーザーも制限

最後にwheelグループのユーザに対してsudoを許可し、ついでにパスワード認証継続時間も長めに変更します。たしかパスワード情報が維持される時間はデフォルトでは5分程度なので、5分後にsudoすると再びパスワードを求められます。もう少し長く設定しましょう。

# /etc/sudoers を編集するコマンド
visudo
# sudo のパスワード維持時間(分)
Defaults timestamp_timeout = 20
#%wheel ALL=(ALL) ALL のコメント外す
%wheel ALL=(ALL) ALL

 

あ、そうそう、追加した一般ユーザーはこのままではSSH接続できません(パス認証拒否してるため)。なので、ルートユーザーと同じ要領で鍵認証設定をしておきます。やることはホームディレクトリに.sshディレクトリを作ってその中にクライアント側の公開鍵をauthorized_keysとして保存するだけです。あとは大体ルートの時と同じです(適当)。

本来はダメなんですけど、当方は一般ユーザーとルートの鍵を使いまわしています(笑)

よい子の皆さんはユーザー毎に鍵ペアを生成しましょう!

 

せっかく一般ユーザーを追加し鍵認証でのアクセスができたので、セキュリティ面を考えてSSHでのルートログインを拒否してみましょう。最初言ったのと矛盾しますがね( ´∀` )

これで、SSHからは一般ユーザーのみログイン可能になります。

vim /etc/ssh/sshd_config

# PermitRootLogin without-password
# ↓ ルートログインを禁止
PermitRootLogin no

 

はい、以上でVPSをいじくるための基本的な準備は整いました。

さて、あとは別記事にてWebサーバーの設定を行いましょうかね。

では次の記事にて(^_^)/~