SSHの鍵の指紋が正しいものかどうかチェックする方法

sshしたときに、 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! と出ることがあります。

以下のような感じで、出てきたときはドキッとします。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!

何がよくないのか

以前接続した時と、接続先のサーバ側から送られてきた鍵が変わっているので、中間者攻撃されている可能性があります。 サーバを初期化等して、鍵が再生成されたなど、見に覚えがあるなら大丈夫ですが、見に覚えがないなら接続はやめて中間者攻撃の可能性を疑うべきです。

最初から中間者攻撃されていたらどうなるのか

そもそも、最初から中間者攻撃されている状態で何も確認せずにsshしていると、状況が変わらなければ前述の警告が出ることもなく、中間者攻撃の可能性に気づけません。

ちゃんと確認しようと思ったらどうすればいいのか調べました。

サーバの指紋の確認方法

サーバの正しい指紋(フィンガープリント)を確認するには、中間者攻撃されない何かしら安全な方法(キーボードとディスプレイを直接接続したり、信頼できるネットワークのみを経由してsshしたり)でサーバにログインします。

/etc/ssh/ssh_host_ecdsa_key.pub もしくは /etc/ssh/ssh_host_rsa_key.pubssh接続先サーバ側の公開鍵なので、 ssh-keygen コマンドを使って指紋となるハッシュ値を求めます。

user01@srv01:~$ ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:mnLsmamD2kVSIsIoKt5xwx0qfow5jPEY76ya5LOc14A root@srv01 (ECDSA)

user01@srv01:~$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
2048 SHA256:ALJaHkKsMzl9ua1laFt2FWJlKliKkFtEG20dsIWU9PA root@srv01 (RSA)

上の例だとSHA256ハッシュでしたが、バージョンによってはMD5が使われることもあるのでMD5のハッシュも取得しておきます。

user01@srv01:~$ ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:79:a6:3f:a3:20:ef:ab:09:a2:8c:f1:9d:9a:bb:b6:dc root@srv01 (ECDSA)

user01@srv01:~$ ssh-keygen -E md5 -lf /etc/ssh/ssh_host_rsa_key.pub
2048 MD5:27:d2:80:80:ce:b7:3e:fe:fc:58:c2:7a:af:1d:f5:b4 root@srv01 (RSA)

クライアント側で保存したサーバの公開鍵の正当性の確認方法

初めてsshするときはサーバ側の指紋が表示されて、正しいかどうか確認をされますが、既に接続したことのあるサーバに関しては ~/.ssh/known_hosts にサーバ側の公開鍵が保存されています。これらの指紋を確認するには、同様に ssh-keygen コマンドを使えばよいです。

$ ssh-keygen -lf ~/.ssh/known_hosts
256 SHA256:mnLsmamD2kVSIsIoKt5xwx0qfow5jPEY76ya5LOc14A 192.168.1.1 (ECDSA)
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspR1mTxddAAAsikw5E5SY8 srv01.example.com,192.168.120.2 (RSA)

サーバ側とクライアント側で取得した指紋がぴったり一致していればそのsshの接続は中間者攻撃されていないということがわかります。

Touch Bar付きモデルのMacBook Proでスリープのショートカットキーを設定する

最近Touch Bar付きモデルのMacBook Pro (Late2016)を使い始めたのですが、Macをスリープさせるショートカットキーが効かなかったので代替方法を調べました。

今までのやり方

今までは、Command + Option + 電源(or Eject)ボタン を押すことでMacをスリープさせられました。

Touch Bar付きモデルでのやり方

Touch Bar付きモデルでは今までのやり方が使えないようです。ヘルプページに書いてありました。

MacBook Pro で Touch ID を使う - Apple サポート

電源を入れる/再起動する/スリープ状態にする/システム終了する 旧型の Mac ノートブックとは違い、2016 MacBook Pro の Touch ID (電源ボタン) を長押ししても、「再起動」「スリープ」「システム終了」のオプションがあるダイアログは表示されません。

電源ボタンの長押しでもできないようです。 ただ、代替方法が書いてありました。

MacBook Pro をスリープ状態にするには、Apple メニュー >「スリープ」の順に選択します。Touch Bar の Control Strip に「スリープ」ボタンを追加することもできます。以下の手順で Control Strip をカスタマイズしてください。

タッチバーをカスタマイズすることでタッチバーにスリープボタンを割り当てることができるようです。

設定方法

システム環境設定 > キーボード > Control Stripをカスタマイズ

f:id:kuro_m88:20170123233649p:plain

タッチバーに割り当てるボタンの一覧が画面に出てくるので、 スリープ ボタンをドラッグして下のタッチバーまで持ってきます。(僕は画面をロックボタンも割り当てることにしました)

f:id:kuro_m88:20170123233859p:plain

以下がタッチバーにスリープボタンと画面ロックボタンを配置してみたスクリーンショットになります。

f:id:kuro_m88:20170123234200p:plain

これで今まで通り好きなタイミングでスリープさせたりロックさせることができそうです。

aws-cliのrun-instancesコマンドでEC2インスタンス作成時にtagも同時に付与する方法

aws-cliaws ec2 run-instances コマンドでEC2インスタンスcliから作ることができるが、その際、EC2インスタンスにつけるtag(Nameとか)も一緒に設定しようと思ったが、仕様的にできないらしい。

対応策

仕方がないので、jqコマンドで aws ec2 run-instances コマンドの結果をパースして、 aws ec2 create-tags コマンドに instance-id を渡すようにしてみた。

aws ec2 run-instances [コマンドオプション...] | jq -r '.Instances[0].InstanceId' | xargs -IINSTANCE_ID aws ec2 create-tags --resources INSTANCE_ID  --tags Key=Name,Value=[インスタンスの名前]