とりとめも

藻類が学んだり感じたりしたことを未来の自分のために書き留めるところ

CentOS7を入れてからやったことメモ(ssh周りの設定中心)

はじめに

前回VirtualBoxにCentOS7を入れてみました。 あのときはCentOS自体の設定はほとんど行いませんでした。

今回は、練習として行った設定変更のメモです。
本番環境を見据えて定番っぽい設定をなぞりますが、セキュリティ的には不足だらけのはず。
あと、手順以外も色々殴り書いてて読みづらい。

あくまで自分用のメモという意識が強いので、読みやすさや手順としての信頼性という観点では、各リンク先を見て頂くのが良さそう。

今後もちょっとずつ追記していくかも。

環境

ホストOS:Mac OS X 10.12.2
ゲストOS:CentOS 7.3.1611(minimal ISOでインストール

前回の記事で行った設定直後の状態です。
ホストOSが違っても今回の手順にはほぼ影響しないけど、鍵認証の設定あたりは少し変わりそう。

インストール済パッケージの最新化

[root@host ~]$ yum -y update

  • これでインストール済パッケージが全て最新化される
  • yumはパッケージ管理ツール
  • -yは全ての「実行する?」にyesを返すオプション

sudo設定

rootで作業しないで、一般ユーザー + sudoで作業できるようにする。
sudo可能なユーザーは/etc/sudoersに定義されてるのでこれを編集・・・したいけど権限が無い。ので、以下のコマンドを実行する。

[root@host ~]$ visudo

これでsudoersの編集画面が開く。
/Allowとかで検索すると以下の行がヒットするはず。

##Allows root to run any commands anywhere
root    ALL=(ALL)   ALL

これをたとえば以下のように編集してみる。

##Allows root to run any commands anywhere
root    ALL=(ALL)   ALL
jibun   ALL=(ALL)   ALL
%team1  ALL=(ALL)   ALL

これでjibunユーザーと、team1グループのメンバーはsudo可能になる。
ただ、以下の手順も基本的にrootユーザーでの実行を前提とした書き方をしてる。

rootでのsshログインを禁止する

sshを受け付ける際の設定は/etc/ssh/sshd_configで定義する。
デフォルトではPermitRootLoginの値がyesになっているのでnoに変更

(略)
#LoginGraceTime 2m
PermitRootLogin no #←編集したところ
#StrictModes yes
(略)

sshdのサービス再起動する。

[root@host ~]$ systemctl restart sshd.service

rootにsuできるユーザーを制限

/etc/pam.d/suで設定する。

auth required    pam_wheel.so use_uid
#↑コメントを外しただけ

また、/etc/login.defsを編集。
以下の行を追加する。

SU_WHEEL_ONLY        yes

これでwhellグループに属するユーザーのみsu可能になる。
ので、自ユーザーをwheelに追加してあげるのを忘れない。

[root@host ~]$ usermod -G wheel jibun

jibunが自ユーザー。適宜書き換える。

公開鍵認証の設定

公開鍵・秘密鍵を生成して、sshd.configを編集して鍵認証可能にする。
自ユーザー(一般ユーザー)で鍵認証可能とするため、rootではなく自ユーザーで作業したほうが楽。

(サーバー側)ホームディレクトリに.sshを作る

[jibun@host ~]$ pwd
/home/jibun
[jibun@host ~]$ mkdir .ssh
[jibun@host ~]$ chmod 700 .ssh

(クライアント側)公開鍵と秘密鍵のペアを生成する

$ ssh-keygen

上のコマンドを実行すると最初に生成するファイル名(フルパス)を聞かれる。
特別な理由が無ければ空でいい。デフォルト設定となり、~/.ssh内にid_rsa、id_rsa.pubを作ってくれる。(~/.sshが無ければ自動作成)
続けてパスフレーズを2回聞かれるので、こちらはいい感じのものを入れる。

$ ls .ssh

~/.sshにid_rsaとid_rsa.pubができてるはず。

$ chmod 600 .ssh/id_rsa.pub

公開鍵のパーミッションを変更しておく。

(クライアント側)作った公開鍵をサーバーに登録(アップロード)する

サーバー側の~/.ssh/authorized_keysに公開鍵の情報を記述する。
scpで渡してしまうのが一番楽な気がする。

$ scp ~/.ssh/id_rsa.pub jibun@xxx.xxx.xxx.xxx:~/.ssh/authorized_keys

以上で鍵認証の準備は整ったので、ターミナルからsshでサーバーに接続してみる。
いつものユーザーパスワードではなく鍵のパスフレーズを聞かれる。パスフレーズを入力すればログイン完了。

パスワード認証の不許可(鍵認証でのみssh許可する)

rootのsshログイン不許可と同様に/etc/ssh/sshd_configで設定する。
#PasswordAuthentication yesの行をnoにする。

(略)
PasswordAuthentication no
(略)

sshdのサービス再起動する。

[root@host ~]$ systemctl restart sshd.service

メモ:鍵認証関係のその他考え事

  • VPSであればデフォルトで公開鍵が配置されていて、秘密鍵も契約時などに教えてもらえるっぽい?
  • macの場合ssh-copy-idというコマンドで簡単にパーミッション変更・アップロードできるらしい(今度やってみる)
  • 実は最初は「サーバー側で鍵作成 → 秘密鍵ダウンロード」という順序で作業した
    • 暗号化しているとはいえ秘密鍵がネットワークを通ってしまうので良くなさそう

sshのポート番号を変更する(SELinux設定変更)

デフォルトのポート番号22を適当な番号に変更したい。
先ほどと同様にetc/ssh/sshd_configで定義する。
のだけど、その前にコマンドを打つ!

[root@host ~]$ yum install -y policycoreutils-python
[root@host ~]$ semanage port -a -t ssh_port_t -p tcp <任意のポート番号>

これがないと後述のsshd_config編集後のsshd再起動でエラーになる(なった!)。
いろいろ試行錯誤した末にこちらの記事に辿り着いて解消しました。

1つ目のコマンドでsemanageコマンド(を含むパッケージ)をインストールしている模様。
semanageはSELinuxの設定を管理するためのコマンド。

man semanageを流し読みした感じだと、
-p tcp <任意のポート番号>tcpのxxx番を
-t ssh_port_tssh用のポートとして
-a:設定追加
しているみたい。
SELinuxやsemanageのあたりはまだ全然分かっていないので改めて勉強したい。

また、今回追加したポート番号を含め、「どのポート番号が何の用途に割り当てられているか」は、次のコマンドで見られる。

[root@host ~]$ semanage port -l

結構たくさん出てくるので目的にあわせてgrepする。

sshのポート番号を変更する(定義ファイル編集)

今度こそ/etc/ssh/sshd_configを編集する!

#Port 22
#↑コメントアウトを外して前述の<任意のポート番号>に変更する

編集したら、sshdを再起動する。

[root@host ~]$ systemctl restart sshd.service

sshのポート番号を変更する(ファイアウォール設定変更)

以下のどちらかの方法で、sshで許可するポート番号を設定する。

ssh.xmlを作成する

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="<任意のポート番号>"/>
</service>

保存したら、firewalldを再起動する。

[root@host ~]$ systemctl restart firewalld.service

②myssh.xmlを作成してサービス登録

①とほぼ同じ方法だけど、こちらの場合は新しいサービスとしてfirewalldに設定される。下記記事を参考にしました。

まず、/etc/firewalld/services/myssh.xmlを作成する。
ファイル名は何でもよくて、内容も①と同じでいい。

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="<任意のポート番号>"/>
</service>

保存したら、一度firewalldをリロードする。

[root@host ~]$ firewall-cmd --reload

(前述の記事には無かったけど、リロードしないとmysshを登録可能なサービスとして認識してくれないっぽい。自動で認識してくれる方法があるかも?)

「myssh」をサービスとして登録する。

[root@host ~]$ firewall-cmd --add-service=myssh --zone=public [root@host ~]$ firewall-cmd --add-service=myssh --zone=public --permanent

あとはもう一度firewalldをリロード(念のため。多分しないで大丈夫)して、設定確認。

[root@host ~]$ firewall-cmd --reload [root@host ~]$ firewall-cmd --list-all

メモ:firewalldのサービスについて

①と②を行えば理解できる内容だけど書いておく。
②の最後に叩いたfirewall-cmd --reloadは、firewalldに登録されたサービスを表示するコマンド。デフォルトだと以下の行が存在した。

services: dhcpv6-client ssh

(…dhcpv6-clientたぶんいらない)

対して②の最後のコマンド実行後は以下のようになる。

services: dhcpv6-client myssh ssh

つまり、firewalldはservicesディレクトリ内のxmlを実行可能なサービスとして認識し、–add-serviceしてあげることで、サービスとして登録される。
①の手順で–add-serviceがいらないのは、「ssh」という名前はデフォルトでサービスとして登録されており、ssh.xmlを作成して再起動すれば設定が反映されるから。

おわりに

以上、VirtualBoxCentOSを入れた後に行った設定変更メモでした。
徒然なるままに変更していたのですが、自然とssh周りばかりですね。

充分な設定というわけではないので、これからも少しずつ触っていきたいです。その度にこのメモも追記したいけど、ちょっと大変そう。

参考リンク