私は複数のsysadminノートブックと複数のサーバーを持っています。私はrotate_keys.sh
すべてのsysadminラップトップで実行されるスクリプト(呼び出し済み)を介してサーバーのSSHキーを管理/回転しています。
私は次のルールを作成しました。サーバーごとに特定のシステム管理者のラップトップに最大1つの(最新の)SSHキーを保持します。
authorized_keys
SSHキーは次の形式のファイルに保存されます。
key1 user@device1-hostname
key2 user@device2-hostname
key3 user@device3-hostname
update_keys.sh
各サーバーには、sshを介して実行されているときに現在接続されているシステムに関連するすべてのキーを削除するスクリプト(と呼ばれる)があります。私は与えられたクライアントホスト名を含むすべての行を削除してこれを試しました。
sed -i "/$client_hostname/d" authorized_keys
サーバーは、$SSH_CONNECTION
環境変数(Sshセッションの開始時に設定)でIPアドレスの逆方向DNSルックアップを実行して、クライアントのホスト名を取得します。
client_ip=$(echo $SSH_CONNECTION | awk '{print $1}')
client_hostname=$(nslookup $client_ip \
| tail -2 \
| head -1 \
| awk '{print $4}')
これにより、ホスト名が次の形式で返されます。
device-hostname.router-hostname.
より良い用語がないので、「完全なホスト名」を提供します。
ただし、ホスト名には、authorized_keys
これらのデバイスが接続されているルーター(サブネット)のホスト名が省略されています。彼らはただ次のように見えます:
device-hostname
したがって、次の削除コマンドを実行すると、一致するものはありません。
sed -i "/$client_hostname/d" authorized_keys
sshデーモンが「正規化された」ホスト名を記録するように強制する方法はありますか?それとも、接続されているルーターのホスト名を除いてデバイス名のみを知らせるDNSルックアップツールはありますか?
sshデーモン(サーバー)でリバースDNSを無効にする代わりに、上記の2つの方法のいずれかを使用することをお勧めします。これを行うには、私のsysadminノートブックに固定IPが必要なためです。
答え1
次のawkコマンドを試してください。
nslookup $client_ip | awk '/name =/ { split($4,add,".") } END { print add[1]}'
これにより、nslookup コマンドが実行され、name= を含むすべての行が検索され、4 番目のスペースで区切られたスペースフィールドが分割されます。結果を配列 add に入れます。次に、見つかった最後のエントリのホスト名を表示するために、配列の最初の要素を印刷します。