Я создаю использование экземпляра EC2 CloudFormation. Первой вещью, которую я хочу сделать, является контроль репозиторий мерзавца, содержащий марионеточные декларации. Чтобы сделать это, мне нужен ключ SSH.
Что лучший способ состоит в том, чтобы надеть ключ к серверу? Это - то, что я рассмотрел:
UserData
свойство, но (несмотря на он - имя) это походит на неправильное место для хранения любого вида данных, уже не говоря об уязвимых данных Это кажется, что была бы общая вещь сделать, однако я должен искать неправильные вещи, потому что я не могу найти разумный ответ.
Простой способ справиться с этим - сохранить ваши секреты (например, ключ 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
, чтобы назначить этот профиль экземплярам.
После этого секретная корзина должна быть доступна для чтения.
Подход 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.