AWS CloudFormation дает экземпляру EC2 Ключи SSH к другим серверам

Я создаю использование экземпляра EC2 CloudFormation. Первой вещью, которую я хочу сделать, является контроль репозиторий мерзавца, содержащий марионеточные декларации. Чтобы сделать это, мне нужен ключ SSH.

Что лучший способ состоит в том, чтобы надеть ключ к серверу? Это - то, что я рассмотрел:

  • Используя KMS, но это, кажется, не позволяет Вам "хранить ключ для более позднего использования"
  • Используя пары ключей EC2, но это также, кажется, не позволяет Вам получить закрытый ключ позже
  • Вписывание в ключ UserData свойство, но (несмотря на он - имя) это походит на неправильное место для хранения любого вида данных, уже не говоря об уязвимых данных
  • При хранении его в блоке S3, но я не на 100% уверен, как установить полномочия на блоке, чтобы позволить экземпляру EC2 вытягивать данные с помощью aws cli инструмент

Это кажется, что была бы общая вещь сделать, однако я должен искать неправильные вещи, потому что я не могу найти разумный ответ.

1
задан 15 July 2015 в 19:44
2 ответа

Простой способ справиться с этим - сохранить ваши секреты (например, ключ 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 , чтобы назначить этот профиль экземплярам.

После этого секретная корзина должна быть доступна для чтения.

1
ответ дан 3 December 2019 в 17:39

Подход 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.

3
ответ дан 3 December 2019 в 17:39

Теги

Похожие вопросы