It’s been nearly a year since I posted here. I should get back in the habit. Here’s a useful bit of information.
I want to create new EC2 Linux instances with separate administrative accounts for one or more specific people, for example: john, mary, rob, and sue. I don’t want to use a single shared ec2-user account or any shared SSH key pairs. So, for each of the usernames, I do the following (using “john” in the examples below):
1. Put the public keys of each key pair in a private S3 bucket at a known place, for example my_bucket/publickeys/john.pub
2. In my CloudFormation template, I specify an IAM role and policy for the new instance that has permission to read objects in that bucket with the common prefix:
3. Add the following lines to the UserData start script:
echo john ALL = NOPASSWD:ALL > /etc/sudoers.d/john
4. And add a new entry to the “files” section of the CloudFormation template:
Step 1 puts the user’s public key in a bucket for letting retrieval by the instance. Step 2 gives the new instance permission to fetch those public keys. Step 3 creates the account without a password for that user and gives the account the ability to use sudo without a password, just like the ec2-user account has. And Step 4 fetches the public key and puts it in the right place for ssh to find it and allow the user to log in with it.
I launch the instance with no specified key pair name, and now any of the desired users can ssh in to it with their own separate account and key pair, and there are no shared credentials. The ec2-user account still exists just in case there’s any need for it to own things, but you can’t log in to it.