【问题标题】:IAM based ssh to EC2 instance using CloudFormation template使用 CloudFormation 模板的基于 IAM 的 ssh 到 EC2 实例
【发布时间】:2019-12-06 10:34:44
【问题描述】:

我正在使用 AWS CloudFormation 模板来基于 IAM 角色访问 EC2 实例。

我在运行模板时收到 permission denied error,但我无法使用没有 pem 文件的用户名访问 EC2 机器。

  Instance:
    Type: 'AWS::EC2::Instance'
    Metadata:
      'AWS::CloudFormation::Init':
        config:
          files:
            /opt/authorized_keys_command.sh:
              content: >
                #!/bin/bash -e

                if [ -z "$1" ]; then
                  exit 1
                fi
                SaveUserName="$1"
                SaveUserName=${SaveUserName//"+"/".plus."}
                SaveUserName=${SaveUserName//"="/".equal."}
                SaveUserName=${SaveUserName//","/".comma."}
                SaveUserName=${SaveUserName//"@"/".at."}
                aws iam list-ssh-public-keys --user-name "$SaveUserName" --query
                "SSHPublicKeys[?Status == 'Active'].[SSHPublicKeyId]" --output
                text | while read KeyId; do
                  aws iam get-ssh-public-key --user-name "$SaveUserName" --ssh-public-key-id "$KeyId" --encoding SSH --query "SSHPublicKey.SSHPublicKeyBody" --output text
                done
              mode: '000755'
              owner: root
              group: root
            /opt/import_users.sh:
              content: >
                #!/bin/bash
                aws iam list-users --query "Users[].[UserName]" --output text |
                while read User; do
                  SaveUserName="$User"
                  SaveUserName=${SaveUserName//"+"/".plus."}
                  SaveUserName=${SaveUserName//"="/".equal."}
                  SaveUserName=${SaveUserName//","/".comma."}
                  SaveUserName=${SaveUserName//"@"/".at."}
                  if id -u "$SaveUserName" >/dev/null 2>&1; then
                    echo "$SaveUserName exists"
                  else
                    #sudo will read each file in /etc/sudoers.d, skipping file names that end in ?~? or contain a ?.? character to avoid causing problems with package manager or editor temporary/backup files.
                    SaveUserFileName=$(echo "$SaveUserName" | tr "." " ")
                    /usr/sbin/adduser "$SaveUserName"
                    echo "$SaveUserName ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$SaveUserFileName"
                  fi
                done
              mode: '000755'     owner: root      group: root
            /etc/cron.d/import_users:
              content: |
                */10 * * * * root /opt/import_users.sh
              mode: '000644'    owner: root
              group: root
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                interval=1
              mode: '000400'  owner: root        group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub >
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.Instance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init --verbose
                --stack=${AWS::StackName}  --region=${AWS::Region} 
                --resource=Instance
                runas=root
          commands:
            a_configure_sshd_command:
              command: >-
                sed -i 's:#AuthorizedKeysCommand none:AuthorizedKeysCommand
                /opt/authorized_keys_command.sh:g' /etc/ssh/sshd_config
            b_configure_sshd_commanduser:
              command: >-
                sed -i 's:#AuthorizedKeysCommandUser
                nobody:AuthorizedKeysCommandUser nobody:g' /etc/ssh/sshd_config
            c_import_users:
              command: ./import_users.sh
              cwd: /opt
          services:
            sysvinit:
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
              sshd:
                enabled: true
                ensureRunning: true
                commands:
                  - a_configure_sshd_command
                  - b_configure_sshd_commanduser
      'AWS::CloudFormation::Designer':
        id: 85ddeee0-0623-4f50-8872-1872897c812f
    Properties:
      ImageId: !FindInMap 
        - RegionMap
        - !Ref 'AWS::Region'
        - AMI
      IamInstanceProfile: !Ref InstanceProfile
      InstanceType: t2.micro      
      UserData:
        'Fn::Base64': !Sub >
          #!/bin/bash -x
          /opt/aws/bin/cfn-init --verbose --stack=${AWS::StackName}
          --region=${AWS::Region} --resource=Instance
          /opt/aws/bin/cfn-signal --exit-code=$? --stack=${AWS::StackName}
          --region=${AWS::Region}  --resource=Instance

【问题讨论】:

  • 您列出的代码很多,因此人们可能不会花时间弄清楚它在做什么。你能澄清一下你真正想要做什么,以及你遇到了什么问题吗?例如,您是否要配置实例,以便人们可以使用密码而不是密钥对通过 SSH 连接到实例?
  • @JohnRotenstein - 它似乎通过读取与 CodeCommit 一起使用的公钥定期重建 .ssh/authorized_keys 文件。
  • @piyushraj - 大多数人通过在 S3 上存储 authorized_keys 文件来做到这一点。或者,如果您想要定期更新,请使用 Systems Manager 推送更改。如果您仍然想聪明一点,并通过读取用户的密钥来生成它,那么我建议编写(并完全调试!)一个 single 脚本,然后在系统启动时从 S3 检索该脚本.现在,您将系统初始化和运行时配置的任务混为一谈,并且以一种非常复杂的方式进行。
  • @JohnRotenstein 是的,我试图通过使用密码而不是密钥对 SSH 进入实例,并在 ec2 准备好后使用云形成,我无法访问它。没有可用的受支持的身份验证方法(服务器发送:publickey)

标签: amazon-web-services amazon-cloudformation amazon-iam


【解决方案1】:

此用户数据脚本将配置 Linux 实例以使用密码身份验证。

虽然这里的密码是硬编码的,但您可以通过其他方式获取它并将其设置为适当的值。

#!
echo 'secret-password' | passwd ec2-user --stdin
sed -i 's|[#]*PasswordAuthentication no|PasswordAuthentication yes|g' /etc/ssh/sshd_config
systemctl restart sshd.service

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 2018-10-06
    • 2017-05-13
    • 1970-01-01
    • 2023-02-04
    • 2019-12-29
    • 2021-12-08
    • 2013-02-22
    相关资源
    最近更新 更多