読者です 読者をやめる 読者になる 読者になる

SSHのインストールと設定

VPSにArchを入れ直した際に行ったSSHの設定とか、
localに保存しておいたメモとかのまとめ

眠い時にうつらうつら書いたので誤字脱字があるかも。

環境

  • サーバ - ArchLinux
  • クライアント - ArchLinux

SSHのインストール

鯖$ sudo pacman -S openssh
local$ sudo pacman -S openssh

サーバ側の設定

設定

鯖$ sudo vim /etc/ssh/sshd_config

Port

デフォルトポートのままだと攻撃される確率が高いため変更する。
Port 22222
Port番号を変更した場合は、sshコマンドに'-p[ポート番号]'を追加する。
ex) $ ssh -p22222 foo@XXX.XXX.XXX.XXX

Protocol

バージョン1だと脆弱性があるのでバージョン2を使用する。
デフォルトで2だけを使用するように設定されているみたいだけど、明示的に2を使用するように設定する。(特に意味はない)
Protocol 2

PermitRootLogin

rootでログインできるかどうか
もちろん無効にする。
suはsudoはできる。
PermitRootLogin no

PermitEmptyPasswords

空パスワードを使用できるかどうか
無効にする。
PermitEmptyPasswords no

PasswordAuthentication

パスワード認証を使用するかどうか
これを無効にすると公開鍵認証でしか認証できなくなる。
公開鍵の設定をしていない状態でこれを有効にしてしまうとSSHでパスワード認証が出来ずログインできなくなるので注意!!!
PasswordAuthentication no
※ この後にする公開鍵認証の設定を行ってからnoにする。

AllowAgentForwarding

踏み台にできるやつ
詳しくはここ
使用しない場合は無効にする
AllowAgentForwarding no

AllowTcpForwarding

ポートフォワーディングの設定
使用しない場合は無効にする
AllowTcpForwarding no

X11Forwarding

リモートでGUIを使うかどうか
使用しないので無効にしておく
X11Forwarding no

MaxAuthTries

パスワード認証時のログイン試行回数
デフォルトでは6回になっている。
公開鍵認証では関係無い
MaxAuthTries 6

AllowUsers

SSHを使用できるユーザを制限する。
ここでユーザ名が指定されたユーザのみSSHを使用できるようになる。
特定ユーザのみ拒否したい場合はDenyUsersを使用する。
基本的にはAllowUsersを使用すべき
AllowUsers foo bar baz
ちなみに、AllowUsers foo@10.1.1.1とかAllowUsers *@10.1.1.1とかもできる
(10.1.1.1からのfooでのログインのみ許可や、10.1.1.1からだけログインを許可するといったことができる。)
もしつながらない場合、*@127.0.0.1/8 のようにプレフィックス長も入力するとうまく行くかもしれません

サービスの起動

systemdの場合
鯖$ sudo systemctl start sshd.service
鯖$ sudo systemctl enable sshd.service

Firewall設定

iptablesを使用している場合。
鯖$ sudo vim /etc/iptables/iptables.rules
以下を追加
-A INPUT -p tcp -m state --state NEW -m tcp --dport [ポート番号] -j ACCEPT
FORWARDの後に書くとポートが開かなかったりするので書く場所には注意

試しにログインしてみる

local$ ssh [ユーザ名]@[接続先名]
PasswordAuthenticationをnoにしている場合はまだログイン出来ない。
この後する公開鍵認証の設定が出来てからnoにする。
Port番号を変更している場合は
local$ ssh -p[ポート番号] [ユーザ名]@[接続先名]

公開鍵認証の設定

このままではブルートフォースアタックが出来てしまうので、公開鍵認証を使用したログイン方式に変更する。
まず、クライアント側で秘密鍵と公開鍵のペアを作成する。

鍵の種類について

DSAよりRSAの方が暗号強度が高い
DSAはユーザ認証しかカバーしていないが、RSAは、ユーザ認証と暗号化の2つをカバーしている。
ただ、SSHの場合は認証だけ公開鍵認証で行って、実際の通信は共通鍵暗号で暗号化しているみたいです。
今回はRSAで鍵ペアを作成したいと思います。

鍵ペアの作成

local$ ssh-keygen -t rsa
ちなみに作成できる鍵のタイプは、
dsa : DSA(SSHv2)
ecdsa :
ed25519 :
rsa : RSAバージョン2(SSHv2)
rsa1 : RSAバージョン1(SSHv1)
こんな感じ
※ rsa1がバージョン1で、rsaがバージョン2だそうです

鍵ペアの名前を設定する。何も入力せずにEnterで~/.ssh/id_rsaが作成される。
Enter file in which to save the key (/home/hnron/.ssh/id_rsa): [鍵ペア名]
ちなみに相対指定はできるけど~(チルダ)は使えなかった
鍵名はデフォルトの場合問題ないが、自分で指定する場合、'-i'オプションで秘密鍵を指定する必要がある。それを回避する方法は下の方に書いておきます。

パスフレーズの入力。
Enter passphrase (empty for no passphrase): [パスフレーズ]
Enter same passphrase again: [パスフレーズ]
パスフレーズは無くても問題は無い。ちなみんパスフレーズはネットワーク上に流れず、ローカルで処理される。
秘密鍵が流出しちゃった時に、パスフレーズが設定されていると、パスフレーズが解析されるまで時間が稼げる。
詳しくはここ

鍵ペアの作成が成功するとフィンガープリントが表示される。
これで公開鍵と秘密鍵のペアが'~/ssh/'内に作成される。
鍵は、'[鍵ペア名]'で指定したものと同じ名前のほうが秘密鍵、.pubの拡張子が付いている方が公開鍵。

アクセス権と鍵の場所

鍵ペアは特に理由が無い限り ~/.ssh/ 内に保存しておく

パーミッション

local側
~/.ssh 700
秘密鍵 600
公開鍵 644
~/.ssh/known_hosts 644

サーバ側
~/.ssh 700
~/.ssh/authorized_keys 644 ~/.ssh/known_hosts 644

パーミッションがおかしいとSSH使用時に怒られる。

公開鍵をサーバに登録する

公開鍵をサーバに登録する方法は2通りある
scpでコピーする方法とssh-copy-idを使用する方法

scpでコピーする方法

~/.ssh/[鍵].pub をscpコマンドを使用してサーバに登録する。

local$ scp -P[ポート番号] ~/.ssh/[公開鍵].pub foo@XXX.XXX.XXX.XXX:
コピーするユーザはSSHで普段ログインするユーザ

一度サーバ側にログインし、公開鍵がコピーできているか確認
local$ ssh -p22222 foo@XXX.XXX.XXX.XXX

鯖$ ls
[公開鍵].pub

このファイルを '~/.ssh/authorized_keys' に追記する

鯖$ mkdir ~/.ssh
鯖$ touch ~/.ssh/authorized_keys
鯖$ cat [公開鍵].pub >> ~/.ssh/authorized_keys
鯖$ chmod 700 ~/.ssh
鍵$ chmod 644 ~/.ssh/authorized_keys

一度ログアウトして再度SSHログインをすると公開鍵認証になるはず
-iオプションでサーバに登録した鍵ペアの秘密鍵を指定する
local# ssh -i [秘密鍵] -p[ポート番号] foo@XXX.XXX.XXX.XXX

ssh-copy-idを使用する方法

local$ ssh-copy-id -i [秘密鍵] -p[ポート番号] foo@XXX.XXX.XXX.XXX
これで自動的に秘密鍵に対応する公開鍵がサーバの~/.ssh/authorized_keysに登録される

公開鍵認証を有効にする

この後、サーバ側の/etc/ssh/sshd_configの設定で
PasswordAuthentication no
の設定にしておきます
これでパスワード認証が無効になって公開鍵認証しか使えなくなりました

オプションで秘密鍵を指定するのが面倒な場合

ssh-keygenで鍵ペアを作成する場合、デフォルトの鍵名の場合は-iオプションが必要無いが、自分で鍵名を指定した場合は-iオプションで秘密鍵を指定する必要がある。
~/.ssh/configにチョメチョメすると回避できる
ちなみに、Port番号も指定できる local$ vim ~/.ssh/config

# アクセスする際の名前(ただのalias)
Host XXX.XXX.XXX.XXX
    # ユーザ名
    User foo
    # 実際のIPアドレスやホストネーム
    Hostname XXX.XXX.XXX.XXX
    # 秘密鍵の場所
    IdentityFile ~/.ssh/[秘密鍵]
    # ポート番号
    Port 22222
    # パスワード認証の有無
    PasswordAuthentication no
    # 公開鍵認証の有無
    RSAAuthentication yes

Host bar.com
    User foo
    Hostname bar.com
    IdentityFile ~/.ssh/[秘密鍵]
    passwordAuthentication no
    RSAAuthentication yes

パスフレーズを入力するのが面倒な場合

ssh-agentを使います
ssh-agentの子プロセスとしていつも使ってるシェルを起動
local$ ssh-agent zsh
local$ ssh-add [秘密鍵]
Enter passphrase for /home/hoge/.ssh/key: [パスフレーズ]
これでSSHでログインしようとするとパスフレーズを入力せずにログインできるようになっているはずです

参考サイト

公開鍵ペアの名前を変更して保存したい場合