SSHでリモートのマシンを管理するために、鍵認証とパスワード無しでsudo可能な設定を行う方法です。リモートのマシンを管理するのに、一つ一つパスワード入力するのを回避したり、シェルなどでパスワードをきかれずにリモートマシン上でコマンドを実行するのに使用します。以下では、「usradmin」というユーザについて、鍵認証とパスワード無しでsudoできる環境を整備します。
記事の目次
SSHの鍵を生成する!
鍵認証するための鍵をssh-keygenコマンドで生成します。「-C」オプションは、コメントで必須ではありませんが、鍵の用途が分かるようにしておきましょう。RSA、ECDSA、ED25519で使用できるように3種類用意することにしました。
$ mkdir ~/kms/ssh_usradmin $ chmod 600 ~/kms/ssh_usradmin $ cd ~/kms/ssh_usradmin $ ssh-keygen -t rsa -b 4096 -C "usradmin@server01" $ ssh-keygen -t ecdsa -b 521 -C "usradmin@server01" $ ssh-keygen -t ed25519 -C "usradmin@server01"
基本的には、ED25519を使用すると、セキュリティとパフォーマンスが両立できてよいと思います。鍵を生成するコマンドは、シェル化しておくとよいと思います。今回は、「make_ssh_keys.sh」として、再作成できるようにシェル化しておきました。
Gitの環境を構築する!
生成した鍵は、Gitで管理します。以下、Rocky Linuxでの例です。Gitのインストールから初期設定までを行います。
$ sudo dnf install git $ git --version git version 2.31.1 $ git config --global user.email "lab4ict@gmail.com" $ git config --global user.name "Lab4ict Webmaster" $ git init
Gitに鍵を登録する!
Gitに鍵を登録します。
$ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) id_ecdsa id_ecdsa.pub id_ed25519 id_ed25519.pub id_rsa id_rsa.pub make_ssh_keys.sh nothing added to commit but untracked files present (use "git add" to track) $ git add * $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: id_ecdsa new file: id_ecdsa.pub new file: id_ed25519 new file: id_ed25519.pub new file: id_rsa new file: id_rsa.pub new file: make_ssh_keys.sh $ git commit -m "First Version" [master (root-commit) e5fa67f] First Version 7 files changed, 76 insertions(+) create mode 100644 id_ecdsa create mode 100644 id_ecdsa.pub create mode 100644 id_ed25519 create mode 100644 id_ed25519.pub create mode 100644 id_rsa create mode 100644 id_rsa.pub create mode 100755 make_ssh_keys.sh $ git status On branch master nothing to commit, working tree clean $ git ls-files id_ecdsa id_ecdsa.pub id_ed25519 id_ed25519.pub id_rsa id_rsa.pub make_ssh_keys.sh
リモートリポジトリに鍵を登録する!
鍵を本格的に管理する場合は、リモートリポジトリに登録するとよいと思います。以下は、GitLabに作成済みのプロジェクトに登録する例です。
$ git remote add origin http://gitlab.lab4ict.local/key-management/ssh_usradmin.git $ git branch -M main $ git push -uf origin main Username for 'http://gitlab.lab4ict.local': root Password for 'http://root@gitlab.lab4ict.local': Enumerating objects: 9, done. Counting objects: 100% (9/9), done. Compressing objects: 100% (9/9), done. Writing objects: 100% (9/9), 4.32 KiB | 2.16 MiB/s, done. Total 9 (delta 0), reused 0 (delta 0), pack-reused 0 To http://gitlab.lab4ict.local/key-management/ssh_usradmin.git + 640a1f5...e5fa67f main -> main (forced update) Branch 'main' set up to track remote branch 'main' from 'origin'.
ログインされる側に公開鍵を配置する!
ログインされる側のマシンのユーザに公開鍵を配置します。まず、公開鍵を配置するディレクトリを作成します。
$ mkdir -p ~/.ssh $ chmod 600 ~/.ssh ls -ld ~/.ssh drwx------. 2 usradmin usradmin 48 Dec 5 08:24 /home/usradmin/.ssh
authorized_keysファイルに接続するユーザの公開鍵を登録します。以下h、/tmpに作成した公開鍵を転送した想定で、authorized_keysに公開鍵を登録する例です。
$ cat /tmp/id_ed25519.pub >> /home/usradmin/.ssh/authorized_keys
※作成済みの「authorized_keys」を配布する手順でもよいと思います。
ログインする側に秘密鍵を配置する!
ログインする側マシンのユーザに秘密鍵を配置します。
$ ls -l ~/.ssh/id_ed25519 -rw-------. 1 usradmin usradmin 419 Dec 6 2022 /home/usradmin/.ssh/id_ed25519
パスワード無しでログインできるか確認する!
ここまでで、パスワード無しでログインできるようになります。
$ ssh vmsglb01 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 7 18:46:31 2022 from 10.1.1.1 $
パスワード無しでsudoできるように設定する!
visudoコマンドで、/etc/sudoersファイルに以下を追記します。
usradmin ALL=(ALL:ALL) NOPASSWD:ALL
おわりに
SSHでパスワード無しでログインとsudoができるようになれば、リモートからかなり楽に管理作業を行うことができるようになります。シェルスクリプトによる自動化やAnsibleの活用も容易な環境が整ったことになります。