たむです。これまでまったく触ったことのないサーバについて、さくらのVPSを借りてみたので、MacからさくらのVPSでサーバを立ててWordpressをインストールしてCoda2でSSH鍵認証を使ってSFTPするということを実験してみたまとめです。今回は、MacからVPSにssh接続してiptablesの設定をするまで。
※2015年8月頃に実験したメモなので情報が古いかもしれないことと、デザイナーが実験してみただけなので本職のインフラエンジニアの方から見ると間違いだらけかもしれませんが、ご容赦くださいませ。
Macのターミナルを立ち上げてsshでVPSに接続する。ターミナルは「アプリケーション」フォルダ内の「ユーティリティ」フォルダにインストールされている。
$ ssh root@IPアドレス
入力したIPアドレスにはじめてsshで接続しようとすると、以下のように確認を求められるのでyesと入力してEnterを押す。
The authenticity of host 'IPアドレス (IPアドレス)' can't be established.
RSA key fingerprint is de:ff:49:7f:22:2f:22:af:38:22:22:6c:e4:d9:51:c1.
Are you sure you want to continue connecting (yes/no)?
→
The authenticity of host 'IPアドレス (IPアドレス)' can't be established.
RSA key fingerprint is de:ff:49:7f:22:2f:22:af:38:22:22:6c:e4:d9:51:c1.
Are you sure you want to continue connecting (yes/no)? yes
その後、もう一度sshでVPSに接続する。
$ ssh root@IPアドレス
今後はパスワードを求められるので、rootパスワードはOSインストール時に設定したパスワードを入力し、以下の表示が出ればログインが成功している。
$ ssh root@IPアドレス
root@IPアドレス's password:
SAKURA Internet [Virtual Private Server SERVICE]
[root@tkx-xxx-xxxxx ~]#
ポートがデフォルトの22だと攻撃を受けやすいのでsshd_configを編集してポート番号を変更する。変更前にsshd_configのバックアップを取っておく。
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old
sshd_configを開く。
# vi /etc/ssh/sshd_config
操作はviで行う。viにはモードという概念があり、ファイルを開いた状態ではコマンドモードになっている。
以下が記載されている場所を探す。viをコマンドモードのままスラッシュとキーワード/#Port 22を入力してEnterキーを押すと検索することができる。ちなみにその状態でキーボードのnを押すと次のキーワードを探しに行く。
/#Port 22
viを入力モード(キーボードのiを押す)に変更してポート番号を変更。
ポートスキャンは大抵の場合1023番までしか行わないらしいので、1024番から上限の65535番までの範囲で適当に決める。テンキーで数字の入力をしようとするとアルファベットが出るので注意。
#Port 22
→
Port 10022
その後コマンドモード(キーボードのescを押す)に戻す。
viがコマンドモードに戻ったら:wqと入力してEnterキーを押すと保存される。
ちなみに入力モード中、変なことをしてよくわからなくなったら、とりあえずescでコマンドモードに戻り:q!と入力すれば、保存せずに強制終了する。
ポート番号を変更したらsshdを再起動して変更を有効化する。
# service sshd restart
エラーが無ければ以下のように表示される。エラーが出たら先ほど取っておいたバックアップファイルのsshd_config.oldを復活させて、もう一度トライする。
# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
古いバージョンの脆弱性を突かれることを防ぐためにアプリケーションのアップデートをしておく。
# yum -y update
rootで作業すると、下手を打つとアクセスさえできなくなるので作業用のユーザを作成する。ユーザ名は好きなもので良い。今回、ユーザ名はadminに設定した。
# useradd admin
作業用ユーザを作成したら作成したユーザのパスワードを設定する。
# passwd admin
作業用ユーザのパスワードを2回入力してエラーが無ければ以下のように表示される。パスワードは入力中も表示されないので注意。
# passwd admin
ユーザー admin のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
作成したユーザがsudoできるようにする。sudoを使うことで必要なときだけroot権限で作業できるようになる。まずはユーザをwheelグループに追加する。
# usermod -G wheel admin
wheelグループがsudoを使えるようにするため設定ファイルを開いて設定を変更する。
# visudo
設定ファイルを開いたら、以下の行を探してコメントを外す。(#を消す)
## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
→
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
dateコマンドを日本語表示できるようにするため設定ファイルを開いて設定を変更する。
# vi /etc/sysconfig/i18n
設定ファイルを開いたら、一番上に書かれている行を変更する。
LANG="C"
→
LANG="ja_JP.UTF-8"
日本語化は再ログインすると設定が有効になるので、一度ログアウトする。
# exit
ログアウトすると以下が表示される。
# exit
logout
Connection to IPアドレス closed.
再ログインする時はsshのポート番号を変更しているのでポート番号を指定してログインする。
ssh -p 10022 root@IPアドレス
ポート番号は変更したけれど、パスワード認証のままだとセキュリティ強度が低いらしいので、鍵認証でsshログインできるようにする。まずは新しくターミナルのウィンドウを開いてMacで鍵を生成する。
$ ssh-keygen -t rsa -v
ファイル名やパスフレーズを聞かれるので、何も入力せずにEnterキーを押していく。
$ ssh-keygen -t rsa -v
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/XXXX/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
以下の表示が出れば鍵の作成が成功している。
Your identification has been saved in /Users/XXXX/.ssh/id_rsa.
Your public key has been saved in /Users/XXXX/.ssh/id_rsa.pub.
The key fingerprint is:
de:ff:49:7f:22:2f:22:af:38:22:22:6c:e4:d9:51:c1 XXXX@MacBook-Pro.local
The key's randomart image is:
+--[ RSA 2048]----+
| |
| + + |
|. E |
| o . |
| o. .S |
| .=o+. |
| .. =ooo |
| .. oooo |
| .. ..+o |
+-----------------+
Macの/Users/XXXX/.ssh/にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)の2つのファイルが作成されているか確認する。Macでは最初にドットのついたファイルやフォルダは不可視になるので、ターミナルで見えるようにする。
$ defaults write com.apple.finder AppleShowAllFiles true
その後にファインダーを再起動する。
$ killall Finder
/Users/XXXX/.ssh/が見えるようになっているので確認する。ドットファイルが見えたままだと気持ち悪いので、もう一度、ターミナルで見えないようにする。
$ defaults write com.apple.finder AppleShowAllFiles false
その後にまたファインダーを再起動する。
$ killall Finder
作成した公開鍵をVPSの作業用ユーザに転送する。
$ scp -P 10022 ~/.ssh/id_rsa.pub admin@IPアドレス:~/
作業用ユーザのパスワードを聞かれるので入力する。
admin@IPアドレス's password:
エラーが無ければ以下が表示されて公開鍵が作業用ユーザにコピーされる。
id_rsa.pub 100% 433 0.4KB/s 00:00
作業用ユーザで公開鍵を登録するために、作業用ユーザでログインする。
$ ssh -p 10022 admin@IPアドレス
作業用ユーザのパスワードを聞かれるので入力する。
$ ssh -p 10022 admin@IPアドレス
パスワードを入力して以下の表示が出ればログインが成功している。
SAKURA Internet [Virtual Private Server SERVICE]
[admin@tkx-xxx-xxxxx ~]$
転送しておいた公開鍵を.sshフォルダに移動する。デフォルトでは.sshフォルダが存在しないらしいのでまずはフォルダを作る。
$ mv id_rsa.pub .ssh/authorized_keys
作った.sshフォルダと.sshフォルダの中にあるauthorized_keysのパーミッションを変更する。公開鍵認証するとき、接続先のサーバで所有者とパーミッションが適切に設定されていないとエラーが出るっぽい。
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
その後、一度ログアウトし鍵認証でログインできるか確認する。
$ exit
間違ってなければ、鍵認証でログインしているためパスワードを聞かれなくなっている。
$ ssh -p 10022 admin@IPアドレス
鍵認証でログインすることには成功したけれど、まだrootログインとパスワード認証ができる状態なので、sshの設定を変更する。まずはsudoで設定ファイルを開く。
$ sudo vi /etc/ssh/sshd_config
作業用ユーザのパスワードを聞かれるので入力する。
[sudo] password for admin:
設定ファイルを開いたら、下の行を探してパスワード認証でログインできないように変更する。
PasswordAuthentication yes
→
PasswordAuthentication no
同じく設定ファイルで下の行を探してrootでログインできないように変更する。
#PermitRootLogin yes
→
PermitRootLogin no
そんでもってsshdを再起動して変更を反映する。
$ sudo service sshd restart
エラーが無ければ以下のように表示される。エラーが出たら先ほど取っておいたバックアップファイルのsshd_config.oldを復活させて、もう一度トライする。
# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
ここまで完了したら、新しくターミナルのウィンドウを開いてrootでログインできないこと、作業用ユーザでパスワードを聞かれずにログインできることを確認しておくと良いかもしれない。一応、ssh接続しているターミナルのウィンドウは閉じずに残しておかないと、rootでも作業用ユーザでもログインできなくなり、最初からやりなおしになるので注意。ここで僕は一度死んだ。
rootでログインしてみると、ログインできない。
$ ssh -p 10022 root@IPアドレス
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
作業用ユーザでログインしてみると、パスワードを聞かれずにログインできる。
$ ssh -p 10022 admin@IPアドレス
Last login: Wed Sep 9 18:09:21 2015 from IPアドレス.xxxx.ne.jp
SAKURA Internet [Virtual Private Server SERVICE]
[admin@tkx-xxx-xxxxx ~]$
Firewall (iptables) は必要な通信のみを許可することでセキュリティを高めることができるらしいので、やってみる。初期状態では設定ファイルが存在しないので新しくファイルを作成する。
$ sudo vi /etc/sysconfig/iptables
作業用ユーザのパスワードを聞かれるので入力する。
[sudo] password for admin:
何も書かれていないファイルが作成されるので、viの入力モードで以下の設定を入力する。
CentOSをサーバーとして活用するための基本的な設定 | さくらインターネット創業日記
ちなみにこの実験をやってる当時は、上記のブログを書いてる中の人と話す機会があるとは思ってなかった。
*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
-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 -j REJECT --reject-with icmp-host-prohibited
COMMIT
iptablesを起動して設定を適用する。
$ sudo service iptables start
作業用ユーザのパスワードを聞かれるので入力する。
[sudo] password for admin:
エラーが無ければ以下のように表示される。エラーが出たら一度作成したファイルを削除して、もう一度トライする。
iptables: ファイアウォールルールを適用中: [ OK ]
設定したiptablesが正しく設定されているか確認する。
$ sudo iptables -L
以下の内容になっていれば問題ないっぽい。
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:10022
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
そんでOSの再起動時に自動的にiptablesが起動するようになっているか確認する。
$ chkconfig --list iptables
下のように3番がonになっていればOSの再起動時に自動的にiptablesが起動する。
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
もし3番がonでない場合は設定を変更する。
$ sudo chkconfig iptables on
今回はここまで、次回はApacheインストールして設定をするまで。