Authorized_keysのSSHキーが最後に使用された時期を確認する方法はありますか?

Authorized_keysのSSHキーが最後に使用された時期を確認する方法はありますか?

私のDebianスタイルのサーバーのいくつかのライセンスキーは、古いPCなどのキーのために大きすぎます。ログインにどのキーが使用されたかを知る方法はありますか?掃除したいです。
/var/log/authを検索しましたが、実際の運はありません。

答え1

おそらくこの時点で学ぶ興味深い部分は、SSHキーの「説明」フィールドが非常に役に立つということです。デフォルトはuser@hostname合理的ですが、ユーザーはそれぞれ異なる目的を持つ複数のSSHキーを作成するのが一般的です。

ssh-keygen -C "this key is for backups" -t ....
ssh-keygen -C "webmaster access for www.example.com"

さらに重要なのは、公開SSHキーが挿入されたときに ~/.ssh/authorized_keysキーを識別するためにコメントを保持(または拡張)することです。キーに説明がない場合は編集できます。一意のキーアノテーションがないと、SHA256ハッシュは公開キーとすぐに明確な相関関係を持たないため、あるキーを他のキーと区別することは困難です。

だから:

  • -C "this is the comment"SSHキー生成時に一意のコメント()を使用する
  • Authorized_keysファイルにキーを追加するときに、コメントにキーが属している人だけでなく、キーへのアクセスを許可する理由も反映していることを確認してください。

コメントを(慎重に)編集しても、キーの整合性が損なわれないことを覚えておいてください。既存の公開鍵(自分または他の人のもの)の一般的な説明を編集して、あなたまたは現在の目的にもっと意味を持たせることができます。

しかし、あなたの質問は興味深い課題のようです。目的のタスクを実行する際の主な制限は次のとおりです。

  • 上記のように、使用済みまたは未使用のキーを明確に参照できるように、特定のキーについて人間が読める記述子を持ってください。

  • SSH ログは、SSH キーを使用する場合のソース文書です。これらのログは通常無期限にアーカイブされていないため、「最近」に使用されているSSHキーのみがわかります。長期間ログを保存しても、ログファイルで年エントリを使用できないことが多く、アルファベット順の月名を並べ替えるには、より面倒な作業が必要です。このスクリプトが使用するショートカットは、単に各ログファイルで特定のキーが発生する回数を数えることです。

  • SSHログは通常一般ユーザーによって読み取り保護されているため、sudoこれを読むにはアクセスが必要な場合があります。

しかし、とにかく続けましょう!

「非アクティブ」を確認したい公開鍵のリストは、ファイルの鍵である~/.ssh/authorized_keys可能性が高い。スクリプトには、ssh友達が使用できる形式のファイルパス名が必要です。具体的には、ssh-keygen公開鍵を読み取り、主キーのSHA256ハッシュを抽出するために使用されます。これはSSHログインと相互に関連付けるために必要なハッシュです/var/log/auth-log*

$ ssh-keygen -l -f .ssh/my-laptop-id_rsa.pub 
2048 SHA256:YmiLC7LFQ+mSE3SHkXzbpFuWi0HbIpGCaIUYuR6rAiM root@my-laptop (RSA)

最初のパラメータ(キーの長さ(ビット単位))は引用符ではありませんが、2番目のパラメータは最も重要なキーSHA256ハッシュで、2番目のパラメータ以外のすべての項目はキーコメントであり、それを反映する「(RSA)」が追加されます。鍵に使用される暗号化方式です。 ssh-keygen -lスクリプトの主な同盟であり、複数のキーを格納するために使用される配列技術です。 1 つは SHA256 ハッシュ配列、もう 1 つはスクリプトが呼び出す各キーの説明または「タグ」です。

最後に、SHA256ハッシュ配列を繰り返し、ファイルgrep全体で /var/log/auth.log*各ハッシュの発生回数を計算し、フォーマットされた結果を表示します。

スクリプトには改善の余地がたくさん残っていますが、これによって問題にアプローチするさまざまな方法と結果を提示する方法についてのアイデアが促されることを願っています。

    #!/usr/bin/env bash
    
    set -e
    
    
    sha_of_pubkeys() {
    
    # Given an ssh authorized_keys file on stdin, extract the SHA256 hash of each
    # key, and return:
    #  (sha256 hash) <space> (key comment)
    # on stdout.
    
            grep '^[^#]' |
              ssh-keygen -l -f - |
              sed -Ee 's/^[^ ]* +//'
    
    } # sha_of_pubkeys
    
    
    count_sha_in_logs() {
    
    # Pass $1 with the key hash "SHA256:xxxxx"
    # We'll return stdout with "<tab>n time(s) in filename"
    
    regex="Accepted publickey for .* ssh2: .* $1$"
    grep -wc "$regex" /var/log/auth.log* |
      grep -v ':0$' |
      awk -F: '{printf "\t%8d time(s) in %s\n", $2, $1}'
    }
    
    
    ##############################
    #
    #       M A I N
    #
    ##############################
    
    
    [[ -r "$1" ]] || {
            printf "Can't read input file: %s\n" "$1"
            exit 1
    }
    
    # We'll identify pub keys by their (unique) comment field.
    # Store them in this array, indexed in order of occurrence.
    
    key_ids=()
    
    readarray -t key_ids << EOF
    $(
      # delete the first field (the hash) from sha_of_pubkeys stdout
      sha_of_pubkeys < "$1" |
        sed -Ee 's/^[^ ]* +//'
    )
    EOF
    
    # Store the SHA256 hash of each key in this array:
    
    key_shas=()
    
    readarray -t key_shas << EOF
    $(
      # the hash is the first field from sha_of_pubkeys
      sha_of_pubkeys < "$1" |
        awk '{print $1}'
    )
    EOF
    
    # How many unique keys did we find?
    
    n_ids=$(
    printf '%s\n' "${key_ids[@]}" |
      sort |
      uniq |
      wc -l
    )
    
    if ( [[ ${#key_shas[@]} -eq ${#key_ids[@]} ]] &&
         [[ ${#key_shas[@]} -eq ${n_ids} ]] )
    then
    
            printf '%d keys found in "%s".\nHere are their comment tags and key types:\n' ${n_ids} "$1"
    
            sha_count=()
            for i in $(jot $n_ids 0)
            do
                    printf '%4d ... %s\n' $(($i+1)) "${key_ids[$i]}"
                    sha_count+=( "$(count_sha_in_logs "${key_shas[$i]}")" )
            done
            printf '\n'
    
            for i in $(jot $n_ids 0)
            do
                    if [[ -z "${sha_count[$i]}" ]]
                    then
                            s='does not appear.'
                    else
                            s="$(printf 'appears:\n%s\n' "${sha_count[$i]}")"
                    fi
                    printf 'Key %d\n        label: "%s"\n   hash:  "%s"\n   %s\n\n' $(($i+1)) "${key_ids[$i]}" "${key_shas[$i]}" "$s"
            done
    
    else
    
            printf "Every key must have a comment field.\n"
            printf "Every comment field must be unique.\n"
            exit 1
    
    fi

出力:

$ sudo ./test.sh ~/.ssh/authorized_keys 
Password:
6 keys found in "/home/jim/.ssh/authorized_keys".
Here are their comment tags and key types:
   1 ... jim@w541 (RSA)
   2 ... admin@work-imac (RSA)
   3 ... admin@other-imac (RSA)
   4 ... [email protected] (RSA)
   5 ... [email protected] (ed25519) (ED25519)
   6 ... [email protected] (RSA)

Key 1
        label: "jim@w541 (RSA)"
        hash:  "SHA256:CvsACdXgliEpeQtUriFW87vpMZEbO6V7znj/3bhmPwo"
        does not appear.

Key 2
        label: "admin@work-imac (RSA)"
        hash:  "SHA256:x9wjIdW1OpGQhQ6rGiN25Vm2Y8og7/6lajHDK8jJAM4"
        does not appear.

Key 3
        label: "admin@other-imac (RSA)"
        hash:  "SHA256:LJ1DTCnQ6UAoXhmF3+4RqEbzCwiS+rZ3P692a8c/nNE"
        does not appear.

Key 4
        label: "[email protected] (RSA)"
        hash:  "SHA256:cTQi5zMvfYegFAzffkWngraE8B1lJCagOxrS+TkwSaA"
        appears:
               4 time(s) in /var/log/auth.log.1

Key 5
        label: "[email protected] (ed25519) (ED25519)"
        hash:  "SHA256:sPvGf5/+N3OkYlS3JV53esv2ASn+GDusMSbStaHkmik"
        appears:
               1 time(s) in /var/log/auth.log

Key 6
        label: "[email protected] (RSA)"
        hash:  "SHA256:58sSa6I24R+bsRgCMJ3v2Xog1G5bP7tP9o8V8dbVtec"
        does not appear.

これらのキーのほとんどは最近使用されていません。毎日のログローテーションを仮定すると、キー5は今日1回使用され、キー4は昨日4回使用されました/var/log/auth-log

sudo読み取り権限が必要なので、ファイルがどのくらいの頻度で参照されるかを確認/var/log/auth.log*することもできます。/root/.ssh/authorized_keys

$ sudo ./test.sh /root/.ssh/authorized_keys
8 keys found in "/root/.ssh/authorized_keys".
Here are their comment tags and key types:
   1 ... root@backup-host (RSA)
   2 ... ansible key (RSA)
   3 ... jim@jimsdesk (RSA)
   4 ... root@w541 (RSA)
   5 ... root@thumb (RSA)
   6 ... nagios@nagios-host (RSA)
   7 ... root@mrtg-host (RSA)
   8 ... jim@w541 (RSA)

Key 1
        label: "root@backup-host (RSA)"
        hash:  "SHA256:iHsBJAi3nZt3op/kuJLQShZg+hF94gBQi8mFBTa4gLI"
        appears:
               1 time(s) in /var/log/auth.log

Key 2
        label: "ansible key (RSA)"
        hash:  "SHA256:eedHBecrrsd8ESf4Ggl8S7my/p9YIhU77cvh/GrRxNY"
        does not appear.

Key 3
        label: "jim@jimsdesk (RSA)"
        hash:  "SHA256:cTQi5zMvfYegFAzffkWngraE8B1lJCagOxrS+TkwSaA"
        appears:
               4 time(s) in /var/log/auth.log.1

Key 4
        label: "root@w541 (RSA)"
        hash:  "SHA256:YmiLC7LFQ+mSE3SHkXzbpFuWi0HbIpGCaIUYuR6rAiM"
        does not appear.

Key 5
        label: "root@thumb (RSA)"
        hash:  "SHA256:Db+9kBzpOKy1DlOGYQB60njQ4uXVHBAl1pgBQ0+E0pg"
        does not appear.

Key 6
        label: "nagios@nagios-host (RSA)"
        hash:  "SHA256:dQWTtyWfp0eRyj1/6PHTLOKGOzS0hlktfd9Rqpg6vng"
        appears:
             574 time(s) in /var/log/auth.log
            1650 time(s) in /var/log/auth.log.0
            1650 time(s) in /var/log/auth.log.1
            1650 time(s) in /var/log/auth.log.2
            1650 time(s) in /var/log/auth.log.3
            1650 time(s) in /var/log/auth.log.4
            1650 time(s) in /var/log/auth.log.5
            1650 time(s) in /var/log/auth.log.6

Key 7
        label: "root@mrtg-host (RSA)"
        hash:  "SHA256:XLH0tz28SacSrur0pAfE2TB7mU37cm2BEH9IB/D+dew"
        does not appear.

Key 8
        label: "jim@w541 (RSA)"
        hash:  "SHA256:CvsACdXgliEpeQtUriFW87vpMZEbO6V7znj/3bhmPwo"
        does not appear.

関連情報