最新 追記

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2017-08-29

OpenSSH で全ユーザの公開鍵を1ファイルで管理する

この記事は、OpenSSH 6.6以上を使うことを前提とします。

OpenSSH ではユーザの公開鍵は通常 $HOME/.ssh/authorized_keys に置きますが、

  • 各ユーザのホームディレクトリに置くので管理者権限で鍵を追加する際にオーナー&パーミッションを意識するのが面倒
  • 置き場がホームディレクトリだと予めホームディレクトリを作成しなければならないのを避けたい (mkhomedir)
  • ホームディレクトリを持たないまたは揮発性のホームディレクトリを持つユーザにログインさせたい
  • ユーザに勝手に鍵を追加させたくない(管理者が鍵の追加・削除をコントロールしたい)

など、いくつかの理由で違う場所に置きたい場合もあります。

例えば sshd_config 内の AuthorizedKeysFile を使い、

AuthorizedKeysFile /etc/ssh/authorized_keys_%u

とすれば、ユーザごとに /etc/ssh/authorized_keys_<ユーザ名> というファイルが使われ、公開鍵ファイルを1ヶ所にまとめることができますが、ユーザごとに1ファイルとなっていて、全てを1ファイルで管理するというタイトルの要件は満たしていません。

そこで、AuthorizedKeysCommandAuthorizedKeysCommandUser を使います。これらの詳しい使い方については man ページを参照してください。仕組みを雑に説明すると AuthorizedKeysCommand を使い、特定のユーザの公開鍵を検索して、その公開鍵を認証に使うというからくりです。

まず、全ユーザの公開鍵を置くファイルのフォーマットを考えます。ただ公開鍵を並べただけでは、どの鍵がどのユーザのものかという情報がないので、それを付け加えてやるだけです。今回は以下のようなフォーマットにしました。

%ユーザ名%公開鍵

具体的にはこんな感じ。

%alice%ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCg+hAJJvTWHD1Rv+H5RWu30QXXHRoLHdZbfUydG7...
%bob%ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCh2o84D5La+7LnURTMJNYrNlL0v6BsTAa7Sg27BF...

このファイルからユーザごとの公開鍵を検索するためのコマンドを作成します。要件は引数にユーザ名が与えられたときに、通常の authorized_keys と同様の鍵リストを返すこと。

シェルスクリプトで実装して、こんな感じになります。/etc/ssh/authorized_keys というのは、上記のフォーマットで記述された、全ユーザの公開鍵を1つにまとめたファイルです。

#!/bin/sh

AUTHORIZED_KEY_FILE=/etc/ssh/authorized_keys
PATTERN="^%${1}%"

if [ $# -ne 1 ]; then
        exit 1
fi

grep ${PATTERN} ${AUTHORIZED_KEY_FILE} | sed -e "s|${PATTERN}||"

このスクリプトを /etc/ssh/find_authorized_keys.sh として保存して、所有者を root にし、所有者以外からは書き換えられないパーミッションにしておきます。

このスクリプトは AuthorizedKeysCommand を実行するための専用ユーザで実行することが推奨されているので、適切にパーミッションを設定します。実行するユーザは AuthorizedKeysCommandUser で指定しますが、これは必須です。また、前述の /etc/ssh/authorized_keys ファイルも当該ユーザで読めるパーミッションにする必要があります。

設定の差分を抜粋するとこんな感じ。sshd_config を書き換えたら、sshd を再起動してログインできることを確認。

AuthorizedKeysFile        none # 通常の $HOME/.ssh/authorized_keys を無効化するため
AuthorizedKeysCommand     /etc/ssh/find_authorized_keys.sh # nobody ユーザで実行できるようにしておく
AuthorizedKeysCommandUser nobody # root でない上記スクリプト実行用のユーザ

2017-08-30

運転免許の更新期間が「有効期間満了年の誕生日の前後1ヶ月」というデマは誰が広めたのか

「運転免許 更新 期間」などのワードで Google 検索すると、更新期間が「有効期間満了年の誕生日の前後1ヶ月」という説が多数ヒットする。 例えば unten-menkyo.com 内のページ (Web魚拓)が一例であるが、これは明らかに間違いである。

igsDvpk68UZDsPYGhHEknX056KKBqmMBwkEDpXbq4LQv4uynsJ_WCqhypGac8vve5DM2Yirk3LXar1sId3OWT1vRyJYlyYlfDGH8eU8VQZbHMEwPD5_fuJqdj-QuqeoWUIGn6kHdpKQ92-lcX39jPdxDSr4PuZJruHep1KkClLJK6RZ-XRvvg6Edz7BshZITqz7-INE5FEhwgG6ywBEOw7FEfHRysuYWEOCwvlJE_AiPAfsBYiWB3bbCYDeJkyq9cTPKGgmSV5gl0qrAj2oR4m7Xlk3ymOp9e0NVqSEplAH_59Z_5v69fTOlbLpW_vTV81lGwZXFxqdU878fbK0wVVjMQlMwl-A3kFvMqgSW2krlpa3lhSJQYtmOBy--JyKaER0eYZFv1W6F7kL_Rhwuhb9_Nusu1MaIj2PsCr9iSTS1ZQ2V2_zAgJ9kPF6n1PPRAOXo-WhTgStoxuGlzoK3S4QiS7RSYWgpeS8y7VoPn0pllCFuEVq99X7Ak2_vHAWAY583SkBGmDhlEG8D5kzsbr_v5VUDq2vYVA0qRY62XAeK4NymQEhGnFDklSFm6QMpZ5RGnycursoTJNYChfnuPCBrOKjeTrBFI03thdSTMOm1y-aODjDiN94cPhdesuyxb2sFaQ8_r1cZHn7blbwg3lB2NxZvYRUD_4_hMu1RwIjaIak=w498-h345-no?.jpg

なぜなら、運転免許の有効期限満了日は誰でも誕生日の1ヶ月後に設定されているからだ。12月生まれの場合有効期限満了日は誕生日の翌月で年を跨ぐ。「有効期限満了年」というのは文字通り有効期限満了日を含む年のことだから、「有効期間満了年の誕生日の前後1ヶ月」というのは有効期限が満了してから10ヶ月後から12ヶ月後までの2ヶ月間を指す。「更新期間が有効期間満了年の誕生日の前後1ヶ月」というデマを真に受けてしまうと、1〜11ヶ月生まれは有効期限満了前に更新を済ませなければならず、12月生まれは有効期限満了後10ヶ月経過してからようやく更新できることになる。12月31生まれの場合、有効期限満了年の2月1日から11月29日までは、有効期限が切れているのに運転免許の更新もできない空白期間が発生してしまう。

道路交通法を参照してみると、そんなことはない。運転免許を更新できる期間は

当該免許証の有効期間が満了する日の直前のその者の誕生日の1月前から当該免許証の有効期間が満了する日までの間(道交法6章5節101条)
となっていて、空白期間など存在しないし、更新期間は期限満了日の直前の誕生日の前後1ヶ月となっていて、「満了年の誕生日の前後1ヶ月」説とは丸1年ずれている。

道路交通法はコーナーケースまでしっかり考慮して設計されているのに、わざわざコーナーケースの考慮を外したものを広める輩がいることは理解に苦しむ。 「更新期間は有効期間満了年の誕生日の前後1ヶ月」とかいい出した輩が12月生まれでないことは確かであろう。

m5YftFJkZ9V-lFu9FTkjM2PplFCpZbcUWdHhcwM2-oCGImFPCViM8FVOMc9i0BYQA3z7dBuUf7yxVaDYlW4SG0DGZDg1XN2Z2sFnbotpQFFwLPyTZOjTHzH82jaxpks8Jz_C6Ot0Pe71-0FaFttAxNRv756HUTgEOV3L9iaOaK3YR5Dff44UQaLmGFoXLfzotDHGxQEtwnowyQj2gSR0_IgKOtGX9d5ISfdu2BlzDv2R1QeQT-BcDo9YEHWS1d-F4JsIKRh8YEfX2nHrXQ8dx2d8YPpDhw0YWoXhu4jL8Trq_d1xTfV3ge1WuwxKeaFHeY0YBndLbcRgXRBNrmD0hB0_VBjzaoZgNioxjcLDs6QNIDCg6KzGHzPGNAH-I3MRIcWUQ-O3CEaX06M-lw4AigKN5hu5tyqOOg-wT1AsOrsWJEQeg51fB6JWZFvyWnO2geFvKAvvk52ogXe9Hi50C8mePgulruy8-KAEhDC0UrS3miLCjPo7pDN3UsZe4HUcMGyA4Zne6p2fMfPtCoXCCyjXAGy8JNC5mwHyi7bGiebocNcgGv9GTtWV2Ek85CtAXsFZQYxda5Oy6Q-B-w7FbhNiwaq1qNz7Rr2bM-ix142sKVEdmzRyaoZ5iPBiXLouwcTHTnTNbp98Zteth9ZVl_jO6ejwSTjAuMJqiuZg0fqP4AQ=w605-h542-no?.jpg

unten-menkyo.com 内に「満了年の誕生日の前後1ヶ月」という記述があることは確かだが、これが一次出典であるという根拠はない。もっと前にいい始めた輩がいるのかもしれない。

「満了年の誕生日の前後1ヶ月」というデマがどこから生まれてどのように広まったか情報をお持ちの方は、教えていただけないでしょうか。