VMware Fusion(M1 Mac)にUbuntu 22.04.3 LTSをインストール

VMware Fusion にUbuntu Server をインストールする手順の解説です。

VMware Fusion のインストールは「M1 MacにVMware Fusionをインストール」をご参照ください。

環境

  • MacBook Pro / M1 Pro チップ (Apple Silicon)
  • macOS Monterey (12.6.7)
  • VMware Fusion Player (13.5.0)
  • Ubuntu Server (22.04.3 LTS) – Apple Silicon (ARM64)

Ubuntu Serverのダウンロード

Ubuntu のサイトのダウンロードページにアクセスします。

下にスクロールします。
(”Alternative architectures” のクリックでもよいです)

Alternative architecturesUbuntu Server for ARM のリンク”Get Ubuntu Server for ARM” をクリックします。

緑のボタン”Download Ubuntu 22.04.3 LTS” をクリックしてISOファイルをダウンロードします。

ARM64 向けのイメージファイル ubuntu-22.04.3-live-server-arm64.iso がダウンロードされました。

ダウンロードしたファイルに破損などがないか、チェックサムを確認します。

ARM64 向けのチェックサムは、ダウンロードしたファイルの検証方法が記載されたチュートリアル(以下のリンク)から辿ったページにありました。

辿る順番は、3. Download checksums and signatures の本文中のURL(http://releases.ubuntu.com) > Ports, Unsupported, and Experimental Images for Ubuntu > 22.04.3/ > release/ の順で以下のページが表示されます。

下にスクロールすると、チェックサムSHA256SUM のリンクがあります。

SHA256SUMS” をクリックすると複数のチェックサムがプレーンテキストで表示されました。

ARM64 向けイメージファイルのチェックサムは1行目にありました。

5702372d25111e24d59596de62ae24daef873018cbf63c9dd9ff12292a57aca9 *ubuntu-22.04.3-live-server-arm64.iso

このプレーンテキストのページはチェックサムの検証で使える形式になっているので、イメージファイルと同じ場所に保存します。

ターミナルで保存したフォルダにcd してから、下記コマンドを実行して検証します。

% shasum -c SHA256SUMS
ubuntu-22.04.3-live-server-arm64.iso: OK

2行目のようにOK と表示されていれば問題なしです。

Ubuntu Serverのインストール

1. VMware Fusion を起動

VMware Fusion アイコン

Launchpad のVMware Fusion アイコンをダブルクリックします。

2. 新しい仮想マシンの作成

VMware Fusion のウィンドウが表示されました。

左上の[+] をクリックして表示されるメニューの中から[新規…] をクリックします。

ディスクまたはイメージからインストール” の枠内に、ダウンロードしたISO ファイルをドラッグ&ドロップします。

インストールディスクとしてドラッグ&ドロップしたISO ファイルのファイル名が表示され選択されているので、[続ける] をクリックします。

仮想マシンの概要が表示されています。
今回はこの構成のままでよいので[終了] をクリックします。

ここで、仮想マシンをファイルで保存するため、ファイル名の入力を求められます。

任意のファイル名を入力して[保存] をクリックします。

3. 仮想マシンの起動

作成した仮想マシンのウィンドウが既に開いています。

大きい再生ボタンをクリックすると、Ubuntu ServerISO ファイルを使ったインストールが開始します。

ブートローダーが起動しました。

Try or Install Ubuntu Server” を選択してEnter キーを押下します。

  • Enter せずに放置すると、ハイライトされているエントリで処理が開始されます
  • キーボードとマウス操作がゲストOS 側(仮想マシン内)にある状態になるので、ホストOS 側(macOS)に戻したい場合は[control]+[command] を押下します

4. 言語 – select your language

インストーラとインストールするOS のデフォルトの言語を選択します。

English” を選択してEnter キーを押下します。

5. インストーラの更新 – Installer update available

最新版のインストーラーに更新するか選択します。

今回は更新するので、下の[Update to the new installer] を選択してEnter キーを押下します。

6. キーボード – Keyboard configuration

使用している環境に合わせたキーボードを選択します。

今回は”Japanese” を選択します。
Layout で”Japanese” を選択すると、Variant も”Japanese” に変わりました。
下の[Done] を選択してEnter キーを押下します。

7. インストールの種類 – Choose type of install

インストールの種類を選択します。

今回は”Ubuntu Server” を選択して、[Done] でEnter キーを押下します。

  • Ubuntu Server
    • デフォルトの構成。快適に使えるよう厳選されたパッケージが含まれている
  • Ubuntu Server (minimized)
    • 最小の構成

8. ネットワーク – Network connections

ネットワークの設定をします。

VMware 上のDHCP により割り当てられたIPv4 アドレスが表示されています。
今回はこのままの状態で[Done] でEnter キーを押下します。

9. プロキシサーバ – Configure proxy

プロキシサーバの設定をします。

今回はプロキシサーバを設定しないので、このままの状態で[Done] でEnter キーを押下します。

10. ミラーサーバの設定 – Configure Ubuntu archive mirror

Ubuntu のミラーサーバの設定をします。

GeoIP で取得した位置情報を使って選ばれたミラーサーバが自動で入力されています。
今回はこのままの状態で[Done] でEnter キーを押下します。

11. ストレージ – Storage configuration

ストレージの設定をします。

今回は記憶領域全体を使うので、”Use an entire disk” が選択された状態で[Done] でEnter キーを押下します。

  • LVM (論理ボリューム) を設定しない場合は、”Set up this disk as an LVM group” のチェックをOFF にします

ディスクのパーティショニングの設定をします。

パーティションのデフォルトの構成が表示されています。
今回はこのままの状態で[Done] でEnter キーを押下します。

12. インストール実行の確認 – Confirmation destructive action

インストール作業の続行でフォーマットされるのでデータが削除されてもよいのかの確認です。

[Continue] を選択してEnter キーを押下します。

13. プロファイル – Profile setup

sudo が利用できるadministrator 権限のユーザーを作成します。

  • Your name
    • フルネームなど (任意)
  • Your servers name
    • ホスト名 (hostname)
  • Pick a username
    • ログイン時にユーザーの識別子として入力するユーザー名
  • Choose a password / Confirm your password
    • ユーザーのパスワード

任意の値を入力して、[Done] でEnter キーを押下します。

14. アップグレード – Upgrade to Ubuntu Pro

Ubuntu Pro にアップグレードするかの確認です。

今回はアップグレードしないので、”Skip for now” が選択された状態で[Continue] でEnter キーを押下します。

15. SSHサーバ – SSH Setup

OpenSSH サーバの設定をします。

今回はOpenSSH サーバをインストールするので、”Install SSH server” のチェックをON にして、[Done] でEnter キーを押下します。

  • “Import SSH identity” で、プロファイルの設定で作成したユーザーのSSH 公開鍵認証に使う公開鍵をGitHub やLaunchpad から取得して登録することができるようです(今回はやりませんでした)

16. Snapパッケージ – Featured Server Snaps

追加するパッケージを選択します。

今回は追加しないので、何も選択しないで[Done] でEnter キーを押下します。

ここで、Ubuntu Server のインストールが開始されます。
インストールが完了するまで、そのまま待機します。

17. インストール完了 – Install Complete!

“Install complete!” と表示され、下に[Reboot Now] のボタンが表示されたらインストール完了です。

続けて、Ubuntu Server をインストールした仮想マシンを起動します。
[Reboot Now] を選択してEnter キーを押下します。

18. Ubuntu Server 起動・ログイン

Ubuntu Server の仮想マシンが起動します。

“Failed unmounting /cdrom” と表示されました。インストールメディアのマウント解除に失敗したようです。
とりあえずEnter キーを押下します。

“ubuntu login:” と表示されましたが、続けてログが表示されてしまいました。SSH ホスト鍵の情報があるので、初回起動時のみ表示される内容のようです。

この状態でEnter キーを押下します。

末尾に”ubuntu login:” が表示されるので、登録したユーザー名を入力しEnter キーを押下し、続けて”Password:” と表示されたらパスワードを入力してEnter キーを押下します。

Ubuntu のプロンプトの入力ができる状態になりました。ログイン成功です。

正常にインストールできているようです。

インストール直後の状態の確認

ターミナルで確認します。

$ uname -a
Linux ubuntu 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:29:11 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

$ cat /etc/default/locale
LANG=en_US.UTF-8

$ cat /etc/timezone
Etc/UTC

$ cat /etc/default/keyboard
XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"

$ hostname
ubuntu

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:7b:b2:4c brd ff:ff:ff:ff:ff:ff
    altname enp2s0
    inet 192.168.156.134/24 metric 100 brd 192.168.156.255 scope global dynamic ens160
       valid_lft 1636sec preferred_lft 1636sec
    inet6 fe80::20c:29ff:fe7b:b24c/64 scope link
       valid_lft forever preferred_lft forever

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=13.2 ms

$ cat /etc/passwd | grep ubuntu
ubuntu:x:1000:1000:ubuntu:/home/ubuntu:/bin/bash

初期設定

タイムゾーン

UTC から日本のタイムゾーンに変更します。

$ cat /etc/timezone
Etc/UTC

$ timedatectl list-timezones | grep Tokyo
Asia/Tokyo

$ sudo timedatectl set-timezone Asia/Tokyo

$ cat /etc/timezone
Asia/Tokyo

ネットワーク:ホスト名

インストール時に仮で登録していたホスト名を変更します。

$ hostname
ubuntu

$ sudo hostnamectl set-hostname d.test

$ hostname
d.test

ネットワーク:IP アドレス (IPv4)

ホストOS 側の設定ファイルでDHCP で固定アドレスが割り当てられるようにします。

ホストOS 側の作業をする為に、ゲストOS をシャットアウトします。

$ sudo shutdown -h now

ここから、ホストOS 側の作業です。

DHCP サーバの割り当て範囲を確認すると、192.168.156.128 〜 192.168.156.254 でした。

% cat /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
 〜 省略 〜
subnet 192.168.156.0 netmask 255.255.255.0 {
	range 192.168.156.128 192.168.156.254;
 〜 省略 〜

ゲストOS に192.168.156.135 が割れ当てられるよう設定します。
MAC アドレスはip a で確認したアドレスを指定します。

% sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
 〜 省略 〜
####### VMNET DHCP Configuration. End of "DO NOT MODIFY SECTION" #######
 〜 末尾に下記の4行を追記する 〜
host d.test {
    hardware ethernet 00:0c:29:7b:b2:4c;
    fixed-address  192.168.156.135;
}

VMware Fusionのネットワークサービスを再起動します。

% cd /Applications/VMware\ Fusion.app/Contents/Library/

% sudo ./vmnet-cli --stop
Stopped DHCP service on vmnet1
Stopped DHCP service on vmnet8
Stopped NAT service on vmnet8
Stopped all configured services on all networks

% sudo ./vmnet-cli --start
Enabled hostonly virtual adapter on vmnet1
Started DHCP service on vmnet1
Started NAT service on vmnet8
Enabled hostonly virtual adapter on vmnet8
Started DHCP service on vmnet8
Started all configured services on all networks

% sudo ./vmnet-cli --status
DHCP service on vmnet1 is running
Hostonly virtual adapter on vmnet1 is disabled
DHCP service on vmnet8 is running
NAT service on vmnet8 is running
Hostonly virtual adapter on vmnet8 is disabled
Some/All of the configured services are not running

hosts に登録してホストOS からドメイン名で名前解決されるようにします。

% sudo vi /etc/hosts
 〜 末尾に下記の1行を追記する 〜
192.168.156.135 d.test

ここで、ゲストOS を起動します。
設定したIP アドレスが割り当てられているか確認するため、ゲストOS でip a で確認すると、設定したアドレスが割り当てられていました。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:7b:b2:4c brd ff:ff:ff:ff:ff:ff
    altname enp2s0
    inet 192.168.156.135/24 metric 100 brd 192.168.156.255 scope global dynamic ens160
       valid_lft 1030sec preferred_lft 1030sec
    inet6 fe80::20c:29ff:fe7b:b24c/64 scope link
       valid_lft forever preferred_lft forever

SSH

SSH サーバの状態と、ゲストOS のローカル環境でSSH 接続できることを確認します。

$ systemctl is-enabled ssh
enabled

$ systemctl is-active ssh
active

$ ssh ubuntu@localhost

$ exit

ホストOS 側からSSH 接続できることを確認します。

% ssh [email protected]

% exit

ファイアウォール の状態を確認し、SSH 向けポート番号22 をアクセス許可する設定を登録します。
登録したらファイアウォールを有効にします。

$ sudo ufw status verbose
Status: inactive

$ sudo ufw app list
Available applications:
  OpenSSH

$ sudo ufw allow 'OpenSSH'
Rules updated
Rules updated (v6)

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)

ホストOS 側からSSH 接続できることを確認します。

ネットワーク:ソケット

接続待ちのソケットの状態を確認します。

$ ss -lnt
State       Recv-Q      Send-Q           Local Address:Port           Peer Address:Port     Process
LISTEN      0           4096             127.0.0.53%lo:53                  0.0.0.0:*
LISTEN      0           128                    0.0.0.0:22                  0.0.0.0:*
LISTEN      0           128                       [::]:22                     [::]:*

$ ss -lnu
State     Recv-Q     Send-Q                  Local Address:Port         Peer Address:Port    Process
UNCONN    0          0                       127.0.0.53%lo:53                0.0.0.0:*
UNCONN    0          0              192.168.156.135%ens160:68                0.0.0.0:*

パッケージの更新

最後にパッケージを最新に更新します。

$ sudo apt update

$ sudo apt upgrade

あとがき

一通りの作業が終わり、やり残した感があることを書いておきます。

  • Ubuntu Server、今度は最小構成でインストールしてみよう
  • SSH サーバの設定で公開鍵をGitHub から登録する手順をやってみたい
  • ファイアウォールを有効にした後、アクセス許可していないポートがきちんとアクセス拒否できているか確認する方法をきちんと整理できていない(telnet d.test 80、nmap -p 80 d.test)

参照

VMware Fusion(M1 Mac)にKali Linuxをインストール

VMware FusionKali Linux をインストールする手順の解説です。

前回の「M1 MacにVMware Fusionをインストール」の続きです。

環境

  • MacBook Pro / M1 Pro チップ (Apple Silicon)
  • macOS Monterey (12.6.6)
  • VMware Fusion Player (13.0.2)
  • Kali Linux (2023.2) – Apple Silicon (ARM64)

Kali Linux のダウンロード

Kali Linux のサイトのダウンロードページにアクセスします。

Kali Linux > download 1

左の”Installer Images” をクリックします。

  • Installer Images
    • インストーラーのイメージファイル(ISO ファイル
  • Virtual Machines
    • 仮想マシンのパッケージファイル(.vmwarevm ファイル)
    • こちらにはApple Silicon 対応版はありませんでした(2023.6.17時点)
Kali Linux > download 2

“Kali Linux 2023.2 Changelog” の”Apple Silicon (ARM64)” を選択し、Recommended となっている”Installer” をクリックしてISO ファイルをダウンロードします。

2023.6.17の時点ではkali-linux-2023.2a-installer-arm64.iso というファイルがダウンロードされました。

ダウンロードしたファイルに破損などがないか、チェックサムを確認します。

Kali Linux > download 3

“Installer” の枠内の”sum” をクリックするとSHA256 のチェックサムが表示されます。

% shasum -a 256 kali-linux-2023.2a-installer-arm64.iso
94ce3f6b81be33e2f80de157d69222efbfe6c404491b25292a8058a62096c594 kali-linux-2023.2a-installer-arm64.iso

ターミナルで上記コマンドを実行して出力された文字列と、画面に表示されているSHA256sum の文字列が一致しているか確認します。

Kali Linux のインストール

1. VMware Fusion を起動

VMware Fusion アイコン

Launchpad のVMware Fusion アイコンをダブルクリックします。

2. 新しい仮想マシンの作成

VMware Fusion のウィンドウが表示されました。

VMware Fusion 起動

左上の[+] をクリックして表示されるメニューの中から[新規…] をクリックします。

VMware Fusion > インストール方法を選択

ディスクまたはイメージからインストール” の枠内に、ダウンロードしたISO ファイルをドラッグ&ドロップします。

VMware Fusion > 新しい仮想マシンを作成

インストールディスクとしてドラッグ&ドロップしたISO ファイルのファイル名が表示され選択されているので、[続ける] をクリックします。

VMware Fusion > オペレーティングシステムの選択

Linx > Debian 12.x 64ビット ARM を選択し、[続ける] をクリックします。

VMware Fusion > 仮想マシンの構成が完了

仮想マシンの概要が表示されています。
今回は構成の一部を変えるので[設定のカスタマイズ] をクリックします。

ここで、仮想マシンをファイルで保存するため、ファイル名の入力を求められます。

VMware Fusion > 仮想マシンのファイル保存

任意のファイル名を入力して[保存] をクリックします。

今回は、インストールで使ったISO ファイルが後で分かるように、ISO ファイルのファイル名の一部をファイル名に指定しました。

  • ファイルの拡張子は .vmwarevm です
  • 保存先のデフォルトはユーザーの仮想マシン フォルダです

3. 仮想マシンの構成の設定変更

VMware Fusion > 仮想マシンの設定変更

仮想マシンの構成を設定するウィンドウが表示されました。
今回はメモリのサイズを増やすので、”プロセッサとメモリ” をクリックします。

VMware Fusion > 仮想マシンの設定変更(プロセッサとメモリ)

メモリを2048 MB から4096 MB に変更して、上の”すべてを表示” をクリックします。
元のウィンドウに戻るので、他の設定も必要に応じて変更し、すべての変更が終わったらウィンドウを閉じます。

4. 仮想マシンの起動

作成した仮想マシンのウィンドウが既に開いています。

VMware Fusion > 仮想マシンの起動

大きい再生ボタンをクリックすると、Kali LinuxISO ファイルを使ったインストールが開始します。

インストーラのウィザードが表示されました。

Kali Linux > インストール > Graphical install

ここでは、インストールするモードを選択します。

今回は、”Graphical install” を選択してEnter を押下します。

  • Install” を選択すると青黒画面のUI になるので、マウス操作したい場合は”Graphical install” の方がよさそうです
  • Graphical install” では、青黒ではないグラフィカルなUI 上で操作することができ、マウスの操作も可能です
  • この青黒の画面ではキーボードでの操作しかできないので、上下で選択してEnter 押下で確定します
  • キーボードとマウス操作がゲストOS 側(仮想マシン内)にある状態になるので、ホストOS 側(macOS)に戻したい場合は[control]+[command] を押下します

5. 言語を選択 – Select a language

インストール手順で表示される言語を選択します。ここで選択した言語はインストールするOS のデフォルト言語として設定されます。

Kali Linux > インストール > Select a language

今回は”English” を選択して[Continue] をクリックします。

選択肢に”Japanese – 日本語” もありますが、Kali Linuxに関する情報はウェブ上では英語の方が日本語よりも多く存在するので、調査や検索で都合の良い英語を選択しました。

6. 所在地を選択 – Select your location

タイムゾーンとして設定する場所を選択します。

Kali Linux > インストール > Select your location 1

今回は日本を設定するので、”other” を選択して[Continue] をクリックします。

Kali Linux > インストール > Select your location 2

Asia” を選択して[Continue] をクリックします。

Kali Linux > インストール > Select your location 3

Japan” を選択して[Continue] をクリックします。

7. ロケールを選択 – Configure locales

ロケールを選択します。

Kali Linux > インストール > Configure locales

United States – en_US.UTF-8” を選択して[Continue] をクリックします。

8. キーボードの設定 – Configure the keyboard

キーボードレイアウトを選択します。

Kali Linux > インストール > Configure the keyboard

日本語配列キーボードを使っているので”Japanese” を選択して[Continue] をクリックします。

英語配列はたぶん”American English” です。

9. ネットワークの設定 – Configure the network

仮想マシンのホスト名とドメイン名を設定します。

Kali Linux > インストール > Configure the network 1
Hostname:

まずはホスト名を入力します。
ホスト名はネットワーク上で仮想マシンを識別する名前として使われます。
任意の名前(今回は”m1-kali”)を入力し、[Continue] をクリックします。

Kali Linux > インストール > Configure the network 2
Domain name:

次はドメイン名を入力します。
ドメイン名はインターネット上の識別子となるドメイン名を指定します。
公開しないので何も入力せず[Continue] をクリックします。

10. ユーザとパスワードの設定 – Setup users and passwords

rootユーザの代わりに使うroot 権限のないユーザを作成します。
インストールしたKali Linux に初回ログインする際に使うユーザです。

Kali Linux > インストール > Set up users and passwords 1
Full name for the new user:

まずは、ユーザのフルネームを入力します。
フルネームはユーザの名称として画面に表示される際に使われます。
任意の名称(今回は”capybara”)を入力し、[Continue] をクリックします。

Kali Linux > インストール > Set up users and passwords 2
Username for your account:

次に、ユーザのユーザ名を入力します。
ユーザ名はログイン画面でパスワードと組み合わせて入力する際に使うものです。
先頭文字(半角英小文字)+ 2文字目以降(半角英小文字、数字)にする必要があります。
任意の名称(今回は”capybara”)を入力し、[Continue] をクリックします。

Kali Linux > インストール > Set up users and passwords 3

パスワードを2箇所に入力し、[Continue] をクリックします。

11. ディスクのパーティショニング – Partition disks

ディスクのパーティショニングを行います。

Kali Linux > インストール > Partition disks 1
Partitioning method:

パーティショニングは、案内に従って行う方法と、手動で行う方法を選択することができます。

  • Guided – use entire disk
  • Guided – use entire disk and set up LVM
  • Guided – use entire disk and set up encrypted LVM
  • Manual

今回は”Guided – use entire disk” を選択して[Continue] をクリックします。

Kali Linux > インストール > Partition disks 2
Select disk to partition:

パーティショニングするディスクを選択します。
/dev/nvme0n1 – 21.5GB VMware Virtual NVMe Disk” のみ表示され選択されているので、[Continue] をクリックします。

Kali Linux > インストール > Partition disks 3
Partitioning scheme:

パーティショニングのスキームを選択します。

  • All files in one partition
  • Separate /home partition
  • Separate /home, /var, and /tmp partitions

今回は、初心者に推奨となっている”All files in one partition” を選択して[Continue] をクリックします。

Kali Linux > インストール > Partition disks 4

これまで設定してきたパーティションとマウントポイントの概要が表示されます。
このまま進めるので、”Finish partitioning and write changes to disk” を選択して[Continue] をクリックします。

Kali Linux > インストール > Partition disks 5

ディスクに書き込んでよいか確認が求められています。
[Yes] を選択して[Continue] をクリックします。

12. ソフトウェアを選択 – Software selection

Kali Linux にインストールするソフトウェアを選択します。
デフォルトで標準的なデスクトップ環境とツール類が選択された状態になっている、とのことです。

Kali Linux > インストール > Software selection

今回はデフォルトの状態で[Continue] をクリックします。

Kali Linux のインストールが開始されます。
インストールが完了するまで、そのまま待機します。

13. インストール完了 – Finish the installation

Kali Linux > インストール > Finish the Installation

Kali Linux のインストールが完了しました。

続けて、Kali Linux をインストールした仮想マシンを起動します。
インストールメディアを外すように求められていますが、VMware が自動でやってくれるようなので、このまま[Continue] をクリックします。

14. Kali Linux 起動・ログイン

Kali Linux の仮想マシンが起動します。

Kali Linux > 起動

Kali Linux の起動画面が表示され、”Kali GNU/Linux” が選択されています。
そのままで数秒後に自動で進みますが、Enter を押下して進めることもできます。

Kali Linux > ログイン

ログイン画面が表示されるので、登録したユーザ名パスワードを入力して[Log in] をクリックします。

Kali Linux > デスクトップ

Kali Linux のデスクトップが表示されました。

とりあえず正常にインストールできているようです。

インストール直後の状態の確認

ターミナルで確認します。

$ cat /etc/default/locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"

$ cat /etc/timezone
Asia/Tokyo

$ cat /etc/default/keyboard
XKBMODEL="pc105"
XKBLAYOUT="jp"

$ cat /etc/hosts           
127.0.1.1       m1-kali

$ hostname
m1-kali

$ domainname -d


$ cat /etc/passwd | grep capybara
capybara:x:1000:1000:capybara,,,:/home/capybara:/usr/bin/zsh

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=13.7 ms

あとがき

OS の初期設定

インストールが完了したので、このあと以下のような作業をする予定です。(解説する予定なし)

  • パッケージの更新
    • sudo apt update
    • sudo apt upgrade
  • SSH Server の自動起動設定
  • 日本語のローマ字入力の設定

失敗談

最初、間違えて”Apple Silicon (ARM64)” のイメージファイルではなく、”Pre-built Virtual Machines” の方にあるVMware 向けの仮想マシンのパッケージファイルをダウンロードして、仮想マシンを作り起動するとStart PXE over IPv4 というエラーになり原因を調べても分からず時間を浪費するという状況に陥ってしまいました。

同じ状況に陥った人がStart PXE over IPv4 をキーワードで検索し、このページに辿り着いて早期解決ができたら幸いです。

VirtualBox(M1 Mac)にKali Linuxのインストールを試みた結果

VirtualBox のApple Silicon 対応は、VirtualBox 7.0.8 BETA (Developer preview for macOS / Arm64 (M1/M2) hosts) が2023.6.18時点で提供されていますが、”Apple Silicon (ARM64)” のイメージファイルを使ったインストールを試したところ失敗しました。(”Linux 2.6/3.x/4.x/5.x/(64-bit)”、”Debian 11 Bullseye(64-bit)”)

VirtualBox > Kali Linux > Installation failed
VirtualBox でKali Linux のISOファイルを起動するとすぐ表示されるメッセージ

参照

M1 MacにVMware Fusionをインストール

M1 Mac にVMware 社が提供するMac 用デスクトップ ハイパーバイザーのVMware Fusion をインストールする手順の解説です。

VMware Fusion について

VMware Fusion はVMware 社が提供するソフトウェアで、macOS にインストールすることで、macOS 上でWindows やLinux などのOS を仮想マシンとして起動させることができるようになります。

仮想化ソフトウェアは、ホスト型、ハイパーバイザ型、コンテナ型の3つに分類分けされますが、VMware Fusion はホストOS(macOS)上で動作し、その上で仮想マシンを作成・実行するのでホスト型に分類されます。

現在の最新のバージョンであるFusion 13 のシステム要件は以下のようになっています。

  • プロセッサ(Intel プロセッサー、Apple Silicon
  • OS(macOS 12 Monterey、13 Ventura)

VMware Fusion は、Fusion Pro とFusion Player の2種類があります。
Pro はビジネル利用、Player はゲームや学習目的での利用を想定していて、備えている機能が異なっています。

Pro とPlayer はともに有償の商用利用ライセンスとして提供されていますが、Player は非商用目的の個人利用ライセンスに登録することで無償で使用することが可能となっています。

手順

今回解説する手順は、VMware Fusion Player の個人利用ライセンスの登録からインストール、初回起動までの手順になります。

なお、使ったMac はM1 Pro チップMacBook Pro 、OSはmacOS Monterey です。

1. アカウント登録

VMware のサイトにアクセスします。

VMware ダウンロード 1

上のメニューの[製品] をクリックし、”デスクトップハイパーバイザー” の[Mac 用のFusion] をクリックします。

VMware ダウンロード 2

[無償評価] をクリックします。

VMware ダウンロード 3

“Fusion 13 Player (macOS 12 以降)” の[個人利用ライセンスの登録 >] をクリックします。

VMware ダウンロード 4

Customer Connect のページが表示されます。
“Installation & Configuration” というタブが選択された状態になっています。

右上の[Create an Account] をクリックします。

VMware ダウンロード 5

アカウントの情報を登録するRegister のページが表示されます。
以下の情報を入力し、利用規約のチェックをON 、商品・サービスの案内を受け取るかどうかのチェックを希望する場合はON にして、[Register] をクリックします。

  • 登録するアカウントのログイン情報(Email address, Password)
  • ユーザー情報(First name, Last name)
  • 所属企業の情報(社名、役職、住所、郵便番号、国、電話番号)
VMware ダウンロード 6

登録したメールアドレスに6桁のワンタイムパスワードが届くので、画面に入力して[Verify Code] をクリックします。

VMware ダウンロード 4

アクティベートされたと表示された後、自動で元のページ(Customer Connect の最初のページ)に戻るので、右上の[I Have an Account] をクリックします。

VMware ダウンロード 7

ログイン画面が表示されるので、メールアドレスとパスワードを入力し、[Sign In] をクリックします。

2. ダウンロード

ログインが成功すると、Customer Connect のページが表示されます。
“License & Download” タブが選択された状態になっています。

VMware ダウンロード 8

“License Information” に、VMware Fusion Player 13 – Personal Useライセンスキーが表示されています。後でVMware Fusion の初回起動時に入力するので控えておきます。

“Download Packages” に、VMware Fusion Player – Personal Use License – Binaries の[Manually Download] ボタンがあるのでクリックしてdmg ファイルをダウンロードします。

5月15日の時点では「VMware-Fusion-13.0.2-21581413_universal.dmg」というファイルがダウンロードされました。

ダウンロードしたファイルに破損などがないか、チェックサムを確認します。

% shasum -a 256 VMware-Fusion-13.0.2-21581413_universal.dmg
c86b40823b97334f20b4e6b475b488ec23faf06c986e291965b9e56f7b44c042 VMware-Fusion-13.0.2-21581413_universal.dmg

ターミナルで上記コマンドを実行して出力された文字列と、画面に表示されているSHA256SUM の文字列が一致しているか確認します。

3. VMware Fusion のインストール

ダウンロードしたdmg ファイルをダブルクリックします。
以下のウィンドウが表示されます。

VMware Fusion インストール 1

“VMware Fusion.app” のアイコンをダブルクリックします。

VMware Fusion インストール 2

エンドユーザー使用許諾書を確認し、[同意する] をクリックします。

VMware Fusion インストール 3

VMware Fusion 13 のライセンスキーを持っています” が選択された状態で、前述の手順で控えておいたライセンスキーを入力して[続ける] をクリックします。

VMware Fusion インストール 4

ご利用ありがとうございます” の画面が表示されたら[完了] をクリックします。

VMware Fusion のインストールはこれで完了です。

4. VMware Fusion の初回起動

続けて、インストールしたVMware Fusion を起動します。

VMware Fusion アイコン

Launchpad のVMware Fusion アイコンをダブルクリックします。

VMware Fusion 初回起動 5

アクセシビリティにアクセスできません” というメッセージが表示されるので[OK] をクリックします。

システム環境設定を開き、プライバシーのアクセシビリティを開きます。

VMware Fusion 初回起動 2
VMware Fusion 初回起動 3

VMware Fusion.app” のチェックがOFF になっているのでON にします。

VMware Fusion 初回起動 4

VMware Fusion.app が SystemEvents.app を制御するアクセスを要求しています” というメッセージが表示されていたら、[OK] をクリックします。

VMware Fusion 初回起動 5

“インストール方法を選択” という画面が表示されました。
VMware Fusion の初回起動はこれで完了です。

この画面から、ISO ファイルを使ったOS のインストールや、仮想ディスクのファイル(.vmdk)を使った仮想マシンの作成をすることができます。

あとがき

あとでライセンスキーを確認したくなった時に、VMware Customer Connect のライセンスキーが表示されているページを見つけづらそうだったので記載しておきます。

  1. VMware Customer Connect にログインする
    • https://customerconnect.vmware.com/home
  2. 右上の9点リーダーから”Trial and Free Products” をクリック
  3. “VMWare Fusion” の”Get Fusion Player for Free” をクリック
  4. “VMware Fusion Player – Personal Use License” のページが表示される

次回、VMware FusionKali Linux の仮想マシンをインストールする手順を解説する予定です。
2023.6.18 に投稿しました(↓)

参照

M1のmacOSにJDKをインストール

はじめに

久しぶりにJava を触ることになり、M1macOSJDK をインストールしたのでその記録です。

JDK は種類が色々あり、どれを入れようか悩んだ結果、AzulOpenJDK をインストールすることにしました。

選定理由は、M1 のmacOS で動作すればよく、あまりガッツリ調べずに決めたので書かないでおきます。
とはいえ、振り返りができるように参考になったサイトのリンクを貼っておきます。

Azul のOpenJDK は、Homebrew にパッケージがありましたが、最新のJava 20 しかなかったので、Azul の公式サイトから最新のLTS であるJava 17 をダウンロードしてインストールすることにしました。

  • zulu – Homebrew Formulae

ダウンロード

Azul の公式サイトのダウンロードページにアクセスします。

左のAzul Zulu Builds of OpenJDK のDownload ボタンをクリックして、希望のJava 17 (最新のLTS)、macOS M1/M2 のdmg ファイルをダウンロードできます。

また、下にスクロールすると、各バージョン、OS環境、CPUアーキテクチャを選ぶことができるようになっています。

ここでは、Download ボタンをクリックすると、macOS 向けでは.dmg / .tar.gz / .zip のいずれかを選んでダウンロードできるようになっています。

今回はmacOS、ARM 64-bit v8.dmg を選択して、下記のファイルをダウンロードしました。

  • zulu17.42.19-ca-jdk17.0.7-macosx_aarch64.dmg

ダウンロードが完了すると表示される画面にSha-256 checksum のリンクがあるのでクリックして、SHA256 のチェックサムを表示します。

ダウンロードしたdmg ファイルに対して下記のコマンドでSHA256 チェックサムを算出し、表示されていたチェックサムと一致していることを確認します。

% openssl sha256 zulu17.42.19-ca-jdk17.0.7-macosx_aarch64.dmg
SHA256(zulu17.42.19-ca-jdk17.0.7-macosx_aarch64.dmg)= 984face81db25020ace7f68fbf4d2c1ec950b46f34c1d40adc36983e545205c5

インストール

dmg ファイルをダブルクリックしてインストールします。

右のダンボールをダブルクリックします。

指示に従えばインストールは完了します。(特筆することがないので省略)

簡単な動作確認だけしておきます。
バージョンを確認します。

% java -version
openjdk version "17.0.7" 2023-04-18 LTS
OpenJDK Runtime Environment Zulu17.42+19-CA (build 17.0.7+7-LTS)
OpenJDK 64-Bit Server VM Zulu17.42+19-CA (build 17.0.7+7-LTS, mixed mode, sharing)

Azul OpenJDK のインストール先を確認します。

% ls -l /Library/Java/JavaVirtualMachines/
total 0
drwxr-xr-x  3 root  wheel  96  5 26 21:54 zulu-17.jdk

あとがき

IDE は最近使っているVisual Studio Code のExtension Pack for Java がよさそうなのでチャレンジしてみようと思います。
Eclipse が一番よく使っていましたが、あまりにも長く使っていないので、思い出すのに苦労するくらいなら新しいものを使ってみようという感じです。

久しぶりの投稿でしたので、とてもシンプルなものになりました。
リハビリとして単なる作業記録を書いた感じです。

参照

YubiKeyのOATHをCLIで扱う

はじめに

前回の投稿「Yubico Authenticator 6」ではYubiKey 5OATH 機能をYubico 社の認証アプリYubico Authenticator を使って操作しましたが、今回はYubiKey ManagerCLIツール (ykmanコマンド) を使って操作してみたのでその解説をします。

ykman コマンドの引数にTwitter のQR コードの値 “otpath://totp/Twitter:@RodentGiant?secret=xxxxx&issuer=Twitter” を指定してYubiKey にアカウントを登録して認証コードを発行する、というようなことの解説です。

扱うコマンドはCLI ツールのOATH コマンドで、Yubico 社の公式サイトにマニュアルが掲載されています。

YubiKey のOATH 機能について

前回の投稿「Yubico Authenticator 6」で解説していたので省略。

YubiKey Manager について

Yubico 社が提供するYubiKey Manager には、ウィンドウ操作のGUI ツールと、コマンドライン操作のCLI ツール の2種類のツールがあります。
今回の投稿はコマンドライン操作のCLI ツールを使った解説になります。

GUI ツールについては、過去の投稿「MacにYubiKey Managerをインストール」で解説しているので興味がある方はご参照ください。
なお、GUI ツールはYubiKey のOATH 機能を操作する機能を備えていないです。

環境について

今回の解説で使う環境です。

  • OS:macOS Monterey
  • YubiKey Manager CLI (ver 5.0.0)
  • YubiKey 5 NFC

インストール(CLIツール)

Yubico 社の公式サイトからCLI ツールのパッケージファイルをダウンロードしてインストールすることができますが、GUI ツールにはCLI ツールも同梱されているので、GUI ツールをインストールしてCLI ツールを使うことも可能です。

  • YubiKey Manager (CLIツール)のパッケージファイル
    • インストールすると自動でパス指定される
    • CLI ツールのバージョンが最新(ver. 5.0.0)
  • YubiKey Manager (GUIツール)のパッケージファイル
    • CLI ツールが同梱されている(パス指定が必要)
    • CLI ツールのバージョンが最新ではない(ver. 4.0.7)

ただ、2022年12月23日時点ではありますが、GUI ツールに同梱されているCLI ツールは最新のver.5.0.0 ではないので、最新を使いたい場合はCLI ツールを単体でインストールする必要があります。

もし、GUI ツールと最新のCLI ツールの両方を使いたい場合は、GUI ツールに同梱されているCLI ツールはパス指定が自動で行われないので、両方とも単純にインストールするだけで最新のCLI ツールが使える状態になります。

なお、macOS ユーザーの場合は、Homebrew を使ってCLI ツールをインストールすることもできます。こちらは最新のバージョン(ver. 5.0.0)になっていました。

各リンク先を貼っておきます。

各種環境のインストール方法が掲載されているYuboco 社のページが参考になりそうなのでリンクを貼っておきます。

Homebrew を使ってインストール

今回、Homebrew を使ってCLIツールのみをインストールします。

ターミナルで下記のコマンドを実行してインストールします。

brew install ykman

インストール後にykman コマンドに既にパスが通っていることを確認します。バージョンは5.0.0 です。

% which ykman
/opt/homebrew/bin/ykman

% ykman -v
YubiKey Manager (ykman) version: 5.0.0

OATH 機能を使う(アカウントの登録〜認証コードの生成)

CLI ツールを使ったアカウントの登録は、2要素認証を登録するサービス側が表示するQR コードの情報を使って行います。

例として、Twitter とGoogle で表示されたQR コードのページとQR コードの情報(QR コードをスキャンして読み取ったURI)を載せておきます。

Twitter

Twitter > QRコード
QRコード
Twitter > shared secret
shared secret
otpauth://totp/Twitter:@RodentGiant?secret=ABCDEFGHIJKLMNOP&issuer=Twitter

“Can’t scan the QR code?” をクリックするとshared secret が表示されたページが表示されました。

Google

Google > QRコード
QRコード
Google > shared secret
shared secret
otpauth://totp/Google:[email protected]?secret=abcdefghijklmnopqrstuvwxyz012345&issuer=Google

“スキャンできない場合” をクリックするとshared secret が表示されたページが表示されました。

アカウントの登録(URI を指定する)

QR コードをスキャンして読み取ったURI をそのまま指定して登録します。

ykman oath accounts uri "otpauth://totp/Twitter:@RodentGiant?secret=ABCDEFGHIJKLMNOP&issuer=Twitter"

認証コードの発行にYubiKey のタッチを要求するようにする場合は-t オプションを指定します。

ykman oath accounts uri -t "otpauth://totp/Twitter:@RodentGiant?secret=ABCDEFGHIJKLMNOP&issuer=Twitter"

アカウントの登録(shared secret を指定する)

shared secret を指定して登録します。

Twitter とGoogle では前述のQR コードを表示するページからリンクできるページでshared secret を確認することができます。
また、URI のクエリパラメータsecret の値がshared secret なので、URI で確認することもできます。

URI に含まれる要素を分解してshared secret 以外のオプションを指定するので、オプションの意味が分かりやすいように、ハイフン2つのオプションも併記しておきます。

ykman oath accounts add -i Twitter -o TOTP @RodentGiant ABCDEFGHIJKLMNOP
ykman oath accounts add --issuer Twitter --oath-type TOTP @RodentGiant ABCDEFGHIJKLMNOP

認証コードの発行にYubiKey のタッチを要求するようにする場合は-t オプションを指定します

ykman oath accounts add -i Twitter -o TOTP -t @RodentGiant ABCDEFGHIJKLMNOP

アカウント情報の一覧を表示

YubiKey に登録されているアカウントの情報を一覧で表示します。

% ykman oath accounts list -H -o -P
% ykman oath accounts list --show-hidden --oath-type --period
Twitter:@RodentGiant, TOTP, 30

-H オプションは非表示アカウントを表示するためのもののようですが、そもそも非表示アカウントが何か調べても分かりませんでした。-H オプションは指定しなくても結果は変わらなかったので、指定する必要ないのかもしれません。

認証コードの生成

アカウントを絞り込む条件を指定しないでコマンドを実行します。

% ykman oath accounts code
Google:RodentGiant    [Requires Touch]
Twitter:@RodentGiant            001542

アカウントが2つ登録されている場合、上記のように出力されます。

出力されるアカウントが2つ以上ある場合、アカウントの登録時に-t オプションを指定したアカウントは[Requires Touch] と表示されます。

-tオプションを指定したアカウントの認証コードの発行

アカウント登録時に-t オプションを指定したアカウントの認証コードを発行するためには、1つのアカウントのみ出力されるようにする必要があります。
YubiKey に複数のアカウントが登録されている場合は、アカウントを絞り込む条件(部分一致)を指定します。

% ykman oath accounts code Google:RodentGiant
Touch your YubiKey...
Google:RodentGiant  302862

2行目でYubiKey のタッチが要求され、タッチすると3行目の抽出したアカウントのアカウント名と認証コードが表示されます。

認証コードのみ出力する

-s オプションを指定して認証コードのみ出力することもできます。
この場合も、1つのアカウントのみ出力されるようにする必要があります。

% ykman oath accounts code -s Twitter:@RodentGiant
% ykman oath accounts code --single Twitter:@RodentGiant
001542

OATH 機能を使う(アカウントの管理)

アカウントの名前変更

% ykman oath accounts rename Twitter:@RodentGiant "Twitter:RenamedName"
Rename account: Twitter:@RodentGiant ? [y/N]: y
Renamed Twitter:@RodentGiant to Twitter:RenamedName.

アカウントにissuer を設定していた場合、変更後の名前の左に”:”(セミコロン)を付けてissuer を指定しないとissuer が削除されます。
上記例では”Twitter” がissuer 、”RenamedName” が変更後のアカウント名です。

アカウントの削除

% ykman oath accounts delete Twitter:@RodentGiant
Delete account: Twitter:@RodentGiant ? [y/N]: y
Deleted Twitter:@RodentGiant.

サービス側の2要素認証の設定も削除する必要があるので注意が必要です。
削除する順番を(1)サービス側の2要素認証の設定を削除、(2)YubiKey 側のアカウントを削除、とすればログイン時にサービス側から2要素認証の認証コードの入力を求められるけれど発行できないという状況は回避できるでしょう。

OATH 機能を使う(パスワード関連)

前回の投稿「Yubico Authenticator 6」のあとがき「YubiKey の紛失や窃取によるアカウント情報の漏洩」で少し解説していますが、YubiKey のOATH 機能にパスワードを設定することができます。
YubiKey を不正に入手した第三者への、YubiKey に登録されているアカウント情報の漏洩と、認証コードの発行を防ぐことができるので、安全のためにはパスワードは設定しておいた方がよさそうです。

なお、これまでの例示したコマンドはパスワードが設定されていない例になります。
パスワードが設定されていると、コマンドを実行する度にパスワードの入力が求められるようになります
アカウント情報の一覧を表示するコマンドの場合、下記のようになります。

% ykman oath accounts list -H -o -P
Enter the password:

-p オプションでコマンドにパスワードの文字列を付加することで、「Enter the password:」を表示しないで結果を得ることができますが、ターミナルに実行したコマンドの記録が残るのは望ましくないと思うので個人的には使わないようにしています。

% ykman oath accounts list -H -o -P -p 123456
Twitter:@RodentGiant, TOTP, 30

パスワードの設定(初期登録・変更)

YubiKey のOATH 機能は、初期状態ではパスワードが設定されていないです。
パスワードを初期登録する場合と、初期登録後に変更する場合で使うコマンドは同じです。

% ykman oath access change
Enter the new password:
Repeat for confirmation:
Password updated.

パスワードの削除

YubiKey のOATH 機能に設定されているパスワードを削除します。削除するとコマンドの実行時にパスワードの入力を求められなくなります。

% ykman oath access change -c
Enter the current password:
Password cleared from YubiKey.

パソコンにパスワードを記憶

パスワードをパソコンに記憶させておくことにより、コマンドを実行する度にパスワードの入力が求められないようにすることができます。
裏で記憶しておいたパスワードが自動入力される感じです。

% ykman oath access remember
Enter the password:
Password remembered.

一度、このコマンドを実行しておけば、同じパソコンであればパソコンを再起動しても記憶された状態が保たれます。
仕組みとしては、~/.ykman/oath.json というファイルに記憶されるようです。

パソコンに記憶したパスワードを削除

パソコンに記憶されているパスワードを削除します。削除した場合、YubiKey のOATH 機能のパスワードが設定されたままだと、コマンドの実行時にパスワードの入力が求められるようになります。

% ykman oath access forget
Password forgotten.

YubiKey のOATH 機能のパスワードの変更や削除をした場合、パソコンに記憶したパスワードは使えなくなるので、パソコンに新しいパスワードを記憶するか、このコマンドでパソコンに記憶されているパスワードを削除します。

あとがき

YubiKey のOATH 機能のパスワード設定について

  • YubiKey 紛失時の備えとして、パスワードは設定しておいた方がよさそう
  • コマンドを入力する度にパスワードを入力するのは面倒なので、パソコンに記憶させる機能は使った方がよい
  • 設定したパスワードを失念すると、パスワードの変更も削除もできなくなる
    • YubiKey に登録したアカウントの認証コードが発行できなくなる
    • YubiKey のOATH をリセットするしかない
    • パスワードはパスワードマネージャーに登録しておいた方がよい

Yubico Authenticator を使えば良いのでは?

YubiKey のOATH 機能は、Yubico Authenticator であればGUI で操作できるので、一般的な用途ではCLI ツールを使う必要がなさそう。
ざっと見た感じ、CLI ツールでできることはすべてYubico Authenticator でできると思われる。

サーバ側で認証コードを発行する仕組みを作るのにCLI ツールを使うにしても、YubiKey 5 のOATH 機能を使う場合、YubiKey 5 のOATH に登録できるOATH-TOTP の上限が32 なので、用途としては向いていなそう。

参照

Yubico Authenticator 6

Yubico 社が Yubico Authenticator 6 の正式版をリリースしました。

ユーザーのクレデンシャルをYubiKey に保存するというのが特徴の認証アプリの使用感がどのようなものか試してみたので、その解説をします。

はじめに

Yubico Authenticator について

いわゆる、2要素認証でユーザIDとパスワードを入力した後に入力する認証コードなどと呼ばれるワンタイムパスワード(OTP)を生成する認証アプリです。

認証アプリとして有名なものに、Google AuthenticatorAuthyMicrosoft Authenticator などがありますが、これらと同じことができるアプリです。

Yubico 社のサイトに、Yubico Authenticator の特徴として以下のような点が挙げられていました。

  • ユーザーのクレデンシャルをモバイル端末ではなくYubiKey内のセキュアエレメントに保存するので、クレデンシャルの漏洩を完全に防ぐことができる
  • YubiKey に保存したクレデンシャルは複数のデバイスでシームレスに利用することができる
  • アプリはWindows, macOS, Linux, iOS, Android で動作するので、パソコンでもモバイル端末でも同じ認証コードを取得できる(ARM 版macOS もサポート)

先ほど例示した認証アプリはスマホにインストールした認証アプリ単体で認証コードを発行しますが、Yubico Authenticator は認証アプリをインストールしたスマホやパソコンにYubiKey をNFT やUSB で接続して認証コードを発行します。

認証コードの発行はYubiKey のOATH-TOTH/TOTP 機能を使って行われるので、この機能を備えたYubiKey 5 シリーズが必要となります。(例えばSecurity Key シリーズは対応していない)

YubiKey のOATH-HOTP/TOTP 機能

YubiKey 5 シリーズには、YubiKey 本体にFIDO2 やPIV(Smart Card) など色々な機能がありますが、このYubico Authenticator はYubiKey のOATH(HOTP/TOTP)の機能を使ってOTP を発行しているようです。

OATH には下記の2つの方式がありますが、今回試すTwitterOATH-TOTP のみ対応しているようです。

  • OATH-HOTP
    • HMAC-based OTP
    • OTP の発行回数を使ってOTP を生成する
    • 生成したOTP を認証に使わなかった場合、サーバーの発行回数と同期がとれなくなる
  • OATH-TOTP
    • Time-based OTP
    • 接続したデバイスの現在時刻を使って6〜8桁の数字のOTP を生成する
    • 30秒ごとにOTP が変わる

Google Authenticator、Authy、Duo Mobile、1Passwordなど、どの時間ベースのワンタイムパスワード(TOTP)認証アプリでも使えます

Twitter ヘルプセンター

インストール

Yubico Authenticator のページにOS ごとのインストーラへのリンクがあります。

Yubico Authenticator > Install

今回、Mac とAndroid にインストールしました。

Mac

Mac(macOS)には、下記の2つのインストールする方法が用意されています。

  • AppStore からダウンロード
  • Yubico の公式サイトからdmg ファイルをダウンロード

今回、後者の方法でインストールすることにしました。
※ Homebrew にはなかった
※ 手順は特筆することがないので省略

Android

Google Play を使ってインストールします。
※ 手順は特筆することがないので省略

Yubico Authenticator > Android > Install

使ってみる(Mac)

Launchpad にあるアイコンをクリックしてYubico Auhenticator を起動します。

Yubico Authenticator アイコン (Mac)

Yubico Authenticator のウィンドウが表示されます。
縦長のスマホの画面のようなウィンドウです。

Yubico Authenticator (Dark mode)
Dark mode
Yubico Authenticator (Light mode)
Light mode

Dark modeLight mode の切り替えは、左上の[≡] > Settings > Appearance からできます。

Insert your YubiKey” と表示されているので、パソコン(Mac) のUSBポートにYubiKey を差し込みます。

YubiKey Authenticator (アカウント未登録)

右上のアイコンが差し込んだYubiKey のアイコンに変わり、中央の文言が”No accounts” に変わりました。
このYubiKey のOATH にはアカウントが何も登録されていないです。

ここで一旦、初回のみ行う作業の解説をします。
このアプリは、アカウントを追加する際にブラウザのページ上に表示されるQR コードをスクリーンショットで読み込むので、そのための権限を許可する必要があります。
以下、その手順です。

右上のYubiKey のアイコンをクリックするとメニューが表示されます。

Yubico Authenticator > Authenticator > menu

[Add account] をクリックします。

Yubico Authenticator > Authenticator > Add account

[Scan QR code] をクリックすると、下記のウィンドウが表示されます。

Yubico Authenticator > Macの初期設定

画面収録の許可を求められるので、[“システム環境設定”を開く] をクリックしてシステム環境設定を表示し、セキュリティとプライバシー > プライバシー > 画面収録 のYubico Authenticator.app のチェックをON にします。

初回のみ行う作業は以上です。

アカウントの追加

今回、Twitter アカウントに2要素認証の登録をします。
ブラウザを開き、2要素認証を登録するTwitter アカウントでTwitter にログインし、下記の操作で2要素認証のページを表示します。

  1. サイドメニューの[もっと見る] を開き、[設定とサポート] > [設定とプライバシー] をクリック
  2. [セキュリティとアカウントアクセス] > [セキュリティ] > [2要素認証] をクリック
Twitter > 2要素認証
※ イメージはセキュリティキーが既に設定されていた状態

[認証アプリ] のチェックボックスをクリックします。

Twitter > 2要素認証 1

[はじめる] をクリックします。

Twitter > 2要素認証 2

QR コードが表示されました。

Yubico Authenticator を起動し、右上のYubiKey のアイコンをクリックして表示されるメニューの[Add account] をクリックします。

Yubico Authenticator > Authenticator > Add account 1

下記イメージのようにブラウザ上のQR コードYubico Authenticator アプリの両方が画面に表示された状態にします。

Yubico Authenticator > Authenticator > Add account 2

[Scan QR code] をクリックします。

Yubico Authenticator > Authenticator > Add account 3

値が自動入力され、ボタンが[Scanned QR code] に変わりました。
Issuer とAccount name は変更することができます。
下にあるボタンは、[Require touch] 以外は変更できない状態になりました。

[Require touch] はON/OFF の切り替えができ、ON にすると認証コードの発行にYubiKey のタッチが要求されるようになります。(デフォルトはOFF)

右上の[Save] をクリックして保存します。

Yubico Authenticator > アカウント(Require touch:OFF)
[Require touch] OFF
Yubico Authenticator > アカウント(Require touch:ON)
[Require touch] ON

先ほど、”No accounts” と表示されていた画面にTwitter アカウントが表示されるようになりました。

  • [Require touch] をOFF にすると認証コードが表示されます。認証コードは30秒ごとに別のコードに自動で変わるので、常に最新のコードが表示されます
  • [Require touch] をON にすると認証コードが表示されず、タッチのアイコンが表示されます

[Require touch] をON にしていた場合、アカウントをクリックします。

Yubico Authenticator > Require touch 1

“Touch Required” と表示されると同時に、接続しているYubiKey 本体が点滅し始めるので、YubiKey を指でタッチします。

Yubico Authenticator > Require touch 2

認証コードが表示されました。

Yubico Authenticator > Require touch 3

認証コードは30秒ごとに変わるので、30秒経過すると表示されていた認証コードが灰色になり、クリップボードにコピーする一番左のアイコンは無効になりました。

再度認証コードを発行する場合は左から2つ目のアイコン「↻」をクリックすると”Touch Required” の状態になるので、再度YubiKey をタッチして発行することができます。

この時点ではYubico Authenticator (YubiKey)側のアカウント登録しかできていないので、Twitter の2要素認証を有効にするためにブラウザに戻ります。

ブラウザに戻ったら、QR コードの下にある[次へ] をクリックします。

Yubico Authenticator > Authenticator > Add account 4

認証コードの入力が求められるので、Yubico Authenticator に表示されている認証コードを入力し、[確認] をクリックします。

Yubico Authenticator > Authenticator > Add account 5

これでTwitter の2要素認証が有効になりました。

上の画像の赤枠の箇所にバックアップコードが表示されています。
バックアップコードは、ログイン時の2要素認証で使うことができる使い捨てのコード(12桁の英数字)で、万が一YubiKey を紛失した場合に代替手段として使うことができるので、どこか安全な場所に保管しておくことをお勧めします。

Yubico Authenticator を使った2要素認証のログイン

パソコンのブラウザでTwitter にログインします。
Yubico Authenticator が発行する認証コードを使ってログインできるか確認します。

Yubico Authenticator > Twitter ログイン 1

電話番号/メールアドレス/ユーザー名 を入力して[次へ] をクリックします。

Yubico Authenticator > Twitter ログイン 2

パスワードを入力して[ログイン] をクリックします。

Yubico Authenticator > Twitter ログイン 3
Chrome の小ウィンドウ

[キャンセル] をクリックします。

Yubico Authenticator > Twitter ログイン 4

[コード表示アプリを使用] を選択し、[次へ] をクリックします。

Yubico Authenticator > Twitter ログイン 5

認証コードの入力が求められるので、Yubico Authenticator アプリに表示されている認証コードを入力し、[次へ] をクリックするとログインが成功しました。

使ってみる(Android)

アプリのアイコンをクリックしてYubico Auhenticator を起動します。

Yubico Authenticator アイコン (Android)

Yubico Authenticator のウィンドウが表示されます。

スクリーンショットが禁止されているようで、キャプチャした画像は画面が黒い状態でした。残念ながらここからはイメージなしの解説になります。

Android 版は画面のレイアウトやできることがパソコン版と基本的に同じだったので、パソコン版との違いを確認できた範囲で解説します。

Yubico Authenticator 起動直後の状態

  • パソコン版
    • “Insert your YubiKey” と表示される
  • Android 版
    • Insert or tap your YubiKey” と表示される

Android 版は、USBポートへのYubiKey の物理的な差し込みに加え、YubiKey をかざしてNFC 接続することができます。

参考まで、Pixel でYubiKey をかざす際のかざす位置(NFC チップがある場所)が分かるリンクを貼っておきます。

アカウントの追加

  • パソコン版
    • USB ポートにYubiKey を差し込まないと、右上の”Add account” を含めたメニューが表示されない
  • Android 版
    • YubiKey と接続(*1) すると、右上の”Add account” を含めたメニューがパソコン版と同じように表示される
    • YubiKey と接続(*1) せずに右上のアイコンをクリックすると、カメラが起動してQR コードをスキャンする状態になる。
      このままQR コードをスキャンするとパソコン版と同じように値が自動入力され、[Save] をタップすると”Tap your key” と表示されるので、このタイミングでYubiKey と接続するとアカウントが保存される
    • つまり、YubiKey の接続はQR コードを読み込む前でも後でもよい

(*1) USBポートへのYubiKey の物理的な差し込み、YubiKey をかざしたNFC 接続

Yubico Authenticator で認証コードを発行

“Require touch” をOFF にして登録したアカウントの認証コードをAndroid 版YubiKey をかざしてNFC 接続する場合だけ、特徴的な違いがありました。

“Require touch” OFF“Require touch”ON
パソコンUSB常に最新のコードが表示されるYubiKey をタッチした時のコードが表示され、
30秒過ぎたら再度タッチして再発行
AndroidUSB同上同上
AndroidNFCYubiKey をかざした時のコードが表示され、
30秒過ぎたら再度かざして再発行
YubiKey をかざした時のコードが表示され、
30秒過ぎたら再度かざして再発行

当然ではありますが、認証コードの発行はYubiKey が行うので、常時接続しているUSB と違いNFC の場合は、新しい認証コードを発行するために30秒過ぎる度にスマホにYubiKey をかざす必要があります。

あとがき

複数のデバイスでシームレスに利用できる

YubiKey に登録した同じアカウントで、パソコンとAndroid のYubico Authenticator が発行する認証コードを使って2要素認証のログインができるかをそれぞれ試したら問題なくできた。

YubiKey が手元にあればどの端末でもYubico Authenticator をインストールするだけで認証コードを発行できるので、パソコンやスマホの機種変更の際は、新しい端末にYubico Authenticator をインストールするだけでよいということになる。
つまり、端末の機種変更の際はアカウント情報の移行やユーザ認証等は不要。

YubiKey の紛失や窃取によるアカウント情報の漏洩

YubiKey を入手した第三者に、YubiKey に登録されているアカウントのサービス名とそれに紐づくユーザID、2要素認証の認証コードが伝わってしまうと、残りのパスワードが特定されると不正ログインを許すことになる。
パスワードの使い回しをしていた場合、どこかのサービスで同じユーザIDとパスワードの組みが漏洩していると、その第三者が漏洩したリストを入手してパスワードを特定することが可能になる。

前述「アカウントの追加」で記載したように、QRコードを読み込むとIssuer(サービス名) とAccount Name(ユーザID) が自動入力されるので、それらの情報と認証コードがYubico Authenticator がインストールされた第三者の端末にYubiKey を接続するだけで表示されてしまっては、上記のようなアカウント情報の漏洩が起きてしまうことになる。
それを防ぐ方法は、下記の2つがある。

  • YubiKey にアカウントを追加する際に、QRコードを読み込んで自動入力されたIssuer とAccount Name を変更してから登録する(登録後の変更も可能)
  • YubiKey のOATH 機能にパスワードを設定する
    • Yubico Authenticator の右上のYubiKey のアイコンをクリックして表示されるメニューの[Set password] からパスワードを設定できる
    • パスワードを設定しておくと、端末にYubiKey を接続するとYubico Authenticator からパスワードの入力を求められるようになる

推奨は後者のパスワード設定。設定したパスワードは1Password などのパスワードマネージャに登録しておけばよい。
もしパスワードを忘れた場合は、OATH をリセットするしかない。

前者はアカウントを追加する際に変更し忘れる可能性があるのと、アカウント名を変更することで使い勝手が悪くなるので運用上無理がありそう。

セキュリティキー(FIDO)を使った2要素認証との使い分け

サービス側がセキュリティキー(FIDO)に対応しているのであれば、フィッシング攻撃に耐性のあるセキュリティキー(FIDO)を有効にしておき、メインの2要素認証として使うようにしておけば最強ともいえるセキュアな状態にすることができる。

この場合、同じYubiKey でTOTP を使った認証コードの設定をする意味は全くなさそう。むしろ下手に設定することで前述したような不正ログインのリスクを作ることになりかねない。

認証アプリの種類と使い分け

サービス側がセキュリティキー(FIDO)に対応していないが、TOTP を使った認証コードに対応している場合は、フィッシング攻撃に耐性がないがTOTP を使った認証コードを有効にしておくことで、パスワード認証のみよりはセキュアな状態にすることができる。

どの認証アプリを使うかの選択は、利便性を含めて使う側の好みにもよるので、ざっくりとした比較だけしておく。

クレデンシャルの保存場所と
認証コードの発行
クレデンシャルの
サーバへの保存
認証アプリ
認証アプリ保存されないGoogle Authenticator、Microsoft Authenticator
同上保存されるAuthy、1Password
YubiKey (OATH)Yubico Authenticator

パソコンのYubico Authenticator をメインで使う

YubiKey 5 NanoYubikey 5C Nano であれば、パソコンに常時接続しておくと邪魔にならずに便利そう。
ただ、コンパクトであることが仇になりかねないので、ログインしようとしたらYubiKey が無くなっていることに気づいたということが起きかねない環境でパソコンを使う際は要注意。

スマホのYubico Authenticator をメインで使う

YubiKey 5 NFCYubiKey 5C NFC などNFC を搭載したYubiKey の方が便利そう。
Android とUSB 接続して使えることを今回確認したが、普段そのような使い方はしないと思う。

YubiKey Manager command line tool (ykman)

Yubico Authenticator 6 のリリースについてYubico 社が公開したブログより抜粋。

To support this new app we also needed to improve the library aspects of ykman, which resulted in the release of ykman 5.0.

デスクトップ版 のYubico Authenticator は、YubiKey Manager command line tool (ykman) をライブラリと使っていて、今回の対応でykman 5.0 をリリースすることになったとのこと。
ykman 5.0 では、ykman コマンドでpython のスクリプトを実行してYubiKey を設定できるのだとか。

ykman 5.0 のことが気になったので、YubiKey Manager (GUI版) をインストールした際に同梱されていた現在使っているバージョンを確認。

% which ykman
/Applications/YubiKey Manager.app/Contents/MacOS/ykman

% ykman -v
YubiKey Manager (ykman) version: 4.0.7

このYubiKey Manager (GUI版) は最新版だったので、ykman 5.0 が同梱されているバージョンはまだ公開されていなかった。

Yubico Authenticator をインストール後にYubico Authenticator.app 内を探してみたけれど、ykman は見つからず。Yubico Authenticator にはykman は同梱されていなかった。

GitHub にはykman 5.0 があったので、使いたい場合は個別にインストールする必要があるみたい。
Homebrew のykman は5.0 になっていたので、Mac ユーザであればこちらも利用可能。

ykman 5.0 のインストールは保留にして、とりあえず現在のykman 4.07 でOATH に登録したTwitter のアカウントを確認するコマンドを実行してみた。

% ykman oath accounts list -H -o -P
Twitter:@RodentGiant, TOTP, 30

他にもアカウント登録など色々なオプションがあるので気になるけれど、収拾つかなくなりそうなのでとりあえず今回はここまでとする。

参照

macOS Monterey でLUA4-U3-AGTE-NBK を使う

M1 ProチップのMacBook Pro でBuffalo のUSB有線LANアダプターLUA4-U3-AGTE-NBK が使えるか試したら使えたので記録として残しておきます。
OSはmacOS 12.4 (Monterey)です。

はじめに

Buffalo のサイトを見ると、LUA4-U3-AGTE-NBK のmacOS 向けのドライバーはmacOS 10.15(Catalina)までしか提供されていませんでした。

アダプター内部で使われている台湾ASIX 社のサイトのAX88179 チップのページを見ると、macOS 12 向けのドライバーが提供されていたのでこれを使います。

AX88179

インストール

1. ドライバのダウンロード

ASIX 社のAX88179 のページにあるSoftware & Tools から、対象のドライバーをダウンロードします。

macOS 12 ドライバー ダウンロード

OSはmacOS 12.4 (Monterey)なので、Apple macOS 12 Drivers Installer をダウンロードします。

For Intel and Apple silicon platforms」と書かれているので、Intel チップとM1 チップの両方に対応しているようです。
M1 Proチップなので問題なさそうです。

右にある下矢印(↓)をクリックすると ASIX_USB_Device_Installer_macOS_12_Driver_v2.0.0.zip というZipファイルがダウンロードされました。

2. ドライバのインストール

ダウンロードしたZipファイルを展開すると、pdf ファイルdmg ファイルが展開されました。
pdf ファイルにはインストール手順が書かれていたので、それに従って以降作業を進めます。

※ パソコンにLUA4-U3-AGTE-NBK をUSB で接続していない状態で、下記を行います。

  1. dmg ファイルを選択して[開く] をクリックしてマウントさせる
  2. Finder の左のメニューの”場所“にあるASIX_USB_Device_Installer をクリックすると表示されるpkg ファイル ASIX_USB_Device_Installer_v2.0.0.pkg をクリックしてインストーラを起動する
  3. 「このパッケージは、ソフトウェアをインストールできるかどうかを判断するプログラムを実行します」というウィンドウで[許可] をクリック
  4. インストーラのウィザードに従ってインストールを進めて、最後に[再起動] をクリックしてパソコンを再起動する

3. ドライバの有効化

ASIX_USB_Device_App
  1. Launchpad やFinder のアプリケーションにある ASIX_USB_Device_App アプリをクリックして起動する
  2. 起動したアプリの[Activate] ボタンをクリック
    ※ なお、起動した時のアプリのウィンドウが何故か小さく表示されたので、ウィンドウを広げて[Activate] ボタンを表示させた
  3. 「機能拡張がブロックされました」というウィンドウが開くので[“セキュリティ”環境設定を開く] ボタンをクリック
  4. システム環境設定 > セキュリティとプライバシー > 一般 が開き、ダウンロードしたアプリケーションの実行許可App Store と確認済みの開発元からのアプリケーションを許可ASIX_USB_Device_App.app がブロックされているので、[許可] ボタンをクリックして実行を許可する
  5. パソコンを再起動する

4. 接続確認

  1. パソコンにLUA4-U3-AGTE-NBK をUSB接続し、LANケーブルを接続する
    ※ パソコンのUSBポートはType-C しかないので、Typd-A => Type-C の変換アダプタをかまして接続
  2. システム環境設定 > ネットワーク を見ると、左にAX88179 が表示され、状況が”接続済” でIPアドレスにルータで設定されている所定のプライベートアドレスが割り当てられている
  3. システム情報 > ハードウェア > USB を見ると、USB 3.1 バスの1つにAX88179 が表示されている
  4. ターミナルで「systemextensionsctl list」を実行すると、インストール手順に記載されるものと同様の情報が出力される
    ※ インストール済みのシステム拡張機能の表示
  5. インターネットに接続できるか確認する →OK
% systemextensionsctl list
1 extension(s)
--- com.apple.system_extension.driver_extension
enabled	active	teamID	bundleID (version)	name	[state]
*	*	5RHFAZ9D4P	com.asix.dext.usbdevice (2.0.0/2.0.0)	com.asix.dext.usbdevice	[activated enabled]

補足.アンインストール

dmg ファイルにインストーラと一緒に格納されているアンインストーラを使ってアンインストールするようです。
忘れそうなので、簡単に記載しておきます。

  1. ASIX_USB_Device_App アプリを起動して[Deactivate] ボタンをクリック
  2. dmg ファイルを選択して[開く] をクリックしてマウントさせ、Finder の左のメニューの”場所“にあるASIX_USB_Device_Installer をクリックすると表示されるpkg ファイル ASIX_USB_Device_Uninstaller_v1.0.0.pkg をクリックしてアンインストーラを起動してアンインストールする

あとがき

ASIX 社がMonterey をサポートする迄に至る記事が興味深かったのでリンクを貼っておきます。

参照

YubiKeyを使ったSSH公開鍵認証(PIV)

はじめに

前回の投稿「YubiKeyを使ったSSH公開鍵認証(FIDO)」の冒頭で触れた、YubiKey のPKCS #11 準拠のPIV(Smart Card)を使ったSSH公開鍵認証を試してみたので、その手順などを解説します。

PIV を使ったSSHの公開鍵認証

  • PIV とは、FIPS 201 で規格化された個人識別情報を検証するための要件で、米国の政府職員が持つ身分証明用のICカードで使われている標準規格
  • YubiKey にはPIV の機能があり、YubiKey 5 シリーズの場合は公開鍵暗号の秘密鍵とX.509 証明書を格納するスロットが4つある
  • OpenSSH クライアントからYubiKey のPIV にアクセスするために、ミドルウェアとしてOSS のOpenSC をインストールして使う

YubiKeyPIV に格納した公開鍵暗号の秘密鍵を使って、SSHサーバにSSH公開鍵認証で接続します。
YubiKey のPIV は、秘密鍵が外部に漏洩しないようにする対策が施されているので、SSH サーバに登録した公開鍵に対応する秘密鍵が格納されたYubiKey を接続したパソコンからしか、SSH サーバに接続できないようにすることができます。
PIV にはPIN を登録することができ、連続して入力失敗するとロックされるので、万が一YubiKey が第三者に窃取されたとしても、不正ログインは防げる仕組みになっています。

環境

クライアント側の環境

  • MacBook Pro 2022(macOS Monterey 12.4)
  • OpenSSH client (8.6p1) ※macOSにバンドルインストール版 (*1)
  • OpenSC (0.22.0) ※当手順にインストール手順を記載
  • YubiKey Manager
    • GUIツール (1.2.4)
    • CLIツール (4.0.7)
  • YubiKey 5 NFC(Firmware 5.4.3)

(*1) 前回の解説でOpenSSHクライアント をmacOS バンドルインストール版からHomebrew からインストール版に切り替えていたので、元のmacOS バンドルインストール版に戻した

サーバ側の環境

  • Ubuntu 20.04.4 LTS
  • OpenSSH server 8.2p1

クライアント側の環境設定

1. OpenSC のインストール

Homebrew でOpenSC をインストールします。

brew install opensc

OpenSC のインストール先を確認して、OpenSSH のコマンドを実行する際に指定するPKCS #11 のライブラリのパスを確認します。

% brew --prefix opensc
/opt/homebrew/opt/opensc

% ls -l /opt/homebrew/opt/opensc/lib/opensc-pkcs11.so
-rw-r--r--  1 Capybara admin  247120  6  6 21:15 /opt/homebrew/opt/opensc/lib/opensc-pkcs11.so

YubiKey の初期設定

1. YubiKey のPIV のPIN管理

PIV のPIN管理機能では、PINPUKManagement Key の3つを登録できるようになっています。
いずれもデフォルト値が登録されていて変更しないでもPIV の機能を使うことができますが、セキュリティの観点で変更が推奨とされています。

  • PIN
    • 証明書の生成、SSH接続の際に使う
    • PIN の入力を3回連続失敗するとロックされる(回数は変更可能)
    • デフォルト:123456
  • PUK
    • PIN がロックされた際のロック解除で使う
    • PUK の入力を3回連続失敗するとロックされる
    • デフォルト:12345678
  • Management Key
    • 共通鍵暗号の鍵。鍵の種類は3DES、AES(128,192,256)から選択可能
    • デフォルト:010203040506070801020304050607080102030405060708

YubiKey Manager のCLIツール でPIV の状態を確認するコマンドを実行すると、PIN とManagement Key がデフォルトの状態なので”WARNING” と表示されていました。

% ykman piv info
PIV version: 5.4.3
WARNING: Using default PIN!
PIN tries remaining: 3/3
WARNING: Using default Management key!
Management key algorithm: TDES
CHUID:	No data available.
CCC: 	No data available.

YubiKey Manager にはGUIツールとCLIツールの2つあり、どちらを使ってもこの3つを変更できますが、ここではGUIツール を使って変更します。

GUIツールを起動してYubiKey をパソコンに挿入し、メニューの[Applications] > [PIV] > [Configure PINs] をクリックします。

YubiKey Manager(GUI) PIV PIN(未登録)

この画面からPINPUKManagement Key それぞれの変更画面に移り変更します。

YubiKey Manager(GUI) PIV PIN(登録)

PIN を変更します。
Current PIN は”Use default” のチェックをON にし、登録するPIN をNew PINConfirm new PIN の2ヶ所に入力して[Change PIN] をクリックします。
※ PIN は6〜8文字以上のASCII文字

YubiKey Manager(GUI) PIV PUK(登録)

PUK を変更します。
Current PUK は”Use default” のチェックをON にし、登録するPUK をNew PUKConfirm new PUK の2ヶ所に入力して[Change PUK] をクリックします。
※ PUK は6〜8文字以上の英数字

YubiKey Manager(GUI) PIV Management Key(登録)

Management Key を変更します。

  • Current Management Key は”Use default” のチェックをON にします
  • New Management Key は[Generate] をクリックして自動生成します
    • Algorithm を変える場合はドロップダウンで選択してから[Generate] をクリックします(今回はAES256 を選択しました)
    • 自動生成ではなく任意の値を手入力することもできます
  • Protect with PIN のチェックをON にすると、Management Key がPIN で保護され、CLI ツールで鍵ペアや証明書を生成する際にManagement Key ではなくPIN の入力が求められるようになります

※ Management Key は16進数(数字とa〜fの英字)、文字数は固定でAlgorithm の種類により異なる

3つとも変更したので、再度CLI ツールのコマンドを実行してみます。

% ykman piv info
PIV version: 5.4.3
PIN tries remaining: 3/3
Management key algorithm: AES256
Management key is stored on the YubiKey, protected by PIN.
CHUID:	No data available.
CCC: 	No data available.

変更前に表示されていた”WARNING” が表示されなくなりした。

GUI ツールを使ったPIN、PUK、Management Key の登録の解説はここまでです。参考としてCLI ツールのコマンドを載せておきます。

# PIN の変更
ykman piv access change-pin

# PUK の変更
ykman piv access change-puk

# Management Key の変更
ykman piv access change-management-key -a AES256 --protect

鍵の生成〜自己署名証明書の生成

1. 鍵の生成

YubiKey Manager のCLI ツールを使って鍵を生成します。

% ykman piv keys generate -a RSA2048 --touch-policy ALWAYS 9a pubkey.pem
Enter PIN:
 → ここで登録したPIVのPIN を入力

% ls -l
-rw-r--r--  1 Capybara staff   451  6 12 15:15 pubkey.pem

実行したコマンドの解説です。

  • -a RSA2048
    • 生成する鍵の公開鍵暗号の方式
    • RSA2048 以外に、RSA1024, ECCP256, ECCP384 を指定できる
  • –touch-policy ALWAYS
    • スロットにアクセスする際にYubiKey のタッチを常に求める
    • ALWAYS 以外に、DEFAULT, NEVER, CACHED を指定できる
  • 9a
    • 生成した鍵を格納するスロット
    • PIV のスロットは4つあるので、いずれかを指定します
      • Authentication (9a)
      • Digital Signature (9c)
      • Key Management (9d)
      • Card Authentication (9e)
    • 今回はSSH公開鍵認証で使うので9a を指定しましたが、他のスロットでもよいみたいです
  • pubkey.pem
    • カレントフォルダに生成する公開鍵のファイル名

このコマンドで秘密鍵がYubiKey の指定したスロットに、PEM形式の公開鍵ファイルがカレントフォルダに作成されます。

2. YubiKey 内に作成した秘密鍵の確認

YubiKey 内に作成した秘密鍵を確認する方法を調べてみました。

  • CLIツールのykman piv info
    • 表示されない
  • GUIツールの[Applications] > [PIV] > [Configure Certificates]
    • 表示されない
  • CLIツールのykman piv keys export 9a pubkey.pem
    • YubiKey 内の秘密鍵から生成した公開鍵ファイルがカレントフォルダに作成された

どうやら、3つ目のYubiKey 内の秘密鍵から公開鍵をエクスポートする方法しか、確認する方法はないようです。
ちなみに、エクスポートで作成される公開鍵ファイルは、1. 鍵の生成 でカレントフォルダに作成された公開鍵ファイル(PEM形式)と中身が同じでした。

3. 自己署名証明書の生成

YubiKey Manager のCLI ツールを使って自己署名証明書(X.509)を生成します。

% ykman piv certificates generate -d730 -s "Capybara" 9a pubkey.pem
Enter PIN:
 → ここで登録したPIVのPIN を入力
Touch your YubiKey...
 → YubiKey が点滅したらYubiKey をタッチ

実行したコマンドの解説です。

  • -d730
    • 有効期限までの日数(730日)
  • -s “Capybara”
    • Subject の名前
  • 9a
    • 暗号鍵が格納されているスロット。生成した証明書が格納される
  • pubkey.pem
    • 公開鍵のファイル名

このコマンドでYubiKey の指定したスロットに自己署名証明書が作成されます。

4. YubiKey 内に作成した証明書の確認

ykman piv info で証明書の情報が表示されました。

% ykman piv info
PIV version: 5.4.3
PIN tries remaining: 3/3
Management key algorithm: AES256
Management key is stored on the YubiKey, protected by PIN.
CHUID:	3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
CCC: 	No data available.
Slot 9a:
	Algorithm:	RSA2048
	Subject DN:	CN=Capybara
	Issuer DN:	CN=Capybara
	Serial:		410000000000000000000000000000000000000000000055
	Fingerprint:		5f000000000000000000000000000000000000000000000000000000000000ee
	Not before:	2022-06-12 06:17:05
	Not after:	2024-06-11 06:17:05

GUIツールでも証明書の情報が表示されています。

YubiKey Manager(GUI) PIV Certificates(登録済)

X.509 証明書の詳しい情報を確認する場合は下記のコマンドを実行します。

% ykman piv certificates export 9a - | openssl x509 -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            22:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:ac
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=Capybara
        Validity
            Not Before: Jun 12 06:17:05 2022 GMT
            Not After : Jun 11 06:17:05 2024 GMT
        Subject: CN=Capybara
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:d2:6c:c3:87:51:b0:0c:fd:9d:c2:0e:a9:07:4a:
                    〜〜 省略 〜〜
                    18:fd
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         48:51:51:19:45:1f:c3:e0:68:8d:f6:cf:29:ad:4c:17:c0:de:
         〜〜 省略 〜〜
         84:89:d7:65
-----BEGIN CERTIFICATE-----
MIICsjCCAZqgAwIBAgIUIkBNq32J84S20CuA2NToSjyOs6wwDQYJKoZIhvcNAQEL
〜〜 省略 〜〜
XTR5/KdigsWVcH6f8Vo9zQ7fhInXZQ==
-----END CERTIFICATE-----

5. (補足) GUIツールで自己署名証明書を作成

GUIツールを使って作成することもできるので、画面を貼り付けておきます。

YubiKey Manager(GUI) PIV Certificates(登録)

[Applications] > [PIV] > [Configure Certificates] で証明書を作成するスロットを選択して[Generate] をクリック

YubiKey Manager(GUI) PIV Certificates(登録)Step1

“Self-signed certificate” を選択して[Next] をクリック

YubiKey Manager(GUI) PIV Certificates(登録)Step2

Algorithm を選択して[Next] をクリック

YubiKey Manager(GUI) PIV Certificates(登録)Step3

Subject を入力して[Next] をクリック

YubiKey Manager(GUI) PIV Certificates(登録)Step4

[Expiration date] を指定して[Next] をクリック

YubiKey Manager(GUI) PIV Certificates(登録)Step5

[Generate] をクリックするとYubiKey の指定したスロットに証明書が作成されます。

OpenSSH形式の公開鍵ファイル作成〜サーバに公開鍵を登録〜SSH接続

ここからはOpenSSH のコマンドを使った操作になります。

1. OpenSSH形式の公開鍵の作成

OpenSC に同梱されていたPKCS #11 のライブラリを指定して、OpenSSH 形式の公開鍵ファイルを作成します。

# コマンドの実行結果をターミナルに表示してエラーにならないことを確認する
$ ssh-keygen -D /opt/homebrew/opt/opensc/lib/opensc-pkcs11.so 
ssh-rsa AA0000000000000000000000000000000000000000000000000000000000000000000000kd PIV AUTH pubkey
 → エラーにならず公開鍵が出力された

# コマンドの実行結果をファイルに出力する
$ cd ~/.ssh
$ ssh-keygen -D /opt/homebrew/opt/opensc/lib/opensc-pkcs11.so >id_rsa_piv.pub

$ ls -l
-rw-r--r--  1 Capybara staff   397  6 12 15:28 id_rsa_piv.pub

2. 公開鍵をサーバにアップロード&登録

サーバに公開鍵をアップロードします。

scp id_rsa_piv.pub [email protected]:~/

サーバにSSHで接続して、接続ユーザの~/.ssh/authorized_keys公開鍵を登録します。

% ssh [email protected]

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cat id_rsa_piv.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

3. 公開鍵認証でサーバにSSH接続

SSH の公開鍵認証でサーバに接続できるか確認します。
実行するコマンドでは、OpenSC に同梱されていたPKCS #11 のライブラリを指定します。

$ ssh -I /opt/homebrew/opt/opensc/lib/opensc-pkcs11.so <ユーザ名>@<ホスト名>
Enter PIN for 'Capybara':
 → ここで登録したPIVのPIN を入力
 → YubiKey が点滅したらYubiKey をタッチ

PIN の手入力 + YubiKey をタッチ2要素認証でサーバに接続することができました。
鍵の生成でオプション–touch-policy ALWAYS を指定したのでYubiKey のタッチを求められましたが、このオプションを指定しない場合はPIN の入力のみになります。

4. クライアント側の設定でSSH接続コマンドの簡略化

クライアント側の~/.ssh/config に下記を記述します。

Host *
  HostName <ホスト名>
  User <ユーザ名>
  PKCS11Provider /opt/homebrew/opt/opensc/lib/opensc-pkcs11.so
  IdentitiesOnly no

上記の設定により、-I オプションを省略して接続できるようになります。

% ssh <ユーザ名>@<ホスト名>
Enter PIN for 'Capybara':
 → ここで登録したPIVのPIN を入力
 → YubiKey が点滅したらYubiKey をタッチ

5. パスワード認証を不許可に設定

SSHサーバの設定/etc/ssh/sshd_config でパスワード認証を不許可にすれば、登録した公開鍵を使った 認証しかできなくなります。

PubkeyAuthentication yes

Match User ubuntu
  PasswordAuthentication no
  AuthorizedKeysFile /home/ubuntu/.ssh/authorized_keys

systemctl reload sshd を実行して設定を反映します。

ssh-agent を使う

ssh-agent を使えばssh-agent にPIN を代理入力させて、YubiKey のタッチだけでSSH接続できるようだったので試してみましたが、ssh-agent に秘密鍵を登録するssh-add コマンドでエラーになりました。
エラーの原因や解消する方法が調べても分からなかったので、記録として残しておきます。

1. ssh-agentに秘密鍵の登録(失敗)

% ssh-add -s /opt/homebrew/opt/opensc/lib/opensc-pkcs11.so
Enter passphrase for PKCS#11:
Could not add card "/opt/homebrew/opt/opensc/lib/opensc-pkcs11.so": agent refused operation
 → 登録失敗
  • エラーの原因(仮定)
    • ssh-agent 起動時に参照するライブラリにPKCS #11 のライブラリがホワイトリストに登録されていないことによる
  • ホワイトリストに登録する方法
    • ssh-agent 起動時のパラメータは、/System/Library/LaunchAgents/com.openssh.ssh-agent.plist で定義されている
    • 上記plist ファイルを編集しようとしたが、readonly で更新できなかった(sudo vi で更新不可)
    • macOS Catalina から変更できなくなったという話があるが、解消方法は見つからなかった

以下、参照したサイト。

YubiKey のPIV を無効にする設定

YubiKey Manager にYubiKey のPIV を無効にする機能があったので、こちらもどのように機能するか試してみました。

  • GUIツールとCLIツールのどちらでも無効にすることはできます
  • この設定は前述のPIN の登録をしなくてもできます

1. YubiKey のFIDO を無効にする

GUIツールのメニューの[Interfaces] をクリックします。

YubiKey Manager(GUI) Interfaces PIV(有効)

左のUSB のPIV のチェックをOFF にして[Save Interfaces] をクリックします。

YubiKey Manager(GUI) Interfaces PIV(無効)

CLI ツールでPIV無効になっていることを確認します。

% ykman info
Device type: YubiKey 5 NFC
Serial number: 99999999
Firmware version: 5.4.3
Form factor: Keychain (USB-A)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled.

Applications	USB     	NFC
FIDO2       	Enabled 	Enabled
OTP         	Enabled 	Enabled
FIDO U2F    	Enabled 	Enabled
OATH        	Enabled 	Enabled
YubiHSM Auth	Disabled	Disabled
OpenPGP     	Enabled 	Enabled
PIV         	Disabled	Enabled

% ykman config usb --list
OTP
FIDO U2F
FIDO2
OATH
OpenPGP

16行目のPIV のUSB 欄がDisabled になっています。
また、18行目のコマンドの結果にPIV が出力されていないです。

2. PIV が無効の状態でSSH接続を試行

% ssh [email protected]
Enter PIN for 'OpenPGP card (User PIN)':
 → Ctl + C で中止

PIV のPIN ではなくOpenPGP のPIN の入力を求められたので、コマンドを中止しました。
ちなみに、YubiKey のOpenPGP は出荷時まま何も使用していない状態です。

今度はOpenPGP無効にしてコマンドを実行してみました。

% ssh [email protected]
[email protected]: Permission denied (publickey).

PIN の入力を求められることもなくエラーになりました。

この後、再度有効にして接続できるか試したら接続できました。
無効にしてもPIV の登録情報は削除されずに残ります。

参考まで、CLI ツールのPIV を無効・有効にするコマンドを載せておきます。

% ykman config usb -d PIV
Disable PIV.
Configure USB? [y/N]: y
 → 無効になる ※オプション[--disable] も同じ

% ykman config usb -e PIV
Enable PIV.
Configure USB? [y/N]: y
 → 有効になる ※オプション[--enable] も同じ
  • 上記のコマンドを実行するとYubiKey が点滅するのでタップしてみると、OTP のスロットに設定したYubico OTPの44文字が入力され「Error: invalid input」になった。点滅するけれどもタッチは不要です
  • GUIツールを開いた状態でCLIツールで有効・無効を変更してもGUIツールの表示は変わらない。変更をGUIツールの表示に反映するにはGUIアプリの再起動かYubiKey の再接続が必要

あとがき

PIV に関連して、気になっていることを2点記載しておきます。

YubiKey のPIV を使ったMac 本体のログイン

YubiKey のPIV を使ってMac 本体(OS)にログインするということもできるようです。

YubiKey Manager のGUI ツールのPIV の画面にある”Setup for macOS” をクリックして表示される画面に「macOSのアカウントとYubiKey のPIV に登録する証明書を紐づけて、macOS にYubiKey でログインできる」と書かれています。

YubiKey Manager(GUI) PIV Setup for macOS

この画面の[Setup for macOS] ボタンをクリックすると、YubiKey のPIV に必要な秘密鍵と証明書が作成されるようなのですが、上記Yubico のリンク先のページを見るとPIV を使ったMac 本体へのログインは、M1/Apple Silicon CPU では困難なことがあり非推奨となっていました。

M1 Mac users: not recommend

OS にログインできなくなってしまうと困るので、その困難なことが解消されるまでは試すのを保留にしておこうと思います。

マイナンバーカードの公的個人認証AP を使ったSSH公開鍵認証

マイナンバーカードには公的個人認証AP (JPKI-AP)という機能を備えていますが、これはYubiKey のPIV と同じように公開鍵暗号の秘密鍵とX.509 証明書を格納することができるので、これを使ってSSH サーバに公開鍵認証で接続することができるようです。

公的個人認証AP はマイナポータルなど対応しているサイトへのログイン時に利用されるものですが、このような活用方法があるというのはなんか面白いです。

カードリーダーを持っていれば試せるのですが、持っていないので残念です。

参考

YubiKeyを使ったSSH公開鍵認証(FIDO)

はじめに

YubiKey を使ってSSHをセキュアにする方法がYubico の公式サイトに掲載されていました。

簡単に整理すると下記のようなことができるようです。

  • SSHの公開鍵認証 - クライアント側にYubiKey を挿す
    • PIV(Smart Card)※PKCS #11
    • PGP
    • FIDO2 ※OpenSSH 8.2 のFIDO ハードウェア認証機能を使う
  • SSHサーバの2要素認証の実装 - サーバ側にYubiKey を挿す
    • OTP

この中のFIDO2 を使ったSSHの公開鍵認証を試してみたので、その手順などを解説します。

FIDO2 を使ったSSHの公開鍵認証

  • OpenSSH 8.2p1(2020.2.14リリース) でFIDO ハードウェア認証がサポートされた
  • YubiKey 5 などのFIDOデバイスは、OpenSSH に追加された公開鍵暗号方式“ecdsa-sk” と “ed25519-sk” にサポートされている

つまり、ssh-keygen の-t オプションで“ecdsa-sk” または “ed25519-sk” を指定すると、FIDOトークンに紐づいた鍵を生成することができ、その後パソコンにFIDOデバイスが接続されていれば、他の公開鍵暗号方式の鍵と同じように、SSHサーバに接続することができます。
YubiKey の場合、SSHサーバへの接続時にユーザーにYubiKey のタッチを求めて、タッチしたことをユーザーが接続を明示的に許可したこととして扱うようになっています。

だからどう安全なのかというと、第三者が鍵だけを窃取しても、鍵と紐づいているYubiKey が物理的に手元にないと、鍵を窃取した第三者はSSHサーバに接続することはできない、ということになります。

環境

クライアント側の環境

  • MacBook Pro 2022(macOS Monterey 12.4)
  • OpenSSH client
    • macOSにバンドルでインストール (8.6p1)
    • Homebrew でインストール(9.0p1) ※当手順に記載
  • YubiKey Manager
    • GUIツール (1.2.4)
    • CLIツール (4.0.7)
  • YubiKey 5 NFC(Firmware 5.4.3)

サーバ側の環境

  • Ubuntu 20.04.4 LTS
  • OpenSSH server 8.2p1

YubiKey の初期設定

1. YubiKey のFIDO2 のPINを登録

出荷時の状態のYubiKey にはFIDO2 のPIN が登録されていないので、YubiKey Manager を使って登録します。
YubiKey Manager にはGUIツールとCLIツールの2つありますが、どちらを使ってもPIN の登録ができます。
ちなみに、PIN を登録しないと、CLIツール のFIDO 関連のコマンドが下記のように機能してくれませんでした。(コマンドの実行にPIN の入力が必要な2つ目と3つ目のコマンドがエラーになってる)

% ykman fido info
PIN is not set.

% ykman fido access verify-pin
Error: This feature requires having a PIN. Set a PIN first.

% ykman fido credentials list
Error: Credential Management requires having a PIN. Set a PIN first.

ここでは、GUIツール を使ってFIDO2 のPIN を登録します。

GUIツールを起動してYubiKey をパソコンに挿入し、メニューの[Applications] > [FIDO2] をクリックします。

YubiKey Manager(GUI) FIDO2 PIN(未登録)

FIDO2 PIN のところに”No PIN is set” と表示されています。
[Set PIN] をクリックします。

YubiKey Manager(GUI) FIDO2 PIN(登録)

登録するPINNew PINConfirm PIN の2ヶ所に入力して[Set PIN] をクリックします。
PIN は4文字以上の英数字

YubiKey Manager(GUI) FIDO2 PIN(登録済)

元の画面に戻りました。
A PIN is set, 8 retries left” の表示に変わりました。
PIN が登録され、PIN の入力失敗が8回再試行できる状態になっています。
登録したパスワードは忘れないようパスワードマネージャー等に保存しておきましょう

PIN の登録が完了したので、再度CLI ツールのコマンドを実行してみます。

% ykman fido info
PIN is set, with 8 attempt(s) remaining.

% ykman fido access verify-pin
Enter your PIN:
PIN verified.

% ykman fido credentials list
Enter your PIN:

今回はエラーになりませんでした。
コマンドについての簡単な説明を以下、記載しておきます。

  • ykman fido info
    • FIDO2 アプリの状態を表示するコマンド
    • PIN の登録状態、PIN 入力のリトライ回数が表示される
  • ykman fido access verify-pin
    • FIDO2 をサポートするYubiKey の場合、PIN 入力のリトライ回数をリセットするコマンド
    • コマンド実行時にPIN の入力が求められる
    • 他のPIN 入力が必要なコマンドを実行するとPIN のリトライ回数がリセットされるので、このコマンドが役に立つことはなさそう。失敗する時はこのコマンドも実行できないわけで。。
  • ykman fido credentials list
    • FIDO2 アプリの登録情報を一覧表示するコマンド
    • コマンド実行時にPIN の入力が求められる

GUI ツールを使ったPIN の登録の解説はここまでで、
参考まで、CLI ツールのPIN を登録するコマンドを載せておきます。

ykman fido access change-pin -n<設定するPIN>

鍵の生成〜サーバに鍵を登録〜SSH接続

1. macOSにバンドルでインストールされていたOpenSSHを使って鍵を生成(失敗)

ed25519-sk” を指定してssh-keygen を実行します。

% ssh-keygen -t ed25519-sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation
Key enrollment failed: unknown or unsupported key type

失敗しました。
不明もしくはサポートされていない鍵タイプ” だそうです。

Yubico のDeveloper 向けサイトに「Disabled by Apple on the bundled version of OpenSSH in MacOS as of the last update to this page」という記載が見つかりました。macOS にバンドルされているOpenSSH は“ecdsa-sk” と “ed25519-sk” が無効にされているみたいです。

Apple のDeveloper 向けサイト等に何か情報がないか探しましたが、何も見つかりませんでした。これ以上突っ込まないで先に進みます。

2. Homebrew でインストールしたOpenSSHを使って鍵を生成

Homebrew でインストールしたOpenSSH であれば鍵生成のコマンドを実行できたという情報が見つかったので試してみました。(結論、成功)

Homebrew でOpenSSH をインストールします。

brew install openssh

Homebrew でインストールしたOpenSSH のコマンドにPATH を通します。
~/.zshrc に下記を追記します。
(2022.6.16 削除)

export PATH=$(brew --prefix openssh)/bin:$PATH

source ~/.zshrc を実行して設定を反映します。 (2022.6.16 削除)

Homebrew でインストールしたOpenSSH のコマンドにPATH が通っていることを確認します。(2022.6.16 追記)

% which ssh
/opt/homebrew/bin/ssh

% ls -l $(which ssh)
lrwxr-xr-x  1 Capybara admin  31  6 16 13:49 /opt/homebrew/bin/ssh -> ../Cellar/openssh/9.0p1/bin/ssh

ed25519-sk” を指定してssh-keygen を実行します。
今回は成功したので、作成された鍵ファイルを削除して、追加で幾つかのオプションを付けて再度実行しました。

% ssh-keygen -t ed25519-sk
 → 成功
% rm ~/.ssh/id_ed25519-sk*
 → 鍵を削除

% ssh-keygen -t ed25519-sk -O resident -O application=ssh:Capybara
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
 → ここでYubiKey をタッチ👆
Enter PIN for authenticator:
 → ここで登録したFIDO2のPIN を入力

Enter file in which to save the key (/Users/Capybara/.ssh/id_ed25519_sk):
 → ここで生成する鍵のファイル名を入力(何も入力せずEnterも可)
Enter passphrase (empty for no passphrase):
 → ここで生成する秘密鍵のパスフレーズを入力
Enter same passphrase again:
 → パスフレーズを再度入力
Your identification has been saved in /Users/Capybara/.ssh/id_ed25519_sk
Your public key has been saved in /Users/Capybara/.ssh/id_ed25519_sk.pub
The key fingerprint is:
SHA256:z0xxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxd0 [email protected]
The key's randomart image is:
+[ED25519-SK 256]-+
|        ......   |
|        ......   |
|        ......   |
+----[SHA256]-----+

% ls -l ~/.ssh
-rw-------  1 Capybara staff   525  5 29 16:31 id_ed25519_sk
-rw-r--r--  1 Capybara staff   159  5 29 16:31 id_ed25519_sk.pub

追加したssh-keygen のオプションの簡単な説明を記載しておきます。

  • -O resident
    • 鍵をFIDO 認証器内に保存する
    • このオプションの有無に関係なく、~/.ssh フォルダに鍵ペアは作成される
    • FIDO 認証器内に鍵を保存しておくと、ssh-keygen -K でカレントディレクトリに秘密鍵と公開鍵のファイルを書き出すことができる
  • -O application=ssh:<your-key-name>
    • 生成する鍵の名前を指定する
    • 指定する場合、“ssh:” に続けて任意の名前を指定する必要がある
    • このオプションを指定しない場合、デフォルトの“ssh:” で作成される
    • ここで指定した名前は、CLI ツールで鍵を削除する際に使われる(例:ykman fido credentials delete ‘ssh:Capybara’

-O resident オプションを付けたので、CLI ツールでYubiKey 内に保存された鍵を確認します。

% ykman fido credentials list
Enter your PIN:
ssh:Capybara 0000000000000000000000000000000000000000000000000000000000000000 openssh

-O application オプションで指定した名前が先頭にある行が1行出力されました。
ALLゼロが何なのかよく分かりませんが、とりあえずYubiKey 内に保存されているようです。

3. 公開鍵をサーバにアップロード&登録

サーバに公開鍵をアップロードします。

scp id_ed25519_sk.pub [email protected]:~/

サーバにSSHで接続して、接続ユーザの~/.ssh/authorized_keys公開鍵を登録します。

% ssh [email protected]

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cat id_ed25519_sk.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

4. 公開鍵認証でサーバにSSH接続

SSH の公開鍵認証でサーバに接続できるか確認します。

% ssh [email protected]
Enter passphrase for key '/Users/Capybara/.ssh/id_ed25519_sk':
 → パスフレーズを入力
Confirm user presence for key ED25519-SK SHA256:z0xxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxd0
 → YubiKey をタッチ👆
User presence confirmed

パスフレーズ + YubiKey をタッチ2要素認証でサーバに接続することができました。

5. パスワード認証を不許可に設定

SSHサーバの設定/etc/ssh/sshd_config でパスワード認証を不許可にすれば、登録した公開鍵を使った 認証しかできなくなります。

PubkeyAuthentication yes

Match User ubuntu
  PasswordAuthentication no
  AuthorizedKeysFile /home/ubuntu/.ssh/authorized_keys

systemctl reload sshd を実行して設定を反映します。

ssh-agent を使う

ついでにssh-agent を使えばパスフレーズはssh-agent が代理入力してYubiKey のタッチだけでSSH接続できるのではと試したら、SSH接続のコマンドでエラーになりました。
使ったSSHクライアントはHomebrew でインストールしたOpenSSH です。
エラーの原因や解消する方法を調べましたが見つからなかったので、記録として残しておきます。

1. ssh-agentに秘密鍵の登録〜SSH接続(失敗)

% ssh-add id_ed25519_sk
Enter passphrase for id_ed25519_sk:
 → ssh-agentへの登録は成功

% ssh [email protected]
sign_and_send_pubkey: signing failed for ED25519-SK "/Users/Capybara/.ssh/id_ed25519_sk" from agent: agent refused operation
 → サーバの接続は失敗

% ssh-add -D
All identities removed.
 → 後片付けとして、ssh-agentの登録を削除

ちなみに、SSHサーバの設定でパスワード認証を不許可にしないでおくと、SSH接続でエラーになるけれどもパスワード入力が求められ、パスワード認証を使ってSSH接続することはできました。

2. keychain関連のオプション

更についでに、ssh-add のkeychain関連のオプションを使ってみたらエラーになりました。不正なオプションとのことです。
そもそも、Homebrew でインストールしたOpenSSH にはkeychain関連のオプションがありませんでした。macOS にバンドルされているOpenSSH 限定のオプションだったようです。

% ssh-add --apple-use-keychain
ssh-add: illegal option -- -
 → 秘密鍵のパスフレーズをキーチェーンに登録しようとしたら失敗

Apple のDeveloper 向けサイトに掲載されているmacOS 10.12.2 (Sierra) のOpenSSH の更新のページに、Keychain とssh-agent の変更について書かれていました。書きっぷりがmacOS に搭載されているOpenSSH の更新と見えなくもないです。
一応リンクを貼っておきます。

YubiKey のFIDO2 を無効にする設定

YubiKey Manager にYubiKey のFIDO2 を無効にする機能があったので、こちらもどのように機能するか試してみました。

  • GUIツールとCLIツールのどちらでも無効にすることはできます
  • この設定は前述のPIN の登録をしなくてもできます

1. YubiKey のFIDO2 を無効にする

GUIツールのメニューの[Interfaces] をクリックします。

YubiKey Manager(GUI) Interfaces FIDO2(有効)

左のUSB のFIDO2 のチェックをOFF にして[Save Interfaces] をクリックします。

YubiKey Manager(GUI) Interfaces FIDO2(無効)

CLI ツールでFIDO2無効になっていることを確認します。

% ykman info
Device type: YubiKey 5 NFC
Serial number: 99999999
Firmware version: 5.4.3
Form factor: Keychain (USB-A)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled.

Applications	USB     	NFC
FIDO2       	Disabled	Enabled
OTP         	Enabled 	Enabled
FIDO U2F    	Enabled 	Enabled
OATH        	Enabled 	Enabled
YubiHSM Auth	Disabled	Disabled
OpenPGP     	Enabled 	Enabled
PIV         	Enabled 	Enabled

% ykman config usb --list
OTP
FIDO U2F
OATH
PIV
OpenPGP

10行目のFIDO2 のUSB 欄がDisabled になっています。
また、18行目のコマンドの結果にFIDO2 が出力されていないです。

2. FIDO2 が無効の状態でSSH接続を試行

% ssh [email protected]
Enter passphrase for key '/Users/Capybara/.ssh/id_ed25519_sk':
 → パスフレーズを入力
Confirm user presence for key ED25519-SK SHA256:z0xxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxd0
sign_and_send_pubkey: signing failed for ED25519-SK "/Users/Capybara/.ssh/id_ed25519_sk": device not found
[email protected]: Permission denied (publickey).

パスフレーズの入力後にエラーになりました。

この後、再度有効にして接続できるか試したら接続できました。
無効にしてもFIDO2 の登録情報は削除されずに残ります。

参考まで、CLI ツールのFIDO2 を無効・有効にするコマンドを載せておきます。

% ykman config usb -d FIDO2
Disable FIDO2.
Configure USB? [y/N]: y
 → 無効になる ※オプション[--disable] も同じ

% ykman config usb -e FIDO2
Enable FIDO2.
Configure USB? [y/N]: y
 → 有効になる ※オプション[--enable] も同じ
  • 上記のコマンドを実行するとYubiKey が点滅するのでタップしてみると、OTP のスロットに設定したYubico OTPの44文字が入力され「Error: invalid input」になった。点滅するけれどもタッチは不要です
  • GUIツールを開いた状態でCLIツールで有効・無効を変更してもGUIツールの表示は変わらない。変更をGUIツールの表示に反映するにはGUIアプリの再起動かYubiKey の再接続が必要

3. FIDO2 が無効の状態でTwitter のログインを試行

以前の投稿「YubiKeyでTwitterアカウントを保護する」でセキュリティキーを使った2段階認証の設定をしていたので、このYubiKey の有効・無効の影響を試してみました。

Yubico のサイトにはTwitter はFIDO2U2F がサポートされていると書かれていました。

Twitter Security protocol support (U2F FIDO2)

実際に試した結果は下記の通りです。

FIDO2FIDO U2Fログイン試行の結果
無効有効ログイン成功
有効無効ログイン成功
有効有効ログイン成功
無効無効ログイン失敗

FIDO2FIDO U2F の両方を無効にした場合のみログインに失敗しました。
振る舞いとしては、1段階目のパスワード入力後、2段階目でパソコンに挿入したYubiKey が点滅せず、タップしても無反応でした。

ちなみに、前述のFIDO2 の登録情報を確認するykman fido credentials list を実行すると、ssh-keygen -t ed25519-sk -O residentで作成した鍵は表示されますが、Twitter の情報は表示されませんでした。
Yubico の下記リンク先に書かれていることが関係していそうな雰囲気があります。(セキュリティ観点で表示されないようにファームウェアがアップデートされた?)
表示されない理由が分かっても解消する訳ではなさそうなので深掘りするのは止めておきます。

参考

PGP署名の検証

はじめに

Google Play からAndroid 端末にインストールしていたTermux の更新が止まり、パッケージ管理のリポジトリへの接続も失敗するようになっていたので、公式サイトで案内されているF-Droid を使ってインストールすることにしました。

F-Droid はGoogle Play を使わずに、APKファイルをF-Droid のサイトからダウンロードしてインストールする必要があったので、ダウンロードしたAPKファイルをPGP 署名で検証しようと思ったけれど、検証の仕方が全くわからなかったので調べながらやった記録です。(GnuPG を使ってみた記録です

GnuPG

環境について

  • MacBook Pro 2022(macOS Monterey)

手順

1. GnuPG のインストール

Homebrew を使ってインストールしました。

  • GnuPG の配布されているバージョンは、2系は最新バージョンLTS の2つあったのでLTS をインストールした
  • GnuPG は2.x のxが偶数をLTS としているようです
  • [email protected] – Homebrew
brew install [email protected]
Homebrew gnupg@2.2 インストール

インストール時のプロンプトに上記のコメントがありました。
インストールしたのがkeg-only だからパスが通っていないとのことなので、~/.zshrc に下記を追記します。

export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"

追記した後にsource ~/.zshrc を実行して設定を反映します。

2. ファイルのダウンロード

F-Droid の公式サイトから署名対象のAPKファイル署名ファイルをダウンロードします。

F-Droid

QRコードは”F-DROIDをダウンロード” のリンク先と同じF-Droid.apk のURL なので、スマホでダウンロードする際はこのQRコードを使う感じになっています。

  • 署名対象のAPKファイル
    • F-Droid のAPKファイル。F-Droid.apk
  • 署名ファイル
    • F-Droid の署名ファイル。F-Droid.apk.asc

3. 署名の検証に使う公開鍵のダウンロード

署名の検証に使うF-Droid公開鍵を入手する方法を調べたところ、F-Droid のAPKファイルと同じ場所に置いたら公開鍵も一緒に置き換えられるだろうからそんな検証意味あるか?みたいなことが書かれていました。

PGPの信頼の輪の仕組みにより配布されている公開鍵を入手するのが正解のようです。(たぶん)

下記のコマンドを実行して公開鍵サーバの公開鍵を検索します。

gpg --search-keys f-droid
公開鍵サーバの公開鍵の検索

上記のように”f-droid” で2件検出されました。
下記の公式サイトに掲載されている公開鍵の情報のユーザID(GPG signing key)と一致している(1) を選択して公開鍵をダウンロードします。ダウンロードと同時にインポートされました。

F-Droid 署名鍵

インポートされた公開鍵を下記のコマンドで確認します。

gpg --list-keys
インポートした公開鍵(不明)

~/.gnupg/pubring.kbx に先ほど選択した公開鍵が登録されていましたが、uid の欄で”不明” という扱いになっています。

公開鍵が配布者により署名されていないので、この状態で署名を検証すると下記のように検証に失敗します。

gpg --verify F-Droid.apk.asc
署名の検証(不明)

4. ダウンロードした公開鍵に署名する

ダウンロードした公開鍵が正規のものであるかは、公式サイトに掲載されている公開鍵の情報と公開鍵サーバから入手した公開鍵が同じであることが信頼できるものとして、自身の署名用の鍵を使って公開鍵に署名します。

とはいえ、まだ自身の署名用の鍵を作っていなかったので、まずは下記のコマンドで公開鍵暗号のキーペアを作成します。

  • gpg の鍵を生成するコマンドは3種類ありました。とりあえず、鍵の種類などを指定できるgpg –full-gen-key で作ることにしました。
    • gpg –full-gen-key
      • 鍵の種類、鍵長、有効期限:指定して作成する
      • ユーザIDの構成情報(名前、メールアドレス):指定して作成する
    • gpg –gen-key
      • 鍵の種類、鍵長、有効期限:デフォルトで作成される
      • ユーザIDの構成情報(名前、メールアドレス):指定して作成する
    • gpg –quick-gen-key
      • プロンプトで何も入力しないで作成する
gpg --full-gen-key

続けて、ダウンロードした公開鍵に署名します。

gpg --lsign-key F-Droid

署名後の公開鍵をgpg –list-keys で確認すると、uid の欄が”充分” になっていました。

インポートした公開鍵(充分)

5. 署名の検証

準備が整ったので署名を検証します。

gpg --verify F-Droid.apk.asc
署名の検証(充分)

今回は署名が”充分” となり、メッセージの内容から問題はなかったようです。

あとがき

Android 端末にインストールしようとしているソフトウェアが正規のものであることを今回はパソコンで検証しましたが、これがAndroid 端末上でできたらよいのですが、標準でその機能はなさそうです。
今回インストールするF-Droid を使ってインストールする予定のTermux にGnuPG をインストールすればできそうな気がします。

とりあえず、今回はここまでです。

参考