deslarnetのtech blog

慌てず、急いで、正確にな

Open SSTP Clientを用いてAndroid 14からPacketiX VPN ServerにSSTP接続する

qiita.com
上記記事を参考に設定し、Open SSTP Clientを用いてPacketiX VPN ServerにSSTP接続することができたので報告する。

環境

サーバ

  • Fujitsu PRIMERGY TX1320 M4
  • Windows 11 Pro Version 22H2 Build 22621.3085
  • PacketiX VPN Server Small Business Edition (Ver 4.42, Build 9798)
  • JPRSドメイン認証型のSSL証明書を導入済み

端末

  • Google Pixel 8 Pro
  • Android 14 Build UQ1A.240105.004
  • Open SSTP Client Version 1.6.5.1

備考

検証可能な証明書を導入しているためか、元記事にあるCA証明書のインストールは必要なく、ホスト名、ユーザー名、パスワードの入力のみで接続できた。
ちなみにMacやiOSデバイスでは、より強力なSSTP Connectというクライアントソフトウェア*1が有料で利用できる。

*1:名前は似ているが別物

MacのVivaldiでMailvelopeを用いてYubiKeyのPGP鍵を使用する

タイトル通りだが、躓くポイントがあったので備忘録としてまとめておく。

Mailvelopeについて

MailvelopeはWebメールのトラフィックをOpenPGPによりエンドツーエンド暗号化するオープンソース ソフトウェアで、ブラウザのアドオン(拡張機能)として動作する。公式サイトによればブラウザはChrome、Edge、Firefoxがサポートされており*1、WebメールサービスはGmail、Yahoo、Outlook.com等に対応している。こうしたWebメールサービスは便利な反面、サービスプロバイダーによって情報収集される可能性が否定できず、メールがどのくらい安全かが不明瞭である。Mailvelopeを用いたエンドツーエンド暗号化によってWebメールの安全性を高めることができる。

準備するもの

  • Mac(mac OS Ventura 13.4.1 (c))Homebrewがインストールされているものとする
  • 以前紹介したような手順で秘密鍵を保存したYubiKey

WebブラウザはVivaldiを使用した。

Mailvelopeの導入

Chrome ウェブストアからMailvelopeを検索し、インストールする。

GnuPGのインストール

gpgmeとGnuPGをインストールする必要がある。Homebrewがインストールされていれば、ターミナルでbrew install gpgmeと入力しgpgmeをインストールする。もしGnuPGがインストールされていなければ、同時にGnuPGもインストールされる。

pinentry-macのインストール

pinentryは、ダイアログ表示を介して接続すべきスマートカードのシリアル番号を示したり、PIN等の値を対話的に取得したりするためのプログラムである。

画像:pinentry-macのダイアログの例

gpgmeをインストールするとpinentryがインストールされるが、pinentryではターミナル内で動作するのみで、Mailvelopeでは動作しないため、pinentry-macをインストールする必要がある。brew install pinentry-macでインストールできる。
gpg-agent.confファイルを以下の内容で作成し、~/.gnupgに保存する。

pinentry-program /opt/homebrew/bin/pinentry-mac

GPGToolsが開発するGPG Suite(WindowsにおけるGpg4winに相当するものと考えてよい)というものもあり、これをインストールすると、pinentry-macも同時にインストールされるが、検証環境ではダイアログが表示されるものの、正しく動作しなかった(今回の用途においてはGPG Suiteをインストールする必要はない)。

マニフェストファイルの作成と配置

Mailvelopeがgpgmeと正常に通信するためには、ブラウザアプリケーションのマニフェストファイルが必要である。このファイルには、ネイティブメッセージングアプリgpgme-jsonへのパスと、許可されたブラウザ拡張機能 ID が含まれる。Apple SiliconなMacにおいては、マニフェストファイルgpgmejson.jsonを以下の内容で作成する。

{
    "name": "gpgmejson",
    "description": "Integration with GnuPG",
    "path": "/opt/homebrew/bin/gpgme-json",
    "type": "stdio",
    "allowed_origins": [
        "chrome-extension://kajibbejlbohfaggdiogboambcijhkke/"
    ]
}

今回はVivaldiに設定するので、作成したファイルをディレクトリ~/Library/Application Support/Vivaldi/NativeMessagingHostsに保存する。ここまでの手順を行うことでMailvelopeがGnuPGと連携するので、Outlook.comで正しく動作するか確認を行う。

画像:Outlook.com上でMailvelopeで署名・暗号化した本文を復号・検証したもの

結語

Apple SiliconなMacのVivaldiにMailvelopeをインストールし、YubiKeyを用いて暗号化、署名、検証、復号できた。

参考にしたサイト

github.com

*1:今回Vivaldiで検証できたので、Chromium系のブラウザでは動作可能なのかもしれない。

M2 Pro搭載MacBook Proを購入した話

MacBook Pro 14インチ(2023)

最新型のMacBook Pro(14インチ)が届いて1週間ほど経過した。初めてのApple siliconだし、そもそもMacを購入するのは初めての経験だ。
以前はDell XPS 9500を使っていた。15インチのハイエンドノートPC。Core i7-10875H、32GB RAM、2TB SSDという盛り盛り構成で、購入当時35万円近くしたように思う。
気付けば幼稚園の頃から(MS-DOSか)Windowsしか使ってこなかった。慣れ親しんだWindowsなら、何か不具合に遭遇しても、どこが悪いのか大方予想がつくし、たいてい自力でなんとかできる。だが、何度も何度も解決を試みたものの、絶対に解決できない問題が3つあった。

  1. 深刻なサーマルスロットリング
  2. スリープ状態から勝手に復帰して鞄の中で熱暴走(これはこの商品というよりもWindowsの問題)
  3. ちゃんとバックアップが取れない(これも)

1はまあ百歩譲って運が悪かったとして諦めがつくが、問題は2と3だ。特にスリープ機能が実質的に使用できないため、ディスプレイを閉じる時は毎回必ず休止状態にしていた。この方法はSSDの寿命を縮める可能性が大いにあるが、熱暴走を起こさないために背に腹はかえられなかった。このような重大な欠陥がありつつも3年近く騙し騙し使用していた。
そんな中、たまたま会社の同僚が使っていたM1搭載MacBook Proを触らせてもらった。外装はさすがAppleで、いくらハイエンドとはいえ、Dell XPSより二枚は上手だと思った。そして驚くことに、全く熱くならず、負荷のかかる作業をしていてもファンが回ることはほとんどないという。僕のXPSは電源を入れただけでじんわり熱くなってファンの風切音がするし、動画編集なんてやった日には目玉焼きが焼けるんじゃないかと思えるほどキーボードが熱くなるのに。そんなこんなで、俄にMacBookが欲しくなった。元々MacBook Proという商品は実にカッコいいと思っていたし、働き始めたら僕もVAIOかMacを使うんだと思っていた時期はある(VAIO Z(2016)は実際に使っていた。あれはあれでカッコよかった)。
AppleがMacにApple siliconを採用すると発表したての頃は、やれ互換性だのなんだのと、色々噂が立った。自分もCPUはIntelだとばかり思っていたので非常に懐疑的であった。しかし実際に蓋を開けてみると、M1を搭載したMacは概ね好意的に受け入れられているようだし、何より5nmプロセス採用の衝撃は大きく、Intelの数世代先をいっているとさえ言われ(Intel 7と銘打ってはいるが、Intelは第13世代でもまだ10nmプロセスである)、今やApple siliconは無視できない存在となっていた。
この手の商品の適切な買い時は、欲しいと思った時であることが経験的によく知られている。構成を吟味し、M2 Pro 12コア、32GB RAM、2TB SSDでいくことにした。注文するのは時間の問題だった。漢の20回払い。Apple ストアで注文して1週間ちょっとで届いた。
ちょっと触ってわかったが、さきほど挙げたどうしても解決できなかった3つの問題が見事解決したではないか!とても晴れやかな気持ちである。良い買い物をした。素晴らしい。Appleマンセー!
手元には昔買ったAdobe Illustrator CS6をはじめ、Windowsでしか動かないソフトが結構あるので、Windows 11 Proを買ってParallels Desktopで使えるようにインストールした。今では仮想化が当たり前だが、僕が学生の頃は別のOSを使おうと思ったらデュアルブートしか選択肢がなかった。導入手順も煩雑で知識がいるし、当然HDDのパーティションは別にしなきゃいけないし、他方のOSを使おうと思ったら再起動しなければいけなかった。Apple siliconなMacでWindowsを動かすには、Microsoft公式では公開されていないARM版Windowsのインストールディスク(isoファイル)が必要なのだが、Parallels Desktopはその辺を自動でやってくれるので導入が非常に簡単だ。
家で中古で買った富士通の業務用サーバにvSphereを入れて仮想サーバを動かしているので、当初はその辺の互換性を考えてVMware Fusionを使おうかと考えていたが、このParallels Desktopが非常に優秀で、あまりの便利さにFusionを使う気は全く起きなくなった(そもそもアーキテクチャが異なるので、サーバの仮想マシンをMacにダウンロードして動かすことやその逆のことは当然できない)。
ARM版Windows 11では通常のx86やx64なソフトは自動的にエミュレーションが働くので、ほぼ問題なく使用できる(Windows 10ではx86なソフトのみ使える)。写真現像用のCapture Oneがインストールで躓いた(ARM版にはインストールできない)が、幸いクロスプラットフォームだったので、Macへインストールすることで事なきを得た。いっぽう、ハードウェア周りはほぼ全滅と言ってよい状況であることが判明した。そもそもARM版Windows用のドライバなんてどの会社も作ってないし、職場のプリンタ(RICOHと富士ゼロックス)すら非対応というのには驚いた(Parallels Desktopの機能のお陰でWindowsアプリからMacのドライバを介して印刷できる)。古いハード音源なんかはほぼ確実に動かないので、乗り換えて使おうと思っている人(いるのか?)はぜひ注意されたい。そんな状況なので、互換性のないハードウェアは今後サーバに接続して使っていこうと思う(vSphereはPCIeデバイスを仮想マシンにパススルーして仮想マシンから直接制御することができる)。今後出てくる新しいハードウェアには、ARM版Windowsへの対応も期待したい。というか、携帯電話もタブレットもほぼARMなのに、PCだけ違うというのもなんだかおかしい気はする。
ガワだけMacでWindows用ソフトを使うのもまた一興だが(実は当初はWindows PCとしての運用を想定していた)、今後はMac用のソフトを使う機会が増えると思われる。けどMacもWindowsも両方使えるのが理想的だと思う。とても安心感がある。

PGP鍵の作成とYubiKeyでの運用

電子メール技術の問題点と現状

電子メールはネットワークでの通信が信頼されていた頃からある規格で、それ自体に盗聴やなりすましを防ぐ手段は含まれていません。このため、最近のソーシャルネットワークなどのサービスを利用する場合に比べて、さらに暗号化やデジタル署名が重要な場合があります。
https://mitome.in/email/

電子メールは、封筒に入った手紙と違って、いわば裸のはがきの状態で様々なサーバを経由して届けられる。さすがにそれでは困るので、通信経路を暗号化して盗聴できなくするのが一般的である。ほとんどのメールプロバイダはTLSをサポートしているためメッセージは暗号化されているが、エンドツーエンドで暗号化されていないため、プロバイダであるGmail、Outlook.comなどはこれらのメッセージを読むことが可能である。また、なりすましを防ぐことができない。例えばProton Mailユーザ同士ならば、PGPを使用して、特に意識することなくエンドツーエンドで暗号化されたメールを送受信でき、なりすましを防ぐことも可能である。エンドツーエンドの暗号化を可能とする技術にS/MIMEとPGPがあるが、残念ながらいずれもほとんど普及していない。大方のGmailやOutlook.comなどの利用者は、こうした大企業にメールの中身を覗き見られ、第三者に情報が渡される可能性が否定できない。

PGP, OpenPGP, and GnuPG (GPG)

OpenPGPは、公開鍵暗号方式によるデータの認証や暗号化のための非独占的なフォーマットであり、オリジナルのプロプライエタリ製品であるPGP (Pretty Good Privacy) ソフトウェアをベースにしている。OpenPGPのフォーマットと使用方法は、多くのIETF RFCとドラフトで規定されているため、これらの標準はどの企業でも、誰にライセンス料を支払うことなく実装することができる。GNU Privacy Guard (GnuPG, GPG) は、RFC4880で定義されたOpenPGP標準の完全でフリーな実装である。

Yubikeyの利点

公開鍵暗号方式は、巨大な数の素因数分解の困難性や、楕円曲線上の離散対数問題の困難性に基づく暗号方式である。「公開鍵」と「秘密鍵」という鍵ペアを利用する。ざっくり言うと、暗号化と復号に同じ鍵を用いる共通鍵と異なり「公開鍵で暗号化すると、ペアの秘密鍵でしか復号できない」という特徴がある。公開鍵は文字通り公開することができるが、秘密鍵はインターネット上でのあなたの唯一の存在証明であり、決して漏洩してはならない。YubiKeyはOpenPGPに対応しており、秘密鍵を書き込むことができる。一度書き込むと二度と秘密鍵を読み出すことはできなくなるため、他のデバイスに秘密鍵を保存するよりも安全に秘密鍵を持ち運ぶことができる。秘密鍵はYubiKey内で生成する方法もあるが、前述の通り二度と取り出せなくなるため、信頼できるPCで作成して書き込む方法が推奨されている。

GnuPGの導入

https://www.gnupg.org/index.html
WindowsならGpg4win, MacならGnuPGとpinentry-macをインストールする。Mailvelope等を使用する場合 "browser integration" にチェックを入れておくとよい。

作成する鍵の仕様

役割 種類
主鍵 Sign, Certify ECC NIST P-521
副鍵1 Encryption ECC NIST P-521
副鍵2 Sign, Authenticate ECC NIST P-521

鍵の種類は安全性に大きく関わるため、適切に選択する必要がある。CRYPTRECの暗号運用ガイドラインなどが参考になる。ここでは楕円曲線暗号かつNISTで鍵長の長いものを選択した。
主鍵は副鍵の生成・失効以外では使用しない。バックアップを取ったらPCから抹消して、エアギャップ保管が望ましい。

鍵の生成

主鍵の生成

$ gpg --expert --full-gen-key
gpg (GnuPG) 2.4.0; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
   (7) DSA (機能をあなた自身で設定)
   (8) RSA (機能をあなた自身で設定)
   (9) ECC (署名と暗号化) *デフォルト
  (10) ECC (署名のみ)
  (11) ECC (機能をあなた自身で設定)
  (13) 既存の鍵
  (14) カードに存在する鍵
あなたの選択は? 11

このECC鍵にありうる操作: Sign Certify Authenticate
現在の認められた操作: Sign Certify

   (S) 署名機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? Q
ご希望の楕円曲線を選択してください:
   (1) Curve 25519 *デフォルト
   (2) Curve 448
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
あなたの選択は? 5 
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)0
鍵は無期限です
これで正しいですか? (y/N) y

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: Taro Crypt
電子メール・アドレス: ctaro@example.com
コメント:
次のユーザIDを選択しました:
    "Taro Crypt <ctaro@example.com>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。

# 鍵のパスフレーズを入力する

gpg: 鍵E9ACC474DF792868を究極的に信用するよう記録しました # 鍵ID(フィンガープリントの末尾8バイト)
gpg: ディレクトリ'/Users/taro/.gnupg/openpgp-revocs.d'が作成されました
gpg: 失効証明書を '/Users/taro/.gnupg/openpgp-revocs.d/E69AA264E45477C6E7784A2CE9ACC474DF792868.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   nistp521 2023-02-27 [SC]
      E69AA264E45477C6E7784A2CE9ACC474DF792868 # フィンガープリント
uid                      Taro Crypt <ctaro@example.com>

副鍵1, 副鍵2の生成

$ gpg --expert --edit-key E9ACC474DF792868 # 先ほどの鍵ID
gpg (GnuPG) 2.4.0; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
Secret key is available.

sec  nistp521/E9ACC474DF792868
     created: 2023-02-27  expires: never       usage: SC
     trust: ultimate      validity: ultimate
[ultimate] (1). Taro Crypt <ctaro@example.com>

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
  (14) Existing key from card
Your selection? 12
Please select which elliptic curve you want:
   (1) Curve 25519 *default*
   (2) Curve 448
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
Your selection? 5
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec  nistp521/E9ACC474DF792868
     created: 2023-02-27  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  nistp521/97A48F3A2D3030F0
     created: 2023-02-27  expires: never       usage: E
[ultimate] (1). Taro Crypt <ctaro@example.com>

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
  (14) Existing key from card
Your selection? 11

Possible actions for this ECC key: Sign Authenticate
Current allowed actions: Sign

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? A

Possible actions for this ECC key: Sign Authenticate
Current allowed actions: Sign Authenticate

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? Q
Please select which elliptic curve you want:
   (1) Curve 25519 *default*
   (2) Curve 448
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
Your selection? 5
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec  nistp521/E9ACC474DF792868
     created: 2023-02-27  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  nistp521/97A48F3A2D3030F0
     created: 2023-02-27  expires: never       usage: E
ssb  nistp521/D1B0D4E117E6374D
     created: 2023-02-27  expires: never       usage: SA
[ultimate] (1). Taro Crypt <ctaro@example.com>

gpg> save

鍵のエクスポート

主鍵と副鍵の秘密鍵

$ gpg -a -o mastersub.key --export-secret-keys E9ACC474DF792868

副鍵の秘密鍵

$ gpg -a -o sub.key --export-secret-subkeys E9ACC474DF792868

公開鍵

$ gpg -a -o public.asc --export E9ACC474DF792868

失効証明書の作成

$ gpg -o revoke.asc --gen-revoke E9ACC474DF792868

エクスポートしたら、必ず安全な場所に保存すること。

全秘密鍵の削除と副鍵秘密鍵のインポート

全ての秘密鍵を削除

$ gpg --delete-secret-keys E9ACC474DF792868
gpg (GnuPG) 2.4.0; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


sec  nistp521/E9ACC474DF792868 2023-02-27 Taro Crypt <ctaro@example.com>

この鍵を鍵リングから削除しますか? (y/N) y
これは秘密鍵です! 本当に削除しますか? (y/N) y

副鍵のみインポート

$ gpg --import sub.key
gpg: key E9ACC474DF792868: "Taro Crypt <ctaro@example.com>" not changed
gpg: To migrate 'secring.gpg', with each smartcard, run: gpg --card-status
gpg: key E9ACC474DF792868: secret key imported
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

Yubikeyの設定

KDFの有効化

$ gpg --card-edit

Reader ...........: Yubico YubiKey OTP FIDO CCID
Application ID ...: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: XXXXXXX
Name of cardholder: [未設定]
Language prefs ...: [未設定]
Salutation .......:
URL of public key : [未設定]
Login data .......: [未設定]
Signature PIN ....: 強制なし
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card> admin
管理者コマンドが許可されています

gpg/card> kdf-setup
gpg/card> list

Reader ...........: Yubico YubiKey OTP FIDO CCID
Application ID ...: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: XXXXXXX
Name of cardholder: [未設定]
Language prefs ...: [未設定]
Salutation .......:
URL of public key : [未設定]
Login data .......: [未設定]
Signature PIN ....: 強制なし
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: on
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

PIN(初期値123456), Admin PIN(初期値12345678)の変更

gpg/card> passwd
gpg: OpenPGPカードno. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXを検出

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

あなたの選択は? 1

副鍵のYubiKeyへの転送

$ gpg --edit-key $KEYID
gpg (GnuPG) 2.4.0; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret subkeys are available.

pub  nistp521/E9ACC474DF792868
     created: 2023-02-27  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  nistp521/97A48F3A2D3030F0
     created: 2023-02-27  expires: never       usage: E
ssb  nistp521/D1B0D4E117E6374D
     created: 2023-02-27  expires: never       usage: SA
[ultimate] (1). Taro Crypt <ctaro@example.com>

gpg> key 1 # まず暗号化鍵を選択

pub  nistp521/E9ACC474DF792868
     created: 2023-02-27  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb* nistp521/97A48F3A2D3030F0
     created: 2023-02-27  expires: never       usage: E
ssb  nistp521/D1B0D4E117E6374D
     created: 2023-02-27  expires: never       usage: SA
[ultimate] (1). Taro Crypt <ctaro@example.com>

gpg> keytocard
Please select where to store the key:
   (2) Encryption key
Your selection? 2

同様に他の鍵も転送する。転送が終わったら、saveで抜けると副鍵がPCから削除される。

MailvelopeでのYubiKey PGP鍵の使用

Mailvelopeはブラウザの拡張機能で、GmailやOutlook.comなどでOpenPGPを使って暗号化されたメールを送受信できるようになる。PCにインストールされたGnuPGと連携できる。連携方法はこちら

まとめ

PGP鍵を作成し、YubiKeyに書き込んで使用できるようになった。
Mailvelopeを使用したメールの暗号化、署名ができるようになった。

YubiKeyを導入した話

Twitterの改悪が止まらない

Twitter社は2月18日、SMSを利用する2要素認証をTwitter Blueサブスクライバーに限定すると発表した。現在SMS認証を使用している場合は、3月19日までに使用を中止するよう案内されている状況。大手SNSがアカウント乗っ取り対策の選択肢を無くすというのは、なかなかふざけているように思う。なお、認証アプリ、セキュリティーキーを利用した2要素認証については引き続き誰でも利用できるとのこと。

多要素認証

情報処理推進機構(IPA)によると、認証の際、複数の要素(記憶情報、所持情報、生体情報のうち2つ以上)を用いた方式は「多要素認証」と呼ばれ、不正ログイン防止に効果があるとされている。
www.ipa.go.jp
多要素認証(MFA)の実装としては、Time-based One-time Password(TOTP)、電子証明書を用いたもの、Fast IDentity Online Universal 2nd Factor(FIDO U2F)等がある。One-time Passwordはスマートフォンがあればすぐに導入できるというメリットがあるが、いちいちスマートフォンを開いたり、パスコードを打ち込んだりとあまりスマートな方法とはいえないため、ハードウェア認証デバイスを導入することとした。

購入したもの

今回導入したのは、米国Yubico社が販売するYubiKey 5C NFC。国内正規代理店は株式会社ソフト技研である。

YubiKey 5C NFC。車のカギと一緒に携行している

YubiKey 5シリーズ
エンタープライズレベルのセキュリティキーが、1回のタップで強力な二要素認証、多要素認証、パスワードレス認証を実現します。 最新の認証プロトコルから従来型のものまで対応する1つのデバイスが、数百のアプリケーション間のギャップをシームレスに埋めます。 デスクトップパソコンやノートパソコン、それぞれに適した形状が用意されています。

アカウント乗っ取りを阻止
複数プロトコルに対応:FIDO2、U2F、ICカード (PIV)、OpenPGP、HOTP、TOTP、Yubico OTP
USB-A、USB-C、NFC、Apple Lightning
防水性、耐衝撃性ハードウェア
主要なすべてのID管理およびアクセス管理プラットフォームとの統合

https://www.yubico.com/yubikey/?lang=ja

当然ながらFIDO U2Fに対応しているので、様々なサイト・サービスでMFAを設定できる(この機能だけが目的なら、YubiKey SeriesではなくSecurity Key Seriesでよい)。
私はパスワード管理ツールにBitwardenを使用しているが、プレミアム会員ならYubiKeyでのMFAに対応している(Yubico OTP機能が必要なためSecurity Key Seriesは非対応)ため、YubiKeyがあるとより安全に利用できる。
またYubico Authenticatorなるアプリをスマートフォンにインストールすることで、YubiKeyにTOTPを保存して使用できる(デバイスに挿すか、NFCリーダーにかざすことで読み取り可能となる)。

まだまだ機能満載

PIV互換SmartCard機能については、まだ試せていない。YubiKeyを使用したPGP鍵の運用については、別記事で詳しく説明する。

まとめ

YubiKeyによる多要素認証の有用性について紹介した。
皆さんもぜひYubiKeyでセキュアでトラストフルな生活を。