2018.06.22
たむ

MacからさくらのVPSにWordPressをインストールしてCoda2でSSH鍵認証を使ってSFTPするまとめ、ssh接続からiptables設定編

たむです。これまでまったく触ったことのないサーバについて、さくらのVPSを借りてみたので、MacからさくらのVPSでサーバを立ててWordpressをインストールしてCoda2でSSH鍵認証を使ってSFTPするということを実験してみたまとめです。今回は、MacからVPSにssh接続してiptablesの設定をするまで。

※2015年8月頃に実験したメモなので情報が古いかもしれないことと、デザイナーが実験してみただけなので本職のインフラエンジニアの方から見ると間違いだらけかもしれませんが、ご容赦くださいませ。

MacからVPSにssh接続

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

CentOSの日本語化

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ログインとパスワード認証を禁止する

鍵認証でログインすることには成功したけれど、まだ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) を設定する

Firewall (iptables) は必要な通信のみを許可することでセキュリティを高めることができるらしいので、やってみる。初期状態では設定ファイルが存在しないので新しくファイルを作成する。

$ sudo vi /etc/sysconfig/iptables

作業用ユーザのパスワードを聞かれるので入力する。

[sudo] password for admin:

何も書かれていないファイルが作成されるので、viの入力モードで以下の設定を入力する。

CentOSをサーバーとして活用するための基本的な設定 | さくらインターネット創業日記

https://tanaka.sakura.ad.jp/archives/001065.html

ちなみにこの実験をやってる当時は、上記のブログを書いてる中の人と話す機会があるとは思ってなかった。

*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インストールして設定をするまで。

一覧に戻る