見出し画像

【Linux】 SSHの設定

SSHとは、 Secure Shellの略です。

SSHで接続したい場合は、接続先(サーバなど)に公開鍵を置き、接続元(クライアント)に秘密鍵を置くようにする。接続する際はリスクが大きいので、rootは使わないようにする。

出典


機器のVer

SSHの設定手順

1, サーバの設定

SSH接続userの作成

useradd username
passwd username

インストール

yum install openssh-server


2, クライアントの設定

SSH接続userの作成

useradd username
passwd username


インストール

yum install openssh-clients


SSH サーバー初期状態でのアクセス確認

$ ssh username@hostname
# あるいは直接 IP アドレスを指定して
$ ssh username@192.168.XXX.XXX

# もし .ssh がなければ
server$ mkdir .ssh
server$ touch .ssh/authorized_keys
server$ exit

SSH サーバー側に .ssh ディレクトリがなければ作成しておく。
ログインの確認ができたらexitする。


キーの生成

ssh-keygen -t rsa 
# パスフレーズを求められるが、運用上必要なければEnterで飛ばしていく

#作成後
秘密鍵:~/.ssh/id_rsa
公開鍵:~/.ssh/id_rsa.pub

rsa:一般的な鍵
ed25519:RSA よりも強固で高速
dsa:脆弱性があるため使用しない

※パスフレーズを設定しておくと、仮に管理用 PC が悪意ある第三者の手によって陥落しても、パスフレーズが特定されるまでの間は SSH の不正利用を防ぐことができる。


3, SSH 公開鍵のサーバーへの登録

client$ scp ~/.ssh/id_rsa.pub username@hostname:~/.ssh/authorized_keys
client$ ssh username@hostname
server$ cd .ssh
server$ chmod 600 authorized_keys

scpコマンドでサーバ側の~/.ssh/authorized_keysに鍵を配置するようにし、~/.ssh/authorized_keysの権限を600に変更する。
scpで権限がなく弾かれるようなら、(本来は弾かれることはないが)authorized_keysの権限を変更するのも1つの手になる。危険なのでお勧めはしない。


サーバ側で/etc/ssh/sshd_config の設定

変更を行う際は事前にバックアップを取る。
また、クライアントでSSH接続したままsudoコマンドで変更しても良いし、サーバに改めてログインして設定することも可能。

vi /etc/ssh/sshd_config   # (必要に応じて設定を取捨選択する。以下は主な設定)

-----------------------------------------------------------------
Port 2	# SSH接続を受け付けるポート番号。セキュリティを考慮して1024番以降の設定も可能。
PermitRootLogin	no         # SSHのrootでのログインを拒否。rootでのログインは危険。
PubkeyAuthentication yes  # 公開鍵認証を有効化
PasswordAuthentication no  # パスワード認証を拒否。ブルーフォレストの防御。
Protocol 2 # 接続をSSH version2 のみに限定する。1には脆弱性がある。
AllowUsers tanaka yamada # ログインを許可するユーザーのリスト(スペース区切り)
PermitEmptyPasswords no  # 空PWの禁止
-----------------------------------------------------------------

その他の設定

# ログインを許可しないユーザを制限する
DenyUsers user3 user4

# 公開鍵認証に使用する認証ファイルのパスを指定する
AuthorizedKeysFile  .ssh/authorized_keys

# X11転送を有効にする
X11Forwarding yes

# TCPラッピングを有効にする
UseTcpWrappers yes

# SSH接続のタイムアウト時間を変更する
ClientAliveInterval 120
ClientAliveCountMax 720

# SSH接続のログレベルを変更する
# QUIETはログ出力を無効 、FATAL、ERRORは異常状態のエラー、INFOは一般的な情報
LogLevel VERBOSE
LogLevel QUIET
LogLevel FATAL
LogLevel ERROR
LogLevel INFO

# SFTPのみを許可する
Subsystem sftp /usr/lib/openssh/sftp-server

# 接続先ホストの公開鍵を自動的に保存する
StrictHostKeyChecking no

# 接続の最大同時数を制限する
MaxSessions 10

# パスワードの最小文字数を指定する
MinPasswordLen 8

# ログイン時にメッセージを表示する
Banner /etc/ssh/banner

# SSHリモートログインを許可するIPアドレスを指定する
ListenAddress 192.168.1.1

# ログイン時にホスト名の正当性を検証する
VerifyReverseMapping yes

# SSH接続時にIPv6を使用する
AddressFamily inet6

# 一定時間接続がなかった場合に接続を自動的に切断する
ClientAliveInterval 300
ClientAliveCountMax 0
TCPKeepAlive yes

# SSH接続に使用される秘密鍵を指定
HostKey /etc/ssh/ssh_host_rsa_key

# 認証試行回数の上限を設定
MaxAuthTries

# known_hostsファイルを無視する
IgnoreUserKnownHosts yes


sshdを再起動

systemctl restart sshd



4, ファイアウォールの確認

ファイアウォールでSSHを拒否していると設定が正しくても接続できないので、同時に確認しておく。案件でルールがある場合はそれに従う。

Firewall

$ firewall-cmd --add-port=<変更したポート番号>/tcp --permanent
$ firewall-cmd --reload

iptable

$ iptables -I INPUT -p tcp --dport <変更したポート番号> -j ACCEPT
$ service iptables save


時短の設定(~/.ssh/config)

~/.ssh/configファイルを設定することで、ユーザーの入力やポートや秘密鍵の指定を簡略化することができる。
ちなみに、システム全体の設定は /etc/ssh/ssh_config になり、読み込みは、ssh_config → config の順になります。

設定例

# 198.51.100.10 のサーバ
Host 198.51.100.10
    User hoge
    Port 22222
    IdentityFile ~/.ssh/id_rsa

# example.com のサーバ
Host example
    HostName example.com
    User fuga
    IdentityFile ~/.ssh/piyo.pem
    IdentitiesOnly  yes

上記の設定をすれば、SSH接続時のコマンドは以下の通りになる。

$ ssh 198.51.100.10
$ ssh example
$ ssh [tabキー] # Host 候補が表示される

ワイルドカードでも設定できる。

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 10

Host 198.51.100.*
    User hoge
    Port  22

Host fuga*
    User piyo
    Port 22222

Hoge fugaA, fugaB, fugaC
$ ssh 198.51.100.1
$ ssh 198.51.100.10
$ ssh fugaA
$ ssh fugaC


踏み台サーバを設定する

config ファイルには、踏み台サーバ経由の接続も設定できます。

Host serverA
    User hoge
    Port 22
    IdentityFile ~/.ssh/id_rsa

Host serverB
    User fuga
    Port 22222
    IdentityFile ~/.ssh/piyo.pem
    ProxyCommand  ssh -W %h:%p serverA
$ ssh serverB # serverA 経由で serverB にログイン


chrootの設定

指定した任意のサブディレクトリを新たなルートディレクトリとすることができる。

設定例

ユーザー作成

$ useradd hoge
$ passwd hoge

コマンドの実行ファイル・関連ファイルをホームディレクトリ直下に配置する

$ cd /home/hoge
$ cp -p -r /bin /home/hoge/bin
$ cp -p -r /lib /home/hoge/lib
$ cp -p -r /lib64 /home/hoge/lib64
$ mkdir usr
$ cp -p -r /usr/bin /home/hoge/usr/bin 
$ cp -p -r /usr/lib /home/hoge/usr/lib
$ cp -p -r /usr/lib64 /home/hoge/usr/lib64

chroot用のディレクトリ/home/hogeはroot:root, 755に変更する。 /home/hoge以下のディレクトリ、ファイルはhoge:hogeに変更する。

$ chown root:root /home/hoge
$ chmod 755 /home/hoge
$ cd /home/hoge
$ chown hoge:hoge *

/etc/ssh/sshd_configの設定変更

# vi /etc/ssh/sshd_config # backupは取る

(デフォルトのsubsystemをコメントアウト)
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp

Match User sftp-user # user単位で設定。groupも使える
 ChrootDirectory /home/chroot/sftp-user #chrootを行うディレクトリパス
 X11Forwarding no             # X11転送許可設定
 AllowTcpForwarding no        # TCP転送許可設定
 ForceCommand internal-sftp   # 強制コマンド設定
 PasswordAuthentication yes   # パスワード認証を行うか

sshd再起動

$ systemctl restart sshd.service
$ systemctl status sshd.service

SSH接続できないこと

# ssh hoge@IPaddress
hoge@IPaddress's password:
This service allows sftp connections only.
Connection to IPaddress closed.

SFTP接続できること

# sftp hoge@IPaddress
Connecting to IPaddress...
hoge@IPaddress's password:
sftp>

Chroot,ファイル作成確認

sftp> pwd # chrootしたディレクトリに繋がっていること


sftp> put index.html
Uploading index.html to /html/index.html
index.html 100% 5 0.0KB/s 00:00

※chrootされていないユーザから作成されていることを確認
[root@tagutagu01 /]# ll /var/www/html/
total 4
-rw-r--r-- 1 sftp-user web-team 5 Apr 22 07:23 index.html


その他の

セキュリティ


よろしければサポートお願いします!よりいい情報を発信します。