Я создаю экземпляр EC2 с помощью CloudFormation. Первое, что я хочу сделать, это проверить репозиторий git, содержащий манифесты марионеток. Для этого мне нужен SSH-ключ.
Как лучше всего получить ключ к серверу? Вот что я рассмотрел:
UserData
свойство, но (несмотря на название) это кажется неправильным местом для хранения любых данных, не говоря уже о конфиденциальных данных Кажется, это обычное дело, однако я должен искать неправильные вещи, потому что не могу найти разумного ответа.
Подход S3 bucket не работает, если вам нужен ключ SSH для репозитория кулинарных книг OpsWorks или развертывания приложения.
Другое решение - вы можете добавить параметр типа CommaDelimitedList
для ключа SSH с заменой новой строки запятыми, затем используйте Fn::Join
чтобы снова соединить линии ключа там, где вам это нужно.
Пример шаблона CloudFormation:
{
"Parameters": {
"CookbooksDeployKey": {
"Type": "CommaDelimitedList",
"Description": "Enter the deploy key as CSV (replace newlines with commas)",
"NoEcho": true
}
},
"Resources": {
"myStack": {
"Type": "AWS::OpsWorks::Stack",
"Properties": {
"CustomCookbooksSource": {
"Type": "git",
"Url": "git@github.com:user/repository.git",
"Revision": "master",
"SshKey": {"Fn::Join": ["\n", {"Ref": "CookbooksDeployKey"}]}
}
}
}
}
}
Чтобы сгенерировать однострочную версию файла закрытого ключа в формате "CSV", можно использовать следующую команду sed (она просто заменяет все символы новой строки в файле запятыми и возвращает результат на стандартный вывод):
sed ':a;N;$!ba;s/\n/,/g' /home/user/.ssh/id_rsa
Результат выглядит примерно так:
-----BEGIN RSA PRIVATE KEY-----,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,-----END RSA PRIVATE KEY-----
Затем вы можете вставить это значение в параметр при создании или обновлении стека в CloudFormation.
Самый простой способ справиться с этим - сохранить ваши секреты (например, ключ SSH) в выделенном сегменте S3, а затем предоставить экземплярам EC2 доступ к этому сегменту.
Вы можете начать с создания роли IAM:
"DeploymentRole" : {
"Type" : "AWS::IAM::Role",
"Properties" : {
"Policies" : [{
"PolicyName" : "SecretsBucketPolicy",
"PolicyDocument" : {
"Version" : "2012-10-17",
"Statement" : [{
"Resource" : "arn:aws:s3:::wherever-the-secrets-are-stored/*",
"Action" : ["s3:GetObject"],
"Effect" : "Allow"
}]
}
}],
"Path" : "/",
"AssumeRolePolicyDocument" : {
"Version" : "2012-10-17",
"Statement" : [{
"Action" : ["sts:AssumeRole"],
"Principal" : {"Service": ["ec2.amazonaws.com"]},
"Effect" : "Allow"
}]
}
}
}
Эта роль определяет политику, которая позволяет ему читать секретное ведро, и позволяет EC2 взять на себя эту роль.
Затем вы создаете профиль экземпляра для этой роли:
"DeploymentProfile" : {
"Type" : "AWS::IAM::InstanceProfile",
"Properties" : {
"Roles" : [{"Ref" : "DeploymentRole"}],
"Path" : "/"
}
}
Для вашего экземпляра EC2 или конфигурации запуска теперь вы можете использовать IamInstanceProfile
свойство, чтобы назначить этот профиль экземпляру (ам).
После этого секретное ведро должно быть доступно для чтения.