[{"data":1,"prerenderedAt":452},["ShallowReactive",2],{"article-vps-ssh-first":3},{"id":4,"title":5,"body":6,"category":436,"createdAt":438,"description":5,"extension":439,"index":440,"meta":441,"navigation":442,"path":443,"publish":442,"seo":444,"series":440,"seriesTitle":440,"stem":445,"tag":446,"thumbnail":450,"updatedAt":440,"__hash__":451},"articles\u002Farticles\u002Fvps-ssh-first.md","VPSでやっておきたいSSHの最低限のセキュティ設定。",{"type":7,"value":8,"toc":421},"minimark",[9,13,16,19,35,50,53,58,61,72,75,78,87,90,93,104,107,111,114,120,123,129,136,142,172,176,188,195,201,204,207,210,213,219,222,228,235,241,250,256,264,270,277,296,299,302,309,315,333,336,342,345,351,354,359,362,365,368,374,377,380,386,396,402,405,411,414,418],[10,11,12],"p",{},"こんにちはjunです。webエンジニアとして働いていますが会社の人数が少なく、インフラの構築をすることがあります。と言ってもLAMP環境を作成するぐらいですけど。",[10,14,15],{},"構築は慣れてきましたがその中で、私が一番考えるのはセキュリティーです。構築するアプリケーションによってはセキュリティー設定はことなりますが、今回は自分でサーバを構築する時に最低限やった方がいいSSHの設定をメモがてら記事にしようと思います。",[10,17,18],{},"今回行う設定は以下の通りです。",[20,21,22,26,29,32],"ul",{},[23,24,25],"li",{},"rootユーザーのリモートログイン禁止化",[23,27,28],{},"パスワード認証禁止と鍵認証化",[23,30,31],{},"鍵認証の実装方法",[23,33,34],{},"ポート変更とfirewallの設定",[36,37,41,42],"div",{"className":38},[39,40],"alert","alert-success","\nなお今回説明する環境\n",[20,43,44,47],{},[23,45,46],{},"サービス：GMO conoha VPS",[23,48,49],{},"OS：centos8",[10,51,52],{},"この設定をすべき理由や背景などから話すため、さっさと方法を知りたい場合は「root以外のユーザーを作成していく」から見てください。",[54,55,57],"h2",{"id":56},"sshはめちゃくちゃ狙われている","SSHはめちゃくちゃ狙われている",[10,59,60],{},"SSHはリモートでサーバーを操作できる口のため、一番厳重にしなければなりません。あまり運用していないサーバー、購入したばかりでドメインと紐づけられていなくても世界中からBOTによる不正アクセス試行が発生します。私がVPSで購入してイメージが立った時も早速ログを見たところ以下の様になっていました。",[62,63,68],"pre",{"className":64,"code":66,"language":67},[65],"language-text","April  8 12:10:04 xxx-xxx-xx-xxx sshd[6887]: Failed password for root from 209.141.36.197 port 54506 ssh2\nApril  8 12:10:04 xxx-xxx-xx-xxx sshd[6891]: Failed password for invalid user oracle from 209.141.36.197 port 54518 ssh2\nApril  8 12:10:04 xxx-xxx-xx-xxx sshd[6892]: Failed password for invalid user test from 209.141.36.197 port 54512 ssh2\nApril  8 12:10:04 xxx-xxx-xx-xxx sshd[6889]: Failed password for root from 209.141.36.197 port 54520 ssh2\nApril  8 12:10:06 xxx-xxx-xx-xxx sshd[6904]: Failed password for root from 222.187.238.136 port 58496 ssh2\nApril  8 12:10:10 xxx-xxx-xx-xxx sshd[6904]: Failed password for root from 222.187.238.136 port 58496 ssh2\nApril  8 12:16:26 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2\nApril  8 12:16:30 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2\nApril  8 12:16:33 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2\nApril  8 12:16:37 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2\nApril  8 12:16:41 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2\nApril  8 12:16:45 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2\nApril  8 12:16:49 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2\nApril  8 12:16:53 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2\nApril  8 12:16:56 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2\nApril  8 12:27:50 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2\nApril  8 12:27:54 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2\nApril  8 12:27:57 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2\n","text",[69,70,66],"code",{"__ignoreMap":71},"",[10,73,74],{},"これはSSHの接続失敗の履歴です、同じIPで定間隔でrootユーザーによるパスワード接続を試みています。これはパスワードリスト攻撃・総当たり攻撃というものです。確率は低いですがrootのパスワードが万が一にあった場合、サーバの最上権限であるrootが第三者に掌握されます。",[10,76,77],{},"ドメインに紐づけられておらずIPだけでもこの様にBOTがインターネットを徘徊して、脆弱なサーバを狙っています。VPSを購入したらすぐにデフォルトの設定を変えて、比較的安全なものに変更しましょう。",[36,79,82,83,86],{"className":80},[39,81],"alert-info","\nターミナルで",[69,84,85],{},"whois","コマンドを使用してIPのwois情報を調べられます。登録された国などもわかります。ちなみに上記のIPのほとんどが中国でした。\n",[54,88,89],{"id":89},"安全にするために変更する設定",[10,91,92],{},"デフォルトの設定から以下の変更を行います。",[20,94,95,98,101],{},[23,96,97],{},"rootによるリモートログインを禁止にする。",[23,99,100],{},"SSHをパスワード認証でなく、鍵認証にする",[23,102,103],{},"ポートを変更する",[10,105,106],{},"これらの設定は最低限行うべきものです。より強固にする場合は、色々と他に設定しますがまずはこれでいきましょう。",[108,109,110],"h3",{"id":110},"root以外のユーザーを作成していく",[10,112,113],{},"最終的にはrootのリモートログインを禁止するため別の操作ユーザーを作成していきます。まずはrootでログインしましましょう。",[62,115,118],{"className":116,"code":117,"language":67},[65],"ssh root@123.456.78.901\n（IPなどは自分のものに置き換えてください）\n",[69,119,117],{"__ignoreMap":71},[10,121,122],{},"開発用・SSH接続用ユーザーを作成します。",[62,124,127],{"className":125,"code":126,"language":67},[65],"# useradd develop\n# passwd develop\n",[69,128,126],{"__ignoreMap":71},[10,130,131,132,135],{},"これでユーザーとそのパスワードが設定されました。次にそのユーザーを",[69,133,134],{},"wheel","グループに所属させます。",[62,137,140],{"className":138,"code":139,"language":67},[65],"# usermod -G wheel develop\n",[69,141,139],{"__ignoreMap":71},[10,143,144,146,147,150,151,154,155,158,159,162,163,165,166,168,169,171],{},[69,145,134],{},"グループに所属することで",[69,148,149],{},"develop","が",[69,152,153],{},"sudo","を使用できる様になり、また",[69,156,157],{},"su","にてrootになることができます。",[69,160,161],{},"\u002Fetc\u002Fsudoers","では",[69,164,134],{},"グループで行える操作などを定義してあり、基本的にはrootを使用せずdevelopでsshログインをして操作します。yumで何かインストールしたい時とかは",[69,167,153],{},"したり",[69,170,157],{},"でrootになります。",[173,174,175],"h4",{"id":175},"wheelのみがsuできる様にする",[10,177,178,179,181,182,184,185,187],{},"デフォルトではsuでどのユーザーもrootになれます。",[69,180,149],{},"意外にもユーザは存在し、そのユーザーが狙われることもあります。そのため",[69,183,134],{},"グループに属しているユーザーだけが",[69,186,157],{},"を用いてrootになれる様にしましょう。",[10,189,190,191,194],{},"suの設定は",[69,192,193],{},"\u002Fetc\u002Fpam.d\u002Fsu","に記述されています。",[62,196,199],{"className":197,"code":198,"language":67},[65],"# vi \u002Fetc\u002Fpam.d\u002Fsu\n\n--------\n# コメントアウトしているこの箇所を外す\n# auth            required        pam_wheel.so use_uid\n↓\nauth            required        pam_wheel.so use_uid\n--------\n",[69,200,198],{"__ignoreMap":71},[10,202,203],{},"コメントアウトされている箇所を外します。これでsuでrootになるためにwheelグループに属したユーザーから行うという制限ができました。",[108,205,206],{"id":206},"develop用のssh鍵を作成",[10,208,209],{},"現在sshはパスワードでログインできますが、最終的にはパスワード認証を禁止にします。そしてよりセキュアな鍵認証式に変更します。基本的にログインの手間やセキュリティ的に鍵認証にした方がいいです。鍵認証の原理は今回は省きます。それではdevelop用の鍵を作成します。",[10,211,212],{},"クライアント側で秘密鍵と公開書きを作成します。",[62,214,217],{"className":215,"code":216,"language":67},[65],"% ssh-keygen\nGenerating public\u002Fprivate rsa key pair.\nEnter file in which to save the key (\u002FUsers\u002Fyou\u002F.ssh\u002Fid_rsa): #id_rsaというファイル名でよければそのままEnter\nEnter passphrase (empty for no passphrase): 　#パースフレーズを設定する場合は入力。なければEnter\nEnter same passphrase again:\n",[69,218,216],{"__ignoreMap":71},[10,220,221],{},"これで秘密鍵と公開鍵が生成されます。秘密鍵をクライアントに置いておき、公開鍵をサーバに転送します。",[62,223,226],{"className":224,"code":225,"language":67},[65],"scp .\u002Fid_rsa.pub develop@123.456.78.902:~\u002F\n",[69,227,225],{"__ignoreMap":71},[10,229,230,231,234],{},"サーバー側に戻ります。developのホームディレクトリに",[69,232,233],{},".ssh","というディレクトリがあるかを確認します。",[62,236,239],{"className":237,"code":238,"language":67},[65],"$ ls -a ~\u002F\n",[69,240,238],{"__ignoreMap":71},[10,242,243,245,246,249],{},[69,244,233],{},"は隠しフォルダなので",[69,247,248],{},"ls -a","を使用します。無い場合はディレクトリを作成します。今回は無かったとしましょう。",[62,251,254],{"className":252,"code":253,"language":67},[65],"$ mkdir ~\u002F.ssh\n$ chmod 700 ~\u002F.ssh \n",[69,255,253],{"__ignoreMap":71},[10,257,258,260,261,263],{},[69,259,233],{},"は権限を700にしましょう。そうで無いと権限エラーによってdevelopに対するsshを行うことができません。そしてクライアントから転送された公開側の名前を変更して",[69,262,233],{},"配下に置いておきます。",[62,265,268],{"className":266,"code":267,"language":67},[65],"$ cp ~\u002Fid_rsa.pub ~\u002F.ssh\u002Fauthorized_keys\n$ chmod 600 ~\u002F.ssh\u002Fauthorized_keys\n$ rm ~\u002Fid_rsa.pub\n",[69,269,267],{"__ignoreMap":71},[10,271,272,273,276],{},"ここでも",[69,274,275],{},"authorized_keys","は600権限を付けないと使用できません。",[36,278,280,283,293],{"className":279},[39,81],[10,281,282],{},"authorized_keysにリネームする理由",[10,284,285,286,292],{},"The authorized_keys file in SSH specifies the SSH keys that can be used for logging into the user account for which the file is configured.(",[287,288,291],"a",{"target":289,"href":290},"_blank","https:\u002F\u002Fwww.ssh.com\u002Facademy\u002Fssh\u002Fauthorized-keys-file#:~:text=The%20authorized_keys%20file%20in%20SSH,keys%20and%20needs%20proper%20management.","参照",")",[10,294,295],{},"authorized_keysファイルはその公開鍵に紐づく秘密鍵を用いてログインできるユーザーを特定します。簡単な話、authorized_keysにしておけばsshが自動的に鍵を判別してくれるのでその名前にしておく。",[10,297,298],{},"これでdevelopは鍵認証を用いてログインできる様になりました。",[108,300,301],{"id":301},"rootのリモートログインとパスワード認証を禁止にする",[10,303,304,305,308],{},"developで鍵認証で接続できることを確認したら次はrootのリモートログインとパスワード認証を禁止にします。",[69,306,307],{},"\u002Fetc\u002Fssh\u002Fsshd_config","を編集していきます。",[62,310,313],{"className":311,"code":312,"language":67},[65],"# vi \u002Fetc\u002Fssh\u002Fsshd_config\n\n---------- 以下行を追加 -----------\nPermitRootLogin no\n---------- 以上行を追加 -----------\n\n--------------以下を変更--------------\nPasswordAuthentication yes\n#RSAAuthentication yes\n#PubkeyAuthentication yes\n--------------↓--------------\nPasswordAuthentication no\nRSAAuthentication yes\nPubkeyAuthentication yes\n------------------------------------------\n",[69,314,312],{"__ignoreMap":71},[10,316,317,320,321,324,325,328,329,332],{},[69,318,319],{},"PermitRootLogin no","という記述をつけます。名の通りルートのログインを禁止にさせました。そして",[69,322,323],{},"PasswordAuthentication no","としパスワード認証を禁止。",[69,326,327],{},"RSAAuthentication yes","と",[69,330,331],{},"PubkeyAuthentication yes","のコメントアウトを外して鍵認証のみでつなげる様に明示的に設定します。",[10,334,335],{},"これであとはsshdをリスタートさせれば反映させます。",[62,337,340],{"className":338,"code":339,"language":67},[65],"# systemctl restart sshd\n",[69,341,339],{"__ignoreMap":71},[10,343,344],{},"試しにチェックしましょう。",[62,346,349],{"className":347,"code":348,"language":67},[65],"ssh root@xxx.xxx.xxx\nroot@xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\n\nssh develop@xxx.xxx.xxx\ndevelop@xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\n",[69,350,348],{"__ignoreMap":71},[10,352,353],{},"OKです。逆にdevelopで鍵認証で接続したのに弾かれたら設定をミスっています。",[36,355,358],{"className":356},[39,357],"alert-danger","\n接続系を設定するときは2つのターミナルタブを開いていておき、片方はずっとroot化できる状態でサーバーにログインしておき、片方で接続テストをしましょう。もし失敗してどのユーザー・方法でも接続できなくなると二度とサーバーに接続できなくなります。\n",[108,360,361],{"id":361},"sshの接続ポートを変更する",[10,363,364],{},"sshはデフォルトで22のポートで接続します。しかしこのポートはwell-knownポートとして知られており、攻撃者もデフォルトのポートを狙ってきます。そこでsshのポートを変更してさらに攻撃されにくくします。sshに接続するためにはユーザー名、鍵・パスワード、ポートが合わないといけないからです。",[10,366,367],{},"まずはsshdのデフォルトポートを変更します。変更するポート番号は49513～65535あたりから自由に設定しましょう。",[62,369,372],{"className":370,"code":371,"language":67},[65],"# vi \u002Fetc\u002Fssh\u002Fsshd_config\n--------------以下を変更--------------\n#Port 22    \n--------------↓--------------\nPort 49510\n------------------------------------------\n",[69,373,371],{"__ignoreMap":71},[10,375,376],{},"そしてfirewallが有効な場合、sshによる22は許可していてもカスタムしたポートは許可していないことがあります。これではカスタムポートへ接続する前にfirewallで弾かれるので設定します。",[10,378,379],{},"まずはsshdのfirewallの設定ファイルをコピーします。",[62,381,384],{"className":382,"code":383,"language":67},[65],"cp \u002Fusr\u002Flib\u002Ffirewalld\u002Fservices\u002Fssh.xml \u002Fetc\u002Ffirewalld\u002Fservices\u002F\n",[69,385,383],{"__ignoreMap":71},[10,387,388,391,392,395],{},[69,389,390],{},"\u002Fetc\u002Ffirewalld\u002Fservices\u002F","にて追加の設定を行うことができます。コピーした",[69,393,394],{},"ssh.xml","を編集します。",[62,397,400],{"className":398,"code":399,"language":67},[65],"# vi \u002Fetc\u002Ffirewalld\u002Fservices\u002F\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n  \u003Cservice>\n    \u003Cshort>SSH\u003C\u002Fshort>\n    \u003Cdescription>Secure Shell (SSH) is a protocol ...\u003C\u002Fdescription>\n    \u003Cport protocol=\"tcp\" port=\"22\"\u002F>\n    \u003Cport protocol=\"tcp\" port=\"49510\"\u002F> # 追加\n\u003C\u002Fservice>\n",[69,401,399],{"__ignoreMap":71},[10,403,404],{},"上記の設定でsshサービスによる49510ポートの接続が許可されました。\nそして設定が終わったらfirewallをリロードします。またsshdも設定を変えたのでリロードします。",[62,406,409],{"className":407,"code":408,"language":67},[65],"# firewall-cmd --reload\n# systemctl restart sshd\n",[69,410,408],{"__ignoreMap":71},[10,412,413],{},"これでOKです。ポートをカスタムのものに指定して接続して通れば問題ありません。そして22（デフォルト）で接続して弾かれるかも確認しましょう。",[54,415,417],{"id":416},"以上","以上！",[10,419,420],{},"以上がsshの最低限必要な設定です。インフラ系では結構基礎的な内容だそうです。sshは狙われており、適切に設定することで安全に使用することができます。",{"title":71,"searchDepth":422,"depth":422,"links":423},3,[424,426,435],{"id":56,"depth":425,"text":57},2,{"id":89,"depth":425,"text":89,"children":427},[428,432,433,434],{"id":110,"depth":422,"text":110,"children":429},[430],{"id":175,"depth":431,"text":175},4,{"id":206,"depth":422,"text":206},{"id":301,"depth":422,"text":301},{"id":361,"depth":422,"text":361},{"id":416,"depth":425,"text":417},[437],"ministack","2021-04-25","md",null,{},true,"\u002Farticles\u002Fvps-ssh-first",{"title":5,"description":5},"articles\u002Fvps-ssh-first",[447,448,449],"security","infrastructure","network","_mix\u002Fcyber-security-3400657_640.jpg","0p7STSITYfCR0ETcCcYcMeNhmXEtc_cRA-W1MKHcN_8",1780987148757]