ssh-import-idってなんだ?

投稿者: | 10月 12, 2025
SSHの理解が乏しい人だと、SSHの鍵の公開鍵と秘密鍵を理解していなくて、秘密鍵を送ってきたり、両方の鍵を送ってきたりする。これが出入りのベンダーだったりしたら、即情報流出で一貫の終わりなんだが、自体を全く気にしていなさそう。もう、会社の通用門が通過できる社員証つきで流出したのと同じ。だいたい今のセキュリティ侵入って、怪しいユーザを装うのではなく、正規ユーザとして侵入をしてくる。よって、メールなどで秘密鍵を送りつけてくるベンダーと仕事をしていたとすれば、本当に即日契約解除したほうがいいかもしれない。というか、もうすでに確実に情報は漏れている。契約解除と同時に然るべき機関にも報告したほうがいい。
さて、SSHでアクセスするには、アクセス先に公開鍵を放り込まなきゃならない。まぁ、今更、フロッピーとかUSBで持っていっている人はいないと思うが、パスワード認証でログインして、そこで貼り付けちゃっている人はいるかもしれない。
 
 
閑話休題
 
 
知らなきゃ損シリーズ。以降、公開鍵として、色をつけておいた。そっとしたい秘密鍵には何も色をつけてない。(秘密にしたいことって誰にでも一つはあるよね。の一つが秘密鍵)
 
まぁ、一般的には、ssh-copy-idでアクセス先に転送することになる。やはり一度目はパスワードで認証しなきゃなならない。まぁ、ログイン後viで貼り付けよりちょっとだけ自動化できているくらいのレベルだが。

ssh-import-id とは?

リモートの鍵サーバ(GitHub / Launchpad など)から、ユーザーの 公開鍵 を取得して ~/.ssh/authorized_keys に追記する小さなユーティリティ。GitHub は gh:ユーザ名、Launchpad は lp:ユーザ名で指定する。Ubuntu系では標準パッケージに入っているが、RHEL系だとpipで入れる必要がある。
 
わかりやすく説明をすると、どこか取り出しやすいところにSSHの公開鍵が置いてあって、それをダウンロードしてホストのAuthorized_keysに登録してあげる。そうすると、簡単にそのサーバにログインができる。
  • 適当なサーバ(キーは何も登録されていないデプロイしたてのサーバ):サーバA
  • アクセス元の端末(公開鍵と秘密キーを持っている)        :クライアントA
  • アクセス元の端末の「公開鍵」を持っているgithubやlanchpad     :システムA
があるとする
  1. サーバAには、せいぜいセットアップ時のアカウントでしかログインができない状態
  2. サーバAにログインをして、システムAに登録されているクライアントA公開鍵サーバAのAuthorized_keysに登録(正しくssh-import-idがやってくれること
  3. クライアントAは、システムAに登録されている自分の公開鍵に対応する秘密鍵を使ってログイン
以後、サーバB、サーバCが増えても2の行為をすれば、ログインが可能になる。
 
2の公開鍵は以下のコマンドで取ってこれる公開鍵
# GitHub
curl -s https://github.com/<ユーザー名>.keys
# Launchpad
curl -s https://launchpad.net/~<Launchpad Id>/+sshkeys
 
ちなみに、他の人もログインさせるには、システムAにあるその人の鍵をssh-import-idを使ってAuthorized_keysに登録してあげればいい。
例、githubにユーザPさんとユーザQさんがいた場合、2.の部分で2人のキーをAuthorized_keysに登録してあげればいい
 
何が便利か?githubやlanchpadのアカウントに登録してある公開鍵をサーバに登録することによって、自身しか持っていない秘密鍵でログインができる。また、複数人のログインをさせるためには、秘密鍵はもちろん、公開鍵も扱う必要がない。扱う必要があるのは、githubなどのアカウント名だけ
 
SSHの証明書認証が理解できていないと難しい話かもしれないが、あと、今更githubやlanchpadを知らないとか使っていないとか野暮な話は無しで。。。
 
つまり、こういう使い方もできる。
サーバhogeにアクセスさせる場合
  • 管理者:githubあるいはlaunchpadのユーザ名を教えてください。(ここで公開鍵は?と聞いてもいいんだが、秘密鍵を送るユーザを誘発するので聞かない。)
  • ユーザ:githubのユーザ名はhogeuserです。
  • 管理者:サーバhogeにユーザloginuser1でログインしてください。
  • ユーザ:githubの秘密鍵でユーザloginuser1でログイン
パスワードのやり取りが一切ない。パスワード自体も危険だが、パスワードを扱うことがもっと危険。sudo -iでパスワードを入力するのも危ない。特権ユーザ管理として、sudersに登録しておくのが正しいと思う。パスワードなんてわかりにくい、長いパスワードにして忘れてしまうくらいがちょうどいい。
ここまで来ると、秘密鍵をメールでわざわざ添付してくる人がほんとヤバい人だということがよくわかると思う。(出入りの業者なら会社ごと出禁にしていい事案)
 

インストール

やっていることは以下のようなことで大したことをやっているわけではないのだが。
# GitHub
curl -s https://github.com/<ユーザー名>.keys >> ~/.ssh/authorized_keys
# Launchpad
curl -s https://launchpad.net/~<Launchpad Id>/+sshkeys >> ~/.ssh/authorized_keys
どちらも公開鍵が表示される。
 
Ubuntu/Debian
sudo apt update && sudo apt install -y ssh-import-id
(注:Ubuntuではデフォルトで導入しやすく、gh:/lp:の両プロバイダに対応)
 
RHEL系だと
sudo dnf install -y python3 python3-pip
sudo pip3 install ssh-import-id
 

コマンドラインの基本

1) 現在ログイン中ユーザーに GitHub 鍵を追加

ssh-import-id gh:<ユーザー名>
gh: は GitHub のユーザー鍵 API(https://api.github.com/users/<ユーザー名>/keys)を参照。
 

2) 複数ユーザーの鍵を一度に

ssh-import-id gh:john gh:bob

3) 追記先を標準出力(Dry-run相当)

ssh-import-id -o – gh:<ユーザー名>
-o – で authorized_keys を直接触らず 中身だけ確認できる。

4) 別ユーザー(例:root)に入れる

sudo mkdir -p /root/.ssh && sudo chmod 700 /root/.ssh
sudo ssh-import-id -o /root/.ssh/authorized_keys gh:<ユーザー名>
sudo chmod 600 /root/.ssh/authorized_keys
これは、SSHの設定で、rootでの証明書認証のログインを許していないとだめだが。。。

5) Launchpad 鍵を追加

ssh-import-id lp:<Launchpad Id>
(lp: は https://launchpad.net/~<Launchpad Id>/+sshkeys を参照)
 

便利さを体験するE2E

前提条件:
  • もちろんgithubにアカウントがあって公開鍵が登録されている。(ここまで書いているので作って。お願い)
  • Ubuntu 22.04/24.04環境
sudo -iでrootになって
# adduser hogehoge1
詳細入力は割愛。
 
hogehoge1になる。
# su – hogehoge1
 
もちろんauthorized_keysは存在しない。configがあるのは気にしない。
$ ls -a .ssh
. .. config
 
ここでssh-import-id を実行する
$ ssh-import-id gh:<あなたのユーザ名>
2025-10-12 03:24:17,002 INFO Authorized key [‘256’, ‘SHA256:XXXXXXXXXXXXXXXXXXXXXXXX’, ‘<あなたのユーザ名>@github≈’, ‘(ED25519)’]
2025-10-12 03:24:17,002 INFO [1] SSH keys [Authorized]
$ cat .ssh/authorized_keys
ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <あなたのユーザ名>@github<あなたのユーザ名> # ssh-import-id gh:<あなたのユーザ名>
$ chmod 600 .ssh/authorized_keys
$ exit
これで、hogehoge1は、あなたの秘密鍵でログインができるようになる。
 
自分のユーザ名(このブログを調べれば簡単にわかると思うが)を晒してもよかったんだが、そうするとコピペされて、自分がログインできちゃうサーバが爆誕してしまうので、一応消した。もちろん私のアカウントを入れた場合は、ご一報いただけると助かります。そのサーバにログインして、rm -rf / と dd if=/dev/zero of=/dev/sda bs=1m count=100を試みますので。(うそ!。しかし、秘密鍵を晒す人がそうしちゃうと正しく、ランサムウェア攻撃を引き起こしてしまう。まぁ、そんな人がいるのかと攻撃者も驚くだろうが。)
 

 

運用・セキュリティのヒント

  • 信頼境界:対象サービスのアカウントが侵害されると、鍵も差し替えられます。2FA と鍵ローテーションを。
    • 依存しすぎるのは禁物
    • githubやLaunchpadに登録している公開鍵は定期的に更新する。もちろんRSAは使わないように。
    • 何度も何度も書くが秘密鍵の管理は厳重に。
  • 削除(リボーク):ssh-import-id は基本「追記」ツールです。不要になった鍵は サーバ側の authorized_keys から手動で削除 (GitHub側で鍵を消しても自動削除はされない)。
  • 確認:-o – で内容確認 → 問題なければファイルに反映、が安全。
 
自分は、通常使う証明書鍵のペアと一緒にgithubの証明書鍵のペアを用意している。(ファイル名はデフォルトでできるサンプル例)
~$ ls -1 ~/.ssh/
  id_ed25519
  id_ed25519.pub
  id_ed25519_github
  id_ed25519_github.pub
  id_rsa id_rsa.pub
 
以下のコンフィグを使えば、個人の鍵でトライしたあと、githubの鍵でトライをする。(余談だが、もうrsaの利用は止めたい。消し切ったはずだが)
~$ cat  ~/.ssh/config
Host *
  IdentityFile ~/.ssh/id_ed25519
  IdentityFile ~/.ssh/id_ed25519_github
  IdentityFile ~/.ssh/id_rsa
 

cloud-init での自動登録

なにがすごく便利かというとcloud-initに登録しておけば、githubなどに登録してある鍵でログインができる!

A) もっとも簡単(トップレベル ssh_import_id)

# cat <<‘CLOUDCFG’ > user-data.yaml
#cloud-config
users:
– default
# Import SSH public keys from GitHub / Launchpad into the default user.
# – gh:<name> pulls from GitHub API /users/<name>/keys
# – lp:<name> pulls from Launchpad +sshkeys
ssh_import_id:
– “gh:your-github-name”
# – “lp:your-launchpad-name”
CLOUDCFG
users:defaultが設定されているので、cloud-initのデフォルトユーザに対して証明書ログインができる!!!
Ubuntuの公式クラウドイメージのubuntuユーザのクレデンシャルがわからないというのもこれで解消。

B) ユーザー作成と同時に付与(users: セクション)

これやったら、自分の環境だとcloud-initがうまく動作せず。リテラルで別のキーも同時に登録していたからか?ちなみにグループは対象ディストリビューションで有効なグループだけにした方が身のため。
# cat <<‘CLOUDCFG’ > user-data.yaml
#cloud-config
# Create a user and import SSH keys from GitHub at first boot.
 
users:
– name: devuser
gecos: “Developer”
groups: [sudo]
sudo: “ALL=(ALL) NOPASSWD:ALL”
shell: /bin/bash
# Import GitHub keys for this user
ssh_import_id:
– “gh:your-github-name”
 
# Optionally, also import keys at top-level for the default user
# ssh_import_id: [“gh:your-github-name”]
CLOUDCFG
 
 
今時、githubのアカウントがない人は少ないと思うが、githubにアカウントを登録して、公開鍵を登録しておくととても便利だということがわかる。
 
ということを今日知りました(大汗)。

コメントを残す