[ConoHa]登録からSSHログインまわりの設定まで

カタログ
  1. 1. 1. Conoha に登録
  2. 2. 2. rootでログインしてユーザを追加
    1. 2.1. sudoers の設定変更
  3. 3. 3. SSHログインを許可
  4. 4. 4. SSH鍵を生成
  5. 5. 5. クライアントからSSH鍵でログインできるかチェック
  6. 6. 6. rootからのログインを禁止
  7. 7. 7. パスワードによるログインを禁止
  8. 8. 8. SSHのポート番号を変更 (iptables)
  9. 9. 9. SSHのポート番号を変更 (firewalld)
  10. 10. 10. その他 関連コマンドメモ

VPSどころかLinux系にまったくふれたことないけどVPSで遊んでみた。 お仕事だとWindows系ばっかだから全く使わないんだよなぁ。

WindowsでのSSHクライアントとしては Git Bash とか RLogin とか適当に使った。

1. Conoha に登録

ConohaにVPSを設置して、SSHログイン、ポート番号変更、rootログイン禁止までを30分で! - Qiita を参考というかほぼそのまんま。

  1. 「rootパスワード」を入力 (メモしておくこと)
  2. その他の設定はいじらないでそのままで「追加」を押下 ※デフォルトのOSは CentOS 7.2(64bit) だった。

2. rootでログインしてユーザを追加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# クライアント(ローカル)からリモートログイン
$ ssh -p 22 root@(IPアドレス)
パスワード入力したら以降はリモートでの作業

# ユーザ作成
$ adduser ユーザ名

# 作成したユーザのパスワード変更
$ passwd ユーザ名
作成したユーザのパスワードを登録

# 作成したユーザの確認
$ cat /etc/passwd | grep ユーザ名

# wheelグループに追加
$ gpasswd -a ユーザ名 wheel

# 所属グループの確認
$ id ユーザ名

# 作成したユーザでログイン
$ su ユーザ名

# sudo が使えるかどうか確認
$ sudo echo "foobar"
パスワード入力して"foobar"が表示されればOK

# PAM(Pluggable Authentication Modules)の設定を変更して
# wheelグループ所属のユーザのみsuコマンドが実行できるようにする
$ sudo vi /etc/pam.d/su

以下のように /etc/pam.d/su を変更(コメントアウトを外すだけ)

1
2
- #auth  required  pam_wheel.so user_uid
+ auth required pam_wheel.so user_uid

次に sudo vi /etc/login.defs で以下の行を末尾に追加

1
SU_WHEEL_ONLY yes

sudoers の設定変更

wheelグループのユーザのみsudoが実行できるようにするために visudo で sudoers の設定を以下のように変更(コメントアウトを外すだけ) する必要があるらしいけどConoHaでは最初から設定されていた。

1
2
- # %wheel  ALL=(ALL)      ALL
+ %wheel ALL=(ALL) ALL

3. SSHログインを許可

1
2
# 設定ファイルをviで編集
$ sudo vi /etc/ssh/sshd_config

以下の設定を変更する。(ConoHaではAuthorizedKeysFile は既に下記設定になっていて、 上の2つは先頭の’#’を取り除くだけだった)

1
2
3
4
5
RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys
1
$ sudo service sshd restart

4. SSH鍵を生成

作成したユーザ(rootでやらないこと)でSSH鍵を生成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cd ~
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh

# 鍵の生成
$ ssh-keygen -t ecdsa -b 521
で秘密鍵と公開鍵(.pub)が生成される。
秘密鍵が漏洩する可能性を考えるのならパスフレーズを指定。

# AuthorizedKeysFileの設定値に指定されているファイルパスに公開鍵を設置
$ mv 公開鍵.pub authorized_keys
$ chmod 600 authorized_keys

# 秘密鍵をクライアントにコピー
$ cat 秘密鍵
表示されたものをコピってローカルの ~/.ssh/秘密鍵のファイル名 に保存

ローカルの ssh_config (git bash の場合は たぶん C:\Program Files/Git/etc/ssh/ssh_config) に設定を追加

1
2
3
4
5
Host 任意のホスト名
HostName IPアドレス
User 作成したユーザID
Port 22
IdentityFile ~/.ssh/秘密鍵のファイル名

5. クライアントからSSH鍵でログインできるかチェック

1
2
3
# `exit` などでリモートからログアウト後に
$ ssh 任意のホスト名
鍵の生成時にパスフレーズを指定していた場合は入力が必要

パスフレーズを何度も入力するのがメンドウな場合は ssh-agent を使う

1
2
3
4
5
6
7
# ローカルのクライアントで
$ ssh-agent bash
$ ssh-add ~/.ssh/秘密鍵のファイル名
(パスフレーズの入力)

# ssh-add後はパスフレーズの入力をせずにSSHリモートログインできる
$ ssh 任意のホスト名

6. rootからのログインを禁止

1
2
3
4
$ sudo vi /etc/.ssh/sshd_config
PermitRootLogin no に設定を変更して保存

$ sudo service sshd restart

以降、root でログインしようとすると権限エラーとなる。

7. パスワードによるログインを禁止

1
2
3
4
$ sudo vi /etc/.ssh/sshd_config
PasswordAuthentication no に設定を変更して保存

$ sudo service sshd restart

設定を戻したいときは PasswordAuthentication yes に変更すればOK

8. SSHのポート番号を変更 (iptables)

iptablesサービスがインストールされていなければインストールする必要がある。 ※CentOS7ではiptablesの代わりにfirewalld使ったほうがよさそう?iptablesを使わない場合は以下の設定は不要

1
2
# iptablesサービスがない場合はインストール
$ sudo yum install iptables-services

で、/etc/sysconfig/iptables/ を編集

1
2
- -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
+ -A INPUT -m state --state NEW -m tcp -p tcp --dport 変更後のポート番号 -j ACCEPT

ポート番号は 1024より大きい値が良いらしい。 あと 10022 みたいな番号は狙われるのであんまり関係がないPORTにしたほうがいい。 編集後にサービスを再起動する sudo service iptables restart

次に /etc/ssh/sshd_config も編集する。

1
2
- #Port 22
+ Port 変更後のポート番号

変更後にsshdサービスを再起動する sudu services sshd restart これで 22番ポートではログインできなくなる。

CentOS7ではサーバ再起動(sudu reboot)時にiptablesの設定が有効となるように systemctl で自動起動の設定を変更する必要がある。これをやらずにサーバ再起動すると SSHログインできなくなったりするので注意(Conohaのコントロールパネルからログインすればいいけど)

1
2
3
$ sudo systemctl stop firewalld.service
$ sudo systemctl mask firewalld.service
$ sudo systemctl enable iptables.service

9. SSHのポート番号を変更 (firewalld)

CentOS7のfirewalldでsshのポート番号を変更する方法 - Qiita を読んで設定すればOK。以下は蛇足のメモ。

CentOS7からはfirewalldがデフォルトで利用されるらしいので、 iptablesではなくfirewalldを使うことにした。

SELinuxが有効な場合はこれの設定の変更も必要だが conohaではSELinuxはデフォルトではOFF(設定は/etc/sysconfig/selinux)なのでOFFのままにしておく。

firewalldはCentOS7.2では最初からインストールされて有効になっている。
systemctl status firewalld で状態を確認できる。

1
2
3
4
5
6
7
8
9
10
11
12
# 状態確認
$ systemctl status firewalld

# デフォルト設定をコピー
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml

# コピーしたファイルを編集
$ sudo vi /etc/firewalld/services/ssh.xml
でポート番号を書き換えて保存

# サービス再起動
$ sudo systemctl restart firewalld

で、iptablesの自動起動をしていたら戻す。してないならそのままでいい。

1
2
3
4
$ sudo systemctl unmask firewalld.service
$ sudo systemctl start firewalld.service
$ sudo systemctl disable iptables.service
$ sudo systemctl stop iptables.service

10. その他 関連コマンドメモ

1
2
3
4
5
6
7
8
9
10
11
# サービスの確認
$ rpm -ql firewalld | grep サービス名

# firewalldサービスの自動起動設定が有効化どうか確認
$ systemctl is-enabled firewalld

# firewallの設定内容の確認
$ firewall-cmd --list-all

# 待ち受けポートの確認
$ ss -t -l -n