こんにちは、あるいはこんばんは。すぱ..すぱらしいサーバサイドのエンジニアの(@taclose)です☆
インフラエンジニアもサーバサイドエンジニアもsshコマンドを叩かない日はないんじゃないでしょうかっ
gitコマンドなんかでもsshの設定が有効だったりもしますのでエンジニアにとって重要なアーティファクトと言えるでしょう。
今日は私も毎日お世話になってるsshコマンドの話を実践で使えるノウハウやオススメの設定をまとめて公開していきます!
※記事の内容はインフラエンジニア1年目でも読みやすく、かつ実践を意識して記載しています。深掘りより読破重視!
目次
sshとは?
えー!そこから!?って思う方もいるでしょうが、概要だと思って聞いて下さいねっ
「sshとは?」なんの略かというと、"Secure shell"を略したものです。 Wikiとかでも「暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル」と説明されていて、安全にサーバ間通信する最も一般的な方法と言えます。
「いやいやtacloseさん、FTP通信もかなり主流でしょうに」という方もいらっしゃるかもしれませんが、FTPはファイル転送プロトコルとして有名ではありますが通信が暗号化されておらず危険なため現在はファイル転送もsshを利用したSFTPやSCPを使う事が多いですね。
ここではそんなsshをより安全に便利に使ってもらうためのノウハウを詰め込んで説明しています。
とはいえport変更とか必須じゃないものもあるので、やりたい所だけチョイスしてやってもらえれば良いかなと思います。
という事で、sshの重要性がわかった所でLet's ssh!!
sshのパスワード入力を省略しよう!(公開鍵認証の話)
公開鍵認証を使えば、安全・パスワード不要が実現出来ます。
私は以下のコマンドをWindowsのWSL上で実行していますが、やりたい事は、
すればおしまいです。
以下は実際のコマンドです。
# username : 各自用意したサーバのuser名に置き換えてね! # hostname : 各自用意したサーバのdomain名やIPアドレスに置き換えてね! // 鍵を作成 $ ssh-keygen -t rsa -b 4096 (何も打たずにEnter2回。パスワード設定したらめんどいもんね!) // 鍵がある事を確認 $ ls -al ~/.ssh/ -rw------- 1 root root 1675 3月 3 2022 id_rsa -rwxr-xr-x 1 root root 404 3月 3 2022 id_rsa.pub // 公開鍵をサーバにアップロード $ ssh-copy-id username@hostname // 公開鍵がサーバに上がったかを確認してみる $ ssh username@hostname "ls -al ~/.ssh/authorized_keys" // 試しにアクセスできるか試してみる(失敗しても焦らないでネ!) $ ssh username@hostname
これでパスワード入力の地獄からは解放されました!おめでとう!
少し補足説明すると、
~/.ssh/authorized_keys
というのはサーバ側のsshの設定で標準的な公開鍵の置き場所ssh-copy-id
というコマンドはローカルにある~/.ssh/id_rsa.pub
をサーバ上の~/.ssh/authorized_keys
にアクセス権含めて良しなにアップロードしてくれるコマンドssh username@hostname
って秘密鍵指定してないけど!?~/.ssh/id_rsa
を使うのは標準なため省略が可能
という感じになっています。
もしかしたらログイン出来なかったなんて人いるかもしれませんが、次のセキュリティ対策の設定らへんが原因かもしれませんね。 次にいきましょう!
もっとここ詳しくって方はこちらも読んでみてね!
SSHは公開鍵・秘密鍵を使って楽にする - RAKUS Developers Blog | ラクス エンジニアブログ
sshのセキュリティ対策をしよう!(sshdの設定の話)
先に言います。
外部に晒されてないサーバなら正直port変更はやらなくてもまぁいいかなって思います。
飛ばしてもらってもOKです!やっておく方が良いですが無理に頑張らなくても良いかなと。
でも外部からのアクセスが許可されてるサーバであれば、いつか攻撃を受けますので設定しておく事をおすすめします。
- rootアカウントでのログイン拒否
- パスワードでのログイン拒否
- port 22でのアクセス拒否
ここらへんは最低限やっておくべきかとは思います。
さて、本題に戻ろうっ... 既に誰かが用意してくれたサーバの場合、sshの設定が色々と違ってるかもしれませんので確認しながら進めましょう!
尚、ポート開放やSELinuxについてはCentOS7のやり方で書いてますので、Ubuntuとかの人はfirewalldコマンドに置き換えて実施してくださいね!
sshのポート番号を変更しよう!
ファイアウォールとかSELinuxとか確認すべき事はありますが、手順としては
- sshdで20022 portを許可!ファイアウォールもSELinuxも 20022 portを許可!
- sshで20022 port使えるか確認!
- sshでport 22を閉じる!(port 20022で接続してないと接続切れちゃうよ!!)
の順番なので、焦らず焦らずとりあえず許可していきましょう!
sshdでport 20022を追加
sshdとは?という方のために補足すると、"sshd = ssh daemon = ssh常駐型プログラムを指すサーバサイド側のソフトウェア" を指しています。
普段sshでport X番に通信飛ばして接続して何か出来るのは、このsshdが受け答えしてくれてるんですね!感謝!
先にも記載しましたが、sshのportが22のままだと攻撃の機会を与えてしまいますので、変更すべきです。
では以下手順に沿ってLet’s port 解放☆
// まずは設定を確認! $ grep -E "^Port |^PermitRootLogin |^PasswordAuthentication" /etc/ssh/sshd_config // PermitRootLogin yes : rootでのログインを許可するのは危険です。可能なら no にしよう! PermitRootLogin yes // PasswordAuthentication yes : パスワード認証を許可するのは危険です。公開鍵認証の設定はしましたよね?だったらこれも no にしよう! PasswordAuthentication yes // Portの列はない: #Port 22ってコメントアウトされてる列はあるはず。Port 20022を後で追加しましょう! // 設定変更する $ vim /etc/ssh/sshd_config // 設定変更後こうなるようにしてね! $ grep -E "^Port |^PermitRootLogin |^PasswordAuthentication" /etc/ssh/sshd_config PermitRootLogin no PasswordAuthentication no Port 22 Port 20022 // 変更を反映させるため再起動っ $ systemctl restart sshd
これでsshdとしては20022を許可しましたが、みんなのサーバにはSELinuxやfirewalldが邪魔してるはずです。
また、社内ネットワークによってはローカルPC→ファイアウォール→開発サーバとなっていて、インフラチームにport 20022の許可を求める必要もあるかもしれません。
なので、ケースバイケースによっては無理せずPort 22のままにしましょう。
SELinuxの設定を確認しよう!
先輩社員に言われたかもしれない。
「SELinux?ヤツは四天王の中でも最弱...ヤツは無効でいいよ」
この話をすると必ずアンチが生まれ論争となり、すぱ...すぱらしいエンジニアが場を収める必要があるため、ここでは議論しない。
なので、この章では「無効な事を確認して終わり」もしくは「有効ならアクセス権を追加して終わり」という事に留める。
私も無効とする事が多いし、世の中無効が多数派かと思います。おっと、これ以上は危険か。
以下、手順です。
// SELinuxの確認。Disabled:無効, Enforcing: 有効, Permissive : 無効だが警告は出る $ getenforce Disabled # - - - - - # // 案1:SELinux無効にする方法 // SELinux無効でいいじゃん派なら以下のコマンドで無効化させておしまいっ $ setenforce 0 # - - - - - # // 案2:SELinux有効のままで、ちゃんとsshのためにport 20022を開ける方法 // まずはsshのportが22で開いている事を確認。 $ semanage port --list | grep ssh ssh_port_t tcp 22 // port: 20022を開ける $ semanage port --add --type ssh_port_t --proto tcp 20022 // sshのportが20022も開いた事を確認。 $ semanage port --list | grep ssh ssh_port_t tcp 20022, 22
今は深く理解出来てないって人もとりあえずOK!!次いきましょう!
ファイアウォールを確認しよう!
ファイアウォールと言ってもCentOS上で動いてるfirewalldとは別にインフラチームが管理してる機器もあります。そっちはインフラチームに任せましょう。
ここではfirewalldについて説明します。
// まずはファイアウォールがinactiveかactiveか確認。activeじゃないなら読み飛ばしてOK $ systemctl status firewalld Active: inactive (dead) // ←firewalldが動いていない例です # - - - - - # // 案1:firewalldを無効化にして終わらせる方法 // 常駐化 OFF (サーバ再起動しても自動起動しなくなります) $ systemctl disable firewalld.service // ファイアウォールの停止コマンド $ systemctl stop firewalld.service # - - - - - # // 案2:firewalldでちゃんとport 20022をssh用に開ける方法 // firewalldにport 20022のssh設定を追加する $ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-20022.xml # firewallの設定をコピー $ vim /etc/firewalld/services/ssh-20022.xml # 書き換える port="22"をport="20022"にする $ diff /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-20022.xml // 差分はこうなるはず 5c5 < <port protocol="tcp" port="22"/> --- > <port protocol="tcp" port="20022"/> // 追加したport設定を読み込ませる $ firewall-cmd --add-service=ssh-20022 --permanent // 反映するために再起動 $ firewall-cmd --reload
ssh port 22を閉じよう!!!
当然ながらここまでの説明で飛ばした所はここも関係ない所飛ばしつつ設定してくださいね!
以下、手順です。
// まずはローカルから20022で接続できるかを確認しましょう。 $ ssh username@hostname -p 20022 // sshdからPort 22の設定を消す $ vim /etc/ssh/sshd_config Port 22 // ←この記述を消しましょう // sshd再起動! $ systemctl restart sshd.service // SELinuxからPort 22のアクセスを拒否させる $ semanage port --delete --type ssh_port_t --proto tcp 22 // SELinuxでPort 22が禁止されて、20022だけになった事を確認 $ semanage port --list | grep ssh ssh_port_t tcp 20022 // firewalldからPort 22のアクセスを拒否させる $ firewall-cmd --permanent --remove-service=ssh // firewalldの再起動 $ systemctl restart firewalld.service // firewalldからsshのサービス設定が消えた事を確認 $ firewall-cmd --list-all | grep ssh services: dhcpv6-client ssh-20022 // ← sshというのがなくなってる。 // 最後に念のためPort 22でログイン試みてみてもいいかもね!絶対無理だけどね!! $ ssh username@hostname -p 20022
セキュリティ設定に関するまとめ
うん、すごく面倒だったけど頑張りましたね!えらい!エンジニア歴浅い人は一度Ubuntuのサーバとか1から設定してみると良いですよ!
まずはfirewallでssh以外のポート全部閉じて、必要な所だけ開いていって、あ~なんか無駄なものがないって気持ちいいってなればいいなと思います!
sshのコマンド入力を楽にしよう!(ssh configの話)
これ系はconfigファイルの書き方次第でプログラムでいう継承関係とかも実現出来るので、こだわって色々アレンジしてみてほしいです。 サンプルで私のものを一部公開しますね!
※IPとかUser名はブログ用に修正してます。サンプルです!
$ cat .ssh/config Host __* ServerAliveInterval 60 User taclose Host __taclose.develop Hostname 192.168.100.32 IdentityFile ~/.ssh/id_rsa Port 20022 Host __taclose.staging Hostname 192.168.100.32 IdentityFile ~/.ssh/id_rsa Port 20022 Host git.local.server Hostname git.local.server IdentityFile ~/.ssh/id_rsa.git Host __log_server Hostname office.log-server.jp User maeda
この設定ファイルの置き場所は.ssh/config
ここ固定です。各自ないなら作りましょう!
指定できるパラメータ次第ではsshのProxy設定であったり、Portだったり色々指定できます。そこらへんは詳しくまとめてくれてある記事があるので、こちらを参照してください。
~/.ssh/configを使ってSSH接続を楽にする - RAKUS Developers Blog | ラクス エンジニアブログ
ここでは設定のノウハウだけ以下に書いておきますね。
Point1: Host __*
で共通設定を書こう
$ yum install -y bash-completion
サラッと大事な事上に書いてますがbash-completionを入れておけば入力補完が効いて便利です!
そして、このHost指定に __と入れる事で sshコマンドを打つ際に余計な入力候補が出なくなります。
やっておかないと、/etc/hosts的な場所に定義してあるものとか余計なものまで候補に出て探しにくいのです。
そして、 アスタリスク*
を使う事で正規表現指定が可能なので、「__から始まるHost指定全部にこの設定ね!」と出来ます。
なので、「共通設定は接続切れないようにしたいのと、だいたいユーザ名はtacloseだな」とかを定義しておけばOK!!
Point2 : gitサーバとかのHost名はHostnameと同じにしよう
これはgit clone
とかする際にも公開鍵認証の設定が有効なためです。そしてgitのサーバには sshコマンドで入らないので__は不要かなと...
そしてこうなる!!!
ん~sshの入力補完も無駄な候補がないし、指定も楽ですね! sshのパスワード不要も素敵!
最後に
セキュリティ絡みが長くなりましたが、重要な事なので皆さんも一度設定してみてサーバの知識をより深めてもらえればいいんじゃないかなって思います。
AlmaLinuxへの移行とか検討されてる方にしても、CentOSと同様にRHELのクローンOSです。
つまり、各種設定はCentOSの知識がそのまま使えます。
AlmaLinuxのサーバ構築する際には是非、firewallで全部のポート閉じて必要なポートだけ開けてあげてください。
きっと秘密基地にのぞき穴だけ開いてるそんな居心地の良いサーバになります。
やってみると楽しいですよ!
参考文献
CentOS 7 で sshd のポート番号を変更する方法 |
~/.ssh/configを使ってSSH接続を楽にする - RAKUS Developers Blog | ラクス エンジニアブログ
SSHは公開鍵・秘密鍵を使って楽にする - RAKUS Developers Blog | ラクス エンジニアブログ
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/
カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.com
ラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/
イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com