この記事では、Alibaba Cloud上のDevOps機能を探り、簡単なDevOpsツールを構築していきます。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
Alibaba Cloud Tech Share執筆者、ジョン・ハンリー。Tech Shareは、技術的な知識やベストプラクティスをクラウドコミュニティ内で共有することを奨励するAlibaba Cloudのインセンティブプログラムです。
少なくともLinuxの世界では、SSHは認証のための主要なセキュリティメカニズムです。SSHは、安全ではないネットワーク上でシステム管理やファイル転送を安全に行うことを可能にします。一般的には、ユーザ名とパスワード、そして SSHキーの 2 つの認証方法が使われます。クラウドの世界では、SSHキーをキーペアと呼んでいます。
ここでは、Linux ECSインスタンスへのアクセスを管理・制御するために、Alibaba CloudがどのようにSSHとキーペアを実装しているかを見ていきたいと思います。新しいECSインスタンス(この例ではUbuntu 16.04)を作成するとき、作成前にインスタンスにキーペアを割り当てるオプションがあります。次に、ECS インスタンスへの接続で使用するために、キーペアのプライベート部分をローカルシステムにダウンロードします。デフォルトでは、1人のユーザーのみが作成されます。それがユーザ・ルートです。
私はしばしば、ECS インスタンスにアクセスするために DevOps チームの各メンバーに root だけを使用するという過ちを犯している企業を見かけることがあります。これは悪い考えです。この記事では、追加のユーザーの作成、ユーザーごとのキーペアの作成、および一般に監査可能なセキュリティの提供について調査します。
ECS のドキュメントを確認しているときに、興味深い API - AttachKeyPair - に気づきました。この API は以下のような機能を持つことがドキュメント化されています。
1、SSH キーペアを Linux インスタンスにアタッチします。
2、SSH キーペアを使用すると、ユーザ名とパスワードによる認証方法は無効になります。
3、インスタンスが停止状態にある場合、インスタンスが起動するとすぐに SSH キーペアが有効になります。
4、インスタンスが実行中の状態であれば,インスタンスを再起動して操作を有効にしてください。
5、インスタンスが既にアタッチされた SSH キーペアを持っている場合は、新しい SSH キーペアが前のキーペアを置き換えます。
インスタンスのSSHキーペアを紛失してしまい、復旧方法を知りたいと思っているお客様がどれだけいるのか、私は言及することができません。もしかしたら、このECS機能はAlibaba Cloudの顧客にとってこの問題を解決してくれるかもしれません。
その1. ECSインスタンスのキーペアを交換
Alibaba Cloudの各コマンドを文書化したCLIのドキュメントが見つかりません。そこで、私はこのプロセスを経て、CLI機能の使い方を学びます。
このコマンドを実行します。
aliyuncli ecs
ECSのサポートコマンドの一覧を表示します。使用したいAPIに似たコマンドを探します。この場合はAttachKeyPairです。
次に、このコマンドを実行します。
aliyuncli ecs AttachKeyPair help
AttachKeyPair のコマンドラインオプションの一覧を表示します。
[ecs.AttachKeyPair]: current operation can uses parameters as follow :
--AccessKeyId | --AccessKeySecret
--InstanceIds | --KeyPairName
--OwnerId | --RegionId
--ResourceOwnerAccount | --ResourceOwnerId
--output | --profile
--version
次に、AttachKeyPairのAPIドキュメントを確認します。ドキュメントでは、RegionId、KeyPairName、およびInstanceIdsが必要であることが示されています。これは、AttachKeyPair のパラメータに対応しています。
1、--RegionId
2、--KeyPairName
3、--InstanceId
開発・テスト準備のステップ
1、Alibaba Cloud ECS Consoleにログイン
2、2つのキーペアを作成します。テスト1とテスト2(またはお好みの名前でも可)
3、両方のキーペアをローカルシステムにダウンロード
4、新しいECSインスタンスを作成します。OS Ubuntu 16.04 64ビット、キーペア:テスト1
5、パブリックIPアドレスとECSインスタンスIDに注意
6、コンソールでキーペア名を確認します。これが変更されるかどうかは後ほど確認します。
7、両方のキーペアを Bitvise (またはお好みの SSH クライアント) にインポートします。
8、キーペアテスト1とユーザ名rootを使用してECSインスタンスにSSHでログイン
私はこれを理解するのに苦労しましたが、ECSインスタンスIDの値をエスケープする必要があります。以下、WindowsとLinuxの場合の方法です。
Windows:
aliyuncli ecs AttachKeyPair --InstanceIds "[I-abcdeftvgllm854abcde\"]" --KeyPairName Test2
Linux:
aliyuncli ecs AttachKeyPair --InstanceIds '[I-abcdeftvgllm854abcde"] --KeyPairName Test2
このコマンドは成功を報告しました。
{
"FailCount": 0,
"TotalCount": 1,
"RequestId": "11CC0000-D577-4462-B410-ABCDEFCF2129",
"Results": {
"Result": [
{
"InstanceId": "i-abcdeftvgllm854abcde",
"Message": "successful",
"Code": "200",
"Success": true
}
]
}
}
コンソールに戻って、変更されたキーペアがコンソールに表示されていることを確認してみましょう。
ECSインスタンスを再起動し、Test1キーペアではなくTest2キーペアでログインできることを確認します。
aliyuncli ecs RebootInstance --InstanceId i-abcdeftvgllm854abcde
これでパート1は終了です。次のパートでは、ローカルシステムからキーペアを作成し、このキーペアをAlibaba Consoleにインポートし、このキーペアをテストインスタンスに割り当てる方法を学びます。
パート 2. ECS インスタンスキーペアの作成
使用するAPIはCreateKeyPairです。このAPIを見てみましょう。このAPIには以下のような機能があるとされています。
1、2048ビットのRSAキーペアを作成できます。
2、アリババは公開鍵を保持します。
3、アリババは、暗号化されていないPEM暗号化されたPKCS#8秘密鍵を返します。
4、リージョンごとに最大500個のキーペアを作成できます。
次に、このコマンドを実行します。
aliyuncli ecs CreateKeyPair help
CreateKeyPair のコマンドラインオプションの一覧を表示します。
[ecs.CreateKeyPair]: current operation can uses parameters as follow :
--AccessKeyId | --AccessKeySecret
--KeyPairName | --OwnerId
--RegionId | --ResourceOwnerAccount
--ResourceOwnerId | --output
--profile | --version
このコマンドを実行して、新しいキーペアを作成します。
aliyuncli ecs CreateKeyPair --RegionId us-west-1 --KeyPairName Test3
このコマンドは成功を報告しました。
{
"KeyPairFingerPrint": "7d6849d03953aa5584240de7c9d4b8c8",
"PrivateKeyBody": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAh1y3ot74ipDU+mHUZEBWDDT22VTkP0NVG4mOL1NQQYhGhccT\nKLqBKtiVeWG1PeHhHFJqrRYVW5qwgC4P/dYA+B+ztdHD1HYdRGwMSW0JxNL/rEy4\n4W9IxKh6jt9/XLUSIacNjtcHocPLF0Nw8/zsfcuSsvBB9EKhyep+c8qTKozWHb7O\nsbFlYXcKLo8rOpHTJIYOyR0Jrd2sR1zP8laB71+mvYtpuf90Rc23IxABn+Z+hefb\n7zSO/sQ2ve5aOaYMlWez8RoAPme2cGBszWFUvyT6GXWMGIucPuUOl9ATRN4DWmqw\n8LltgtLUDQk0Ji3svAYbC4+0dkhkrcfp4VzVlwIDAQABAoIBADSQK3sijG76aMnF\nvX0kgoWA965TScLLObxUwRLdjle0PHZsZKM3MTtbGUgmSgP6t7iQxH3sCmUk/472\n1BzkwkGXxeg/yYSyTREpx+enYNi+eqwEqvJXjXFYXycl4MY2RhEtVpV2KK+HYVDq\nTm1gdNEwgQndRC8+xKas2WfLbTRjJFapqW2zv3p1V83gVassrTLCCYSbV36jJO1z\nNpaU3feQPQL86+5ToNSoNepqYGInY6EYlKhkZHgVGRHsrqgPoyHGjBsyP4I3F1fO\njKcwPuGAerTn6MHtpW6m2kKnjz8qjClAPHY61ZmN9HIZHPTu1S7y9rHId5vy706X\nzwpQwpkCgYEA1H6/l6u2y1Rn2OSteIqTsxhZcJ3ICG8tSQp77fcFSi+LUDPAeBB9\nhvhiYpkzqj0sI5GIlXG+Wg7R8DwUxw6T+vQtFnFMdzqImqsU8+Qva/BqfRkFHsKO\n+FXGwLoWPVYJV25GD2gcDZpJ5KfNGv/hqrh0TEMtikVMKq30UaW58PMCgYEAoxNK\n+x3JnvzyMup/ZIgIlUjj2xy/V1AQq3+Ck3sQ9AaLZFuFPmHW1hKSXV/XBaDL3FfJ\nVVkWMRwmxgd4dMqosgWQYd69Qx5C3H0KKZh//9NpmV17WEiIknHSZbYxzeX14lsD\nWPiSeNdtrzTQRY0Q79JB2YTDUvABrRfJZe9eUc0CgYEAvg0q4MVktRCl3LgSaqhO\nl7TkcbO8r8Z300b8NoZjhclmKXJP51KgYrIOlK7/JXiW3K0SYs8bd8Kfg+TIlIx2\nT9JJ7TOiN1TzzpnLIKNqwniBVaemC6/pXTSikccdkvg7XKY1JRxxUr0277og2NAZ\nDq7w3TCML4nxKI7y4H+AAX8CgYA/T+o4fGQe2c2efvRer4HFk7sDArI2z9ro+mRT\npd/7Hd9YYz/j7FBgZG122xK8GKWNMnf0LtYy0t8q2xOlJFlCZG6d0MBiIomK2PDt\nHUv0orvI00ZkDCUZ1h79ZjMH4VQJQZSXIkqbp+fpsfN6TT5aHaN7M9QxiwTbkvSa\nIsjXsQKBgQCgMvR+jKE9OsCtM70eRBy0LDVEOjky7rce29I+cg3OZkAmKQ8qiE/S\no86+gQeQCMm9y9KiPHLVg9XIuZwkh+eVI4drRrEyM3InrHYLRtBuDfztCH9di+Ru\nF2w6y8t4/Kc5mSg0GBK725uTzfNdkyZE1TZAH6gx1KeSfMGGLP0mqw==\n-----END RSA PRIVATE KEY-----\n",
"RequestId": "01234562-5F4C-4DD9-BC42-ABCDEF26FF96",
"KeyPairName": "Test3"
}
さて、出力をどうすれば良いでしょうか?画面出力をファイルにコピーして、キーマネージャーにインポートするだけで試してみましたが、入力を拒否してしまいました。そして、出力がJSONデータであることに気づきました。そこで、CLIから出力を取り、JSONからPrivateKeyBodyをPEMファイルとして書き込むための簡単なプログラムを書きました。
write_pem.py
############################################################
# Version 1.00
# Date Created: 2018-05-17
# Last Update: 2018-05-17
# https://www.neoprime.io
# Copyright (c) 2018, NeoPrime, LLC
############################################################
"""
This program reads standard input and writes to standard output
The input is expected to be the output from the Alibaba Cloud CLI command:
aliyuncli ecs CreateKeyPair --RegionId us-west-1 --KeyPairName Test3
"""
import sys
import json
data = json.loads(sys.stdin.read())
print(data['PrivateKeyBody'])
Alibaba Consoleに戻り、Test3 Key Pairを削除します。ここでもう一度試してみますが、今回は出力をwrite_pem.pyに送信します。
aliyuncli ecs CreateKeyPair --RegionId us-west-1 --KeyPairName Test3 | python write_pem.py > Test3.pem
では、Test3.pemの内容を見てみましょう。
type Test3.pem
素晴らしいですね、これは普通のPEMファイルのようです。
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAmPJORshGZmC+vV58zMAGRBKJs0Bs/bSHvwQtu+ICSNDyUj9+
3l0yCXm3rbYHV0OT4sqMAhZf7dowryRpQRwU2f1YS6Jga/PnuOQ8rhHTgO8jImdj
OWKB02G6SCIB5M/ddrHiEeih/5dIPA4ztZjm3A2ps22KSDFOg0TOybK0HbnWbFKh
FIiS2QqoF4p0+Pe14jKkHEvFDKSIBs7WIAYIjCloQ7DfIy4StjPxUYD9xBbvN4vj
o47yMi9qyoXqyzrTZ1rcqiWeQuv8343sHJ6Rj+yO+yT+dZWCZiY7zMU5pKa3sDds
LD3XwqZYJ1X+ddMpmxngU5zBIi/uPzx7PFf05wIDAQABAoIBABPthktsrteKBXAx
DnuzDV3zOGPVoh3QVtuJlNflE70fFGOpCEO6ytk3Nbp5fC1fjbZAA8wF1EvuYOeB
DAHCwejBPK7mIkAOkIOjoVBg3Djxb5d89w20CwxasGXToIGKn+VmOflxYSInOO8y
PoSLvpCvawwI2rqbSgqKfZMEKLmyl9zQ6gAa4lLC3AMAxv9mFgfnTZtzXwNWmFXW
74MX5LGG8IEK4I18UBaKmYzBZOQ+gNVtKPnhYGe0MC51r6NvBVbA1FHnXSqiHZXq
Ra7g543BFmDa96cIT/hfRhOfY0RxvwE+/84e8/TQ6UqQt3ZPb7eaddIO15YluObC
7vOkDAkCgYEA5bww+BUdIEmZ2EwAScX7lHq1d/tMSGsosEp55IDyMDOAvdexVBVZ
xwVf8RRhWv7d2Y2PMqGQSp2I/4CTpdvfnA/E0usGtKfcgeRZBuSTmfiriUO3+8zm
G2J2Eg0mUqR2QoXlOzHJ62j70jP8JxC/yAyu5+qa6TiInfJftrwh9wMCgYEAqm6x
D3gX0fe0uTG3278jqU3n6ooy44f7gfrFsDvkJzYaUb3FwPKFfaRV9j6nfHd5B6Ks
EBp6WAqDle5cdLCO6J8GCp+9tweFHZ9SaGhDYHECmYzQUbdoDLlM2wYetfVWCgvz
e5CwuHYuX1oXrKwhrkYwxCtZJ/W57gp9zJuz400CgYEAi6uSigEsKAkXQ21Rb4iy
n17LHRrnEdA0eJmO6eGLXMqzJrgP03L3lgwqfENLvSrebfmmab3YH8UPGWduXJQE
qrjbjO/er86uPTo69fnZ0u5gO5+0J54298cwyWC9P9lFHMSSzR5ECJ9XGkEIuCdy
sYkkfVMgw1HfnUdR8aMHc0kCgYASLt0VGWrxK8xMNdG30Byt43Hqw/PJ8qgSpf6R
XtJonI0SS3zdqQI09WN2chjMXrK67dANp8WFvxlq1ZNnn66fgtfSKljDPjolfun7
2aPWljgAydUv4rFnKh3ZAD4mi5YyXDQN6tHv3Cv2YFZGRdcSEMsDItzQNpcvnk7t
lW8LwQKBgEP1uYJMV4HU3MJLqsyPZDTkkCA/a6g3Lkd7+XUlDfxMmm2Q7rjUI6su
l7yIU/T+zRW7+naytm7tPDiL3NoAFQG9bEJo+9nnobM6fsyVyX/jcVFQ+AnjTgE+
6h+ANs/jyLDnxUecSx2ITYA57lsapv+OatcPFnjUvi/+9Ut/vooI
-----END RSA PRIVATE KEY-----
このキーペアを ECS インスタンスに割り当て、再起動して、キーペア Test3.pem を使って SSH 経由で接続できることを確認してみましょう。
aliyuncli ecs AttachKeyPair --InstanceIds "[\"i-abcdeftvgllm854abcde\"]" --KeyPairName Test3 `
aliyuncli ecs RebootInstance --InstanceId i-abcdeftvgllm854abcde
パート3. ECS インスタンスキーペアのインポート
前の部分では、Alibaba Cloudを使ってキーペアを作成しました。これは、どこかの時点でAlibaba Cloudが私たちの秘密鍵を持っていることを意味します。ここでは、OpenSSLを使用してローカルに独自のキーペアを作成し、公開鍵だけをAlibaba Cloudにインポートする方法を調べてみましょう。
OpenSSLを使ってキーペアを生成します。
openssl genrsa -out Test4.pem 2048
公開鍵をローカルファイルに保存します。
# openssl rsa -in Test4.pem -pubout -out Test4.pub
ssh-keygen -y -f test5.pem > Test4.pub
新しいキーペア(Test4.pem)と公開鍵(Test4.pub)ができたので、これをクラウドにインポートして、テストインスタンスでこのキーペアを使用できることを検証してみましょう。
使用するAPIはImportKeyPairです。このAPIを見てみましょう。このAPIには以下のような機能があるとドキュメントに記載されています。
1、他のキーペア生成で作成したSSHキーペアの公開鍵をインポートします。
2、1リージョンあたり最大500個のキーペアを作成することができます。
3、サポートされている暗号化方式。
-----1、rsa
-----2、dsa
-----3、ssh-rsa
-----4、ssh-dss
-----5、ecdsa
-----6、ssh-rsa-cert-v00@openssh.com
-----7、ssh-dss-cert-v00@openssh.com
-----8、ssh-rsa-cert-v00@openssh.com
-----9、ssh-rsa-cert-v01@openssh.com
-----10、ssh-dss-cert-v01@openssh.com
-----11、ecdsa-sha2-nistp256-cert-v01@openssh.com
-----12、ecdsa-sha2-nistp384-cert-v01@openssh.com
-----13、ecdsa-sha2-nistp521-cert-v01@openssh.com
次に、ImportKeyPairのAPIドキュメントを確認します。ドキュメントでは、RegionId、KeyPairName、PublicKeyBodyが必要であることが示されています。これはImportKeyPairのパラメータに対応しています。
1、--RegionId
2、--KeyPairName
3、--PublicKeyBody
注:PublicKeyBodyのフォーマットが何なのか、どこにも見当たりませんでした。
Test4.pubの内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrk3VshObZ8zz6DLQb6yUhC8+gOrm/tu8psXASVPh4FqTkfiMu/DuTNfUV+j3KYTBnHdfEZoydtNNt1JrXi3rngvZsfgBzGw8Yqoyu+CdsR3wrI2LCqgpAOa06MS6iydu+xRo8c/JTZHpscE/igxqF4bNIYHVCHoBV6wKSo4VQSN0m8UB3Je1u9ga0V4jXpPPJZnBa3n9aafNzikTFeycBwbauJjsrY2IpL3xybkwPE14hdkbUxMEFu9cO+FNSTPFGq5UxXsS1vQkPySm5WHgF/N4zC/HMfiNjwwiwKxW+GZnOsCKSbqBBFwRJj+7N3OlIZ2sgEBSQGHYAWAEHU7Od
最後のコマンドはこのようになります:
aliyuncli ecs ImportKeyPair --RegionId us-west-1 --KeyPairName Test4 --PublicKeyBody "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrk3VshObZ8zz6DLQb6yUhC8+gOrm/tu8psXASVPh4FqTkfiMu/DuTNfUV+j3KYTBnHdfEZoydtNNt1JrXi3rngvZsfgBzGw8Yqoyu+CdsR3wrI2LCqgpAOa06MS6iydu+xRo8c/JTZHpscE/igxqF4bNIYHVCHoBV6wKSo4VQSN0m8UB3Je1u9ga0V4jXpPPJZnBa3n9aafNzikTFeycBwbauJjsrY2IpL3xybkwPE14hdkbUxMEFu9cO+FNSTPFGq5UxXsS1vQkPySm5WHgF/N4zC/HMfiNjwwiwKxW+GZnOsCKSbqBBFwRJj+7N3OlIZ2sgEBSQGHYAWAEHU7Od"
これは複雑なので、Python プログラムの方が良い選択です。
このキーペアをECSインスタンスに割り当て、再起動して、キーペアTest4.pemを使ってSSHで接続できることを検証してみましょう。
aliyuncli ecs AttachKeyPair --InstanceIds "[\"i-abcdeftvgllm854abcde"] --KeyPairName Test4
コマンドは以下のように返します。
{
"KeyPairFingerPrint": "883aff9af03f3ee5dd0e186099a2e173",
"RequestId": "11CC0000-4675-4F9A-887F-ABCDEFEF7D5B",
"KeyPairName": "Test4"
}
新しいキーペアを有効にするには、ECS インスタンスを再起動する必要があります。
aliyuncli ecs RebootInstance --InstanceId i-abcdeftvgllm854abcde
その4. ユーザーの作成とSSH公開鍵の割り当て
注:このセクションはUbuntu 16.04を対象としています。ほとんどの Linux のバージョンでも同様の手順を踏んでいます。
このセクションでは、新しいグループ "developers "を作成し、開発者グループの一部として新しいユーザー "john "を作成し、sudo権限を割り当て、最後にSSHキーを割り当ててログインします。
ステップ1~4はECSインスタンスに対して実行されます。
ステップ1. developersという名前の新しいグループを作成します。groupaddコマンドでは、グループIDに一意の番号を指定する必要があります。ファイル /etc/group の内容を表示します。一番高い数字を探します。私のシステムでは118です。新しいグループIDには1000を使用します。
# cat /etc/group
以下のコマンドを実行して、グループID 1000の開発者という名前のグループを作成します。
# groupadd -g 1000 developers
ステップ2. johnという名前の新しいユーザーを作成します。このコマンドを実行すると、ユーザーのパスワードやユーザー情報などの入力を求められます。
# adduser john
コマンドの出力を確認します。項目の一つは、新しいユーザーのホームディレクトリになります。このパスは後で必要になります。私の場合、ホームディレクトリは /home/john です。
ユーザjohnを開発者グループに追加します。
# adduser john developers
ステップ3. システムの管理に必要なときにroot権限を持つように、このユーザーを「sudo」グループに追加します。このユーザーがログインしたら、必要なのは各コマンドの前にある sudo コマンドを使って管理者権限を取得することだけです。
# usermod -aG sudo john
ステップ4. SSH 鍵用のディレクトリを作成します。ユーザが SSH を使ってリモートでログインすると、SSH サーバは /home/username/.ssh/authorized_keys というファイルの中に一致する公開鍵を探します。一致する公開鍵が見つかった場合、ユーザはアクセスを許可されます。このファイルには、1 行に 1 つずつ、複数の公開鍵を格納することができます。
# cd /home/john
# mkdir .ssh
空の authorized_keys ファイルを作成します。
# touch /home/john/.ssh/authorized_keys
SSH は、SSH 鍵の漏洩を防ぐためにファイルやディレクトリのパーミッションを強制します。これらの手順をスキップしないようにすることが重要です。
# chmod 700 /home/john/.ssh
# chown john /home/john/.ssh
# chmod 600 /home/john/.ssh/authorized_keys
# chown john /home/john/.ssh/authorized_keys
ステップ5. 新しいキーペアを作成します。上記と同じ手順で行います。公開鍵が作成できたら、公開鍵の内容をauthorized_keysというファイルに追加します。
以下のコマンドは、Windows システム上で実行されます。
OpenSSLを使用してキーペアを生成します。
openssl genrsa -out john.pem 2048
公開鍵をローカルファイルに保存します。
ssh-keygen -y -f john.pem > john.pub
john.pub の内容を Linux システムの /home/john/.ssh/authorized_keys に追加します。
秘密鍵 john.pem を Bitvise (またはお気に入りの SSH キーマネージャ) にインポートします。
開発者向けドキュメント
コマンドラインインターフェイス(CLI):
サーバーロードバランサー(SLB):
1、サーバーロードバランサーのドキュメントページ
2、サーバーロードバランサー開発者ガイド
Elastic Compute Service(ECS):
1、Elastic Compute Service ドキュメントページ
2、Elastic Compute Service Developer Guide
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ