SSHでリモートのマシンを管理する!(鍵認証/sudoパスワードなし設定)

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の活用も容易な環境が整ったことになります。