2023年9月23日

Ubuntu20.04 SSH接続環境の構築

宮島の弥山山頂付近から青い海
宮島の弥山山頂付近から青い海


みなさん,こんにちは。

IoT実験のためにサーバをレンタルして,ある程度構築した後,再度,Ubuntuデスクトップ版イメージファイルのインストールを行ってしまい,全ての作業が初期化されてしまいました。

そのため,データ修復に時間をとられていました。

皆さんも,プロバイダーが用意している再インストールイメージファイルをインストールする時は,全てを初期に戻すものとご注意ください。

そのあと,今度は夏風邪をひいた様でなかなか治らず寝込んでしまい,本当に散々な2023年の夏でした。

SSH接続環境の構築(Ubuntu版)

さて,前回,小規模事業者のためのサーバ構築について,VPSサーバを例に導入事例を申し上げましたが,今後は,もう少し具体的なサーバ構築ステップについて記述していきます。

具体的な構築ステップは,インターネットをググれば天才エンジニアの皆さんがいろいろと教えてくれるので,ポイント的なところだけ記述します。

それでは学習を始めます。


  第一ステップ(TeraTermのログイン)

まず,第一ステップとして,クラウドサーバ(VPSの場合)を購入した後は,サービスプロバイダの指示に従って,OSをインストールすることになります。

Ubuntu linuxであれば「root権限」へのアクセスのため,パスワードの指定や「パスフレーズ」を指定した「公開鍵暗号方式」の秘密鍵を貰えるので,これを大切に保管します。

次に,サーバへログインするための手段を構築します。

最初は,「root権限」でログインしてもいいのですが,クラウドサーバは,外部インターネットに晒されますので,いつまでもroot権限でログインできるようにしておくのは,セキュリティ上問題があります。

特に,サーバroot権限へのパスワードによるログインはセキュリティ上危ないので,早い段階でパスワードログインできないようにします。

「公開鍵暗号」でのログインであれば,秘密鍵を持つのは自分だけですので,当面はこれを利用します。しかし,これも将来的にはログイン出来なくする方がいいかもしれません。

それでは,将来的にどうするかというと,ユーザIDを新たに登録して,それに特権(スーパーユーザ)を与えて,必要時に「root権限」に戻れるようにするという事です。

私はクラウドサーバへのログインソフトとしては,「TeraTerm」を利用することにしました。「TeraTerm」をインストール後,起動します。

TeraTermの「新しい接続」画面のホスト欄にクラウドサーバ(VPSの場合)のIPアドレスまたはドメイン名を入力します。

TCP/IP プロトコル
 〇ホスト(T)欄はXXX.XXX.XXX.XXX,TCPポート(P)は22,SSHで接続します。

サーバへ暗号接続するので「OK」を押します。XXX.XXX.XXX.XXXはIPアドレスでもドメイン名称でもOKです。

なお,ドメインはサーバとドメインを紐づけた後でないと入力できないのでご注意ください。

初めて接続する場合は、「セキュリティ警告」ウィンドウが表示されますが,「known hostsリストファイル」を追加する行為なので,「このホストをknown hostsリストに追加する」を選択して「続行ボタン」を押します。

次からは「セキュリティ警告」画面は出なくなります。

続いてSSH認証の画面が開くので,

  • ユーザ名称に「root」
  • パスフレーズを入力後,
「RSA/DSA/ECDSA/ED25519鍵を使う」をクリックして,秘密鍵入力欄にサーバ構築時に貰った秘密鍵を設定して,「OK」ボタンを押すとログインできます。


サーバプロバイダによって多少やり方が異なるので,詳しくは,各サーバプロバイダの説明を見て頂ければと思います。

サーバ会社の一例として,「Xサーバ」のSSH設定資料をご覧ください。

SSH接続手順(Xサーバの例)

サービスプロバイダによるサーバOS構築時に公開鍵暗号方式を採択せず,パスワードだけを選択した場合は,認証方式が「プレインパスワードを使う」になりますが,root権限ログインをパスワードにすると危険性が増しますので,なるべく公開鍵暗号方式をお勧めします。


  第二ステップ(ユーザID登録)

SSH接続でサーバにroot権限でログイン出来たと思います。現在は,rootディレクトリ「#表示」の下にあると思いますので,今度はユーザIDを追加します。


コード

adduser ユーザ名


#はスーパーユーザ権限で動作していることを意味します。そこに「adduser」コマンドを入力することで,任意のユーザ名を追加することが出来ます。このコマンドアウトプットの途中で,パスワードの入力を要求されますので忘れずにメモしておきます。また,このコマンドによって「/home」下にユーザ名のホームディレクトリが作成されます。

参考に,「adduser」コマンドを打った時の展開例を以下に示します。


コード

# adduser user_name
Adding user `user_name' ...
Adding new group `user_name' (1001) ...
Adding new user `user_name' (1001) with group `user_name' ...
Creating home directory `/home/user_name' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:  # パスワード入力
Retype new UNIX password: # パスワード入力(確認)
passwd: password updated successfully
Changing the user information for user_name
Enter the new value, or press ENTER for the default
        Full Name []:    # Enter連打でよい
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] Y  # Yes
# 終了


これでユーザIDが登録できましたが,このユーザIDに特権を与える必要があります。これは次のコマンドを打つことで「sudo」権限(sudo suと打てば#になれる)が付与されます。


コード

gpasswd -a ユーザ名 sudo


以下に展開例を示します。


コード

# gpasswd -a user_name sudo
Adding user user_name to group sudo
#


(注)CentOSなどRedHat系のLinuxでは別のコマンドで、sudoersというファイルを編集します。/etc/sudoersファイルの中に,追加されたユーザの利用できるコマンド権限が指定されています。

sudoersのFileフォーマット例】
 ユーザ ホスト=(RunAs) コマンド [, (RunAs) コマンド, ...]
 【例】ユーザ ALL=(ALL) ALL など

【参考】以下にその他のコマンド例を記載します。
 【①不要なユーザを削除する場合】特権命令

 # userdel -r user_name
    user_nameを削除します。-r (--remove)でユーザディレクトリも消します。

 【②ユーザの一覧を確認する場合】

 $ cat /etc/passwd
 Ubuntuで作成済みのユーザ一覧を確認するコマンドです。
 $ getent passwd でも同じです。

 【③グループと所属ユーザの一覧を表示する】

 $ cat /etc/group
 Ubuntuで作成済みのグループ一覧を確認するコマンドです。
 $ getent group でも同じです

 【④ユーザが所属するグループを確認する場合】

 $ groups user_name
 user_nameのグループ一覧を確認するコマンドです。
 user_nameを省略しても同じです

 【⑤ユーザをあるグループに追加する場合】特権命令

 # gpasswd -a user_name group_name
 Ubuntuuser_nameというユーザをgroup_nameというグループに追加します。
 # usermod -aG group_name user_name でも同じです

【⑥gpasswdについて補足】特権命令

 このコマンドには,いろんなオプション引数がある。
 # gpasswd -h
  Options:
    -a, --add USER add USER to GROUP
    -d, --delete USER remove USER from GROUP
    -h, --help display this help message and exit
    -Q, --root CHROOT_DIR directory to chroot into
    -r, --remove-password remove the GROUP's password
    -R, --restrict restrict access to GROUP to its members
    -M, --members USER,... set the list of members of GROUP
    -A, --administrators ADMIN,...


 【⑦その他のコマンド例】

 $ who       //自分情報の確認
 $ whoami    //自分のユーザ名の確認

以上によりユーザIDでログインし「sudo」コマンドで特権を得られるようになりました。

次に,TeraTermからユーザIDでログインするように再度トライします。


  第三ステップ(Rootパスワードログインの停止)

続いて,/etc/ssh/sshd_configの中のRootログインでパスワード利用を禁止します。公開鍵暗号によるRootログインを除き,ユーザIDしかログインできなくなります。

下記の項目が以下のようになっているかを確認します。修正する場合は,sshd_confファイルのバックアップを取ってから行ってください。

PermitRootLogin prohibit-password ・・・公開鍵のみ可能 
   ・厳格に禁止する場合は,PermitRootLogin no とします。
 ・参考に全て許可する場合は,PermitRootLogin yes とします。
PasswordAuthentication yes
 ・パスワードをユーザIDも含め禁止する場合はPasswordAuthentication noとします。

なお,「PermitRootLogin no」を行うと「root」にログインできなくなりますので,ユーザIDから確実にログイン出来ることと,「sudo」コマンドで特権を得ることが出来ることを確認してからでないと行ってはいけません。ご注意ください。

「#表示」で,最後に以下のコマンドを入力すれば定義が有効になります。


コード

systemctl restart sshd.service


最終的には全て公開鍵暗号でユーザログイン出来るようにした方が安全性が高いと思います。そこで,参考にユーザIDのログインで公開鍵暗号を使う方法を考えます。

まず,TeraTermでユーザIDにパスワードログインします。その場合のホームディレクトリは「/home/ユーザID」で「$表示」になりますので,そのディレクトリ上で以下のコマンドを入力し,公開鍵の格納フォルダを作ります。(既にある場合は省略)


コード

mkdir .ssh


続いてファイル権限を調整します。


コード

sudo chmod 0700 .ssh


次に,ユーザIDの公開鍵暗号を作成します。


コード

ssh-keygen -t rsa

 

これにより,ホームディレクトリ下の「.ssh」フォルダ内に,秘密鍵「id_rsa」と公開鍵「id_rasa.pub」というファイルが作られます。

作成時,パスフレーズが要求されますが,Enterを押してパスフレーズ無しでもOKです。
次に公開鍵「id_rasa.pub」を「authorized_keys」というファイル名に変更します。

コード

mv id_rsa.pub authorized_keys


秘密鍵「id_rsa」は,TeraTermのSCP機能でパソコン側に移動して保管し,サーバ側の秘密鍵は削除します。これで,TeraTermで公開鍵によるユーザログインが可能になります。

TeraTermのSCP機能は,ファイル(F)タブから「SSH SCP」アイコンで利用できます。
「authorized_keys」ファイルの権限は,次のコマンドで調整してください。

コード

chmod 0644 authorized_keys


以上で,ユーザIDへのログインに公開鍵暗号が使えるようになったと思いますので,TeraTermを再起動して確認します。

【TeraTerm4バージョンの注意点】

最近のLinux OSバージョンでは,SSHのRSA暗号化においてRSA-SHA2暗号アルゴリズムを使う場合が増えています。TeraTerm4バージョンは,RSA-SHA暗号アルゴリズムしか使えませんので,公開鍵暗号では認証出来ない場合があります。

その場合はTeraTerm5バージョンを利用するか,暗号化方式をRSA暗号からECDSAなどの暗号方式に変えてください。以下にECDSA-512を利用した場合の暗号鍵の生成コマンドを示します。


コード

ssh-keygen -t ecdsa -b 512


  第四ステップ(Rootパスワードログインの停止確認)

最後に,ログインできる状態を確認します。現状は,root権限でのログインは,公開鍵がないと出来ません。また,ユーザIDへのログインは,公開鍵,パスワード共にできる状態です。

セキュリティポリシーによりますが,root権限でのログインを全て禁止するのであれば,先ほどの「/etc/ssh/sshd_config」ファイルのPermitRootLoginを「no」にします。

また,パスワードログインを全て禁止するのであれば,先ほどの「/etc/ssh/sshd_config」ファイルのPasswordAuthenticationを「no」にします。

但し,これらを設定するとユーザIDの公開鍵によるログイン以外は,受け付けなくなりますので秘密鍵の管理にご注意ください。

最後に,root権限でのパスワードが有る場合,サーバ(IPアドレス:XXX.YYY.ZZZ.AAA)に対しSSHを使ってパスワードでrootログインができないことを確認します。ユーザIDにログインした状態「$表示」で以下のコマンドを入力してください。

コード

ssh root@XXX.YYY.ZZZ.AAA


パスワードの入力を要求されますが,「Permission denied, please try again.」や「Permission denied (publickey).」というアラートが表示されたらOKです。


  まとめ

以上で,SSH接続環境の構築ができました。これだけでもこんなに手間がかかります。

次は,「UbuntuにおけるUFW「Uncomplicated FireWal」の設定」ですが,長くなりますので次に回します。


(注意)なお,情報の正確性を期していますが,実施される場合には自己責任でお願いします。


0 件のコメント: