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でログインしようとするとパスフレーズを入力せずにログインできるようになっているはずです