サーバー構築 ssh関係
前提の説明
centos7を入れたばかりのサーバーには、ssh root@***.***.***.***で接続することができる。もちろんrootユーザーのパスワードが必要ではあるが、パスワードさえ分かれば接続できてしまう。
言い換えればデフォルトのsshの設定では不特定多数の第三者でも接続できる状態 を意味する。
この記事はsshでサーバーに接続する方法論ではない。不特定多数の第三者でも接続できる状況から如何にセキュリティを上げ、自分だけが接続できる状態にするか、これが本記事の主題なのである。この記事では様々な設定を行っていくのだが、それらはすべてセキュリティ向上の手段の1つとして認識すると一体的な理解につながる。
その他詳しいことが知りたければこちらを読めばある程度わかるようになると思われる。
http://www.unixuser.org/~euske/doc/openssh/book/chap4.html
想定環境
- centos7
概要
ssh接続するには以下のコマンドをクライアント側(ローカル)で入力する。このコマンドを成立させるための準備を行えば、セキュリティを担保したssh接続ができる。
ssh -p [22以外のポート番号] -i [秘密鍵] rootでは無いユーザ名@サーバのipまたはドメイン
このコマンドを入力するためには
- rootではないユーザでしか認証できないようにすること
- 22以外のポート番号を準備すること
- 公開鍵周りを準備すること(=パスワード認証の拒否を設定すること)
この3つが必要となる。これを設定することで、特定のユーザー名と特定のポート番号と特定の鍵情報をもっていないとサーバーに接続できなくなる。これは最初のsshの接続条件とは大きく変えることができる。
特定のユーザでしか認証できないようにすること
まず特定のユーザーを作成すること。そしてrootによる接続を拒否する設定をする。これで"rootではないユーザでしか認証できないようにすること"が可能になる。
特定のユーザーを作成する
サーバーにて以下のコマンドを実行する。
# userを作成 useradd hoge # 作成したuserのpasswordを設定 hogeはuser名 passwd hoge
rootによる接続を拒否する
rootによる接続を拒否するには、サーバー側のsshに関する設定ファイル(sshd_config)を変更すれば良い。
# 設定ファイルの編集 vi /etc/ssh/sshd_config
#PermitRootLogin yesをnoに変更する PermitRootLogin no
PasswordAuthentication no
サーバにssh用のポートを準備すること
ざっくり言えば、
- ポートの番号設定
- firewallの当該ポート番号を許容する設定
をすることになる。
ポートの番号設定
ssh用のポート番号設定は、ssh関係の設定ファイルのポート番号を変更するだけで良い。イメージとしては、設定(config)ファイルをvi(m)で変更して上書きする。 設定ファイルは/etc/ssh/sshd_config である。
vi /etc/ssh/sshd_config
例えばポート番号を15156と適当に決めたとすると、#Port 22と書いてある場所を見つけ Port 15156と書く。ポート番号をデフォルトの22から変更するのは、他の人にサーバを乗っ取られにくくするためである。
#Port 22 上記を下記に書き換え Port 15156
これでポート番号の設定は完了しました。sshd_configを変更したら更新するために以下を行う。
# centos7の場合はsshdをrestartするためにfirewallの設定を一時無効化するsetenforce 0を必要があります # setenforce 0 # systemctl restart sshd.service
firewallの当該ポート番号を許容する設定
ポート番号を変更したらとfirewallも設定変更するはルールになります。したがって今からfirewallの設定を変更すること、変更したことを反映させる作業をします。
留意点は、firewallの設定(定義)ファイルが/usr/lib/firewalld/services/ssh.xmlというパスで存在しています。これを直接編集せず、このファイルをコピーし、/etc/firewalld/services以下に置く。コピーした定義ファイルをsshd_configで設定したポート番号を許容するために記述するということです。
一般的に/etcにはサービス(デーモン)の設定ファイルを配置するようです。したがって設定の雛形と言えるべき/usr/lib/firewalld/services/ssh.xmlをコピーし、/etc以下に配置します。
参考:https://oshiete.goo.ne.jp/qa/8029047.html
# ファイアウォールの定義ファイルをコピー # cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services
# コピーした設定ファイルにポート番号22から変更ポート番号に記述変更 # vi /etc/firewalld/services/ssh.xml
<port protocol="tcp" port="15156">
上記のコマンドで設定ファイルを変更することができた。
次に設定変更を反映させるコマンドを入力します。
# 設定変更をfirewallに反映させる # firewall-cmd --reload
公開鍵周りの準備
サーバに接続する方法としてセキュリティを上げるため公開鍵認証を用いる。やり方は対となる公開鍵と秘密鍵を作る。公開鍵をサーバ(authorized_keysファイル)に登録する。ローカルには秘密鍵を保持しとく。そして上記のsshコマンドのように秘密鍵を使いssh接続する。これを実現するには、
- 公開鍵秘密鍵を作成する
- 公開鍵をサーバに送る
- 送られた公開鍵をauthorized_keysファイルに登録する。
なおsshがわけがわからなくなるのは、クライアント側で行う処理とサーバー側で行う処理を分けて整理できていないことが原因だった。クライアント、サーバーを明示する。
公開鍵秘密鍵の作成(クライアント側)
作成方法はmacとwindowsで異なる。
windowsの場合は、teratermを使ってssh鍵を作成する。
macの場合はすでにopen-sshがインストールされているので以下のコマンド入力で鍵を作成できる。
$ ssh-keygen -t [鍵タイプ]
鍵タイプはrsaを選択する。だから以下のコマンドになる。
$ ssh-keygen -t rsa
また鍵は-fを追加するとファイル名を定めることができる。
$ ssh-keygen -t rsa -f [ファイル名]
特に-fオプションを使う理由が現状では見当たらない。
公開鍵をサーバに送る(クライアント側)
macの場合は以下のようにした。このときsshのポートを利用したけど、事前にポート開放とうしておかないといけないかも?
scp -P [ポート番号] -i [公開鍵] [送信したいファイルパス] [ユーザー名]@[サーバーのドメインorIP] : [ファイルのおきさき(ディレクトリ)]
具体例:
scp -P 22 -i id_rsa.pub /Users/takashi/.ssh/id_rsa.pub chiaki@156.345.134.431:/tmp
サーバーのファイルの置く場所を指定すること。しないとファイルがいっこうに送信されない。ファイルが送れる場合、パスワードが要求された後、そのファイルが送信されたことが表示される。
クライアント側から受け取った公開鍵をauthorized_keysファイルに登録する(サーバー側)
sshの設定ファイル/etc/ssh/sshd_configに以下の内容がある。
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2 # but this is overridden so installations will only check .ssh/authorized_keys AuthorizedKeysFile .ssh/authorized_keys
デフォルトで公開鍵のチェックは.ssh/authorized_keysを参照することになる。だから.ssh/authorized_keysを準備する必要がある。
mkdir .ssh chmod 700 .ssh cat id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys