At AWS, security is our top priority. We strongly recommend implementing comprehensive security controls across all application layers to ensure defense-in-depth. This multi-layered approach helps protect your workloads, data, and infrastructure from potential threats. In this post, we walk through implementing an additional layer of authentication security for your Amazon Linux 2023 (AL2023) Amazon Elastic Compute Cloud (Amazon EC2) instances by using two-factor authentication while connecting to the instance through Secure Shell (SSH).
SSH Access Security Fundamentals
The most common tool to connect to Linux servers is SSH. When an EC2 instance is launched, you are prompted to either create a new key pair or use an existing key pair to connect to the EC2 instance using SSH. The key pair is a combination of a private and public key, where the public key is stored within the instance in the ~/.ssh/authorized_keys
file, while the private key is stored in the user’s machine. A compromised local machine containing SSH private keys poses a significant security risk. An attacker who obtains both the private key and the corresponding EC2 instance username could gain unauthorized SSH access to your instance with the same permissions as the compromised user account. To prevent anyone with the private keypair from accessing the instance you should implement two-factor auth through multi-factor authentication (MFA).
Configuring security groups to allow unrestricted SSH access (0.0.0.0/0
) to EC2 instances’ public IP addresses creates a significant security vulnerability. This practice exposes your instances to potential brute force attacks and unauthorized access attempts from anywhere on the internet. To overcome this, we either recommend a user restricts the access to only “My IP” in the security group, or to have a bastion host or a jump box in front of your instances and access your instances through your bastion host. Implementing MFA on top of this would tighten the security while accessing the instances through SSH.
The following figure shows a common architecture anti-pattern:
The following figure shows the recommended architectures:
Prerequisites
Before proceeding, install the Google Authenticator app on your mobile device – you’ll need it to generate one-time passwords (OTPs) for Multi-Factor Authentication (MFA) on your Amazon Linux 2023 instances.
Configuration Steps
Install Google Authenticator in the EC2 instance
Login to the instance and install Google Authenticator and its dependencies.
Configuring Google Authenticator
After installing the package, the application has to be initialized to generate a key for the user that you are logged in as (for example ec2-user
) to add the authentication to that user account. Execute the following command to initialize the application.
This generates a QR code that you should scan using your Google Authenticator app. Then, enter the verification code from the application in the terminal after scanning, or manually enter the account name, which is any name, to recognize the instance and the secret key displayed in the terminal in the application to register your instance. After confirming the code, the system will generate emergency scratch codes. Store these codes securely – they serve as backup authentication methods if you lose access to your Google Authenticator app or mobile device. Each scratch code can be used only once.
After registering the instance details in the mobile application through QR code or manual operation, in the SSH terminal you are asked if the google_authenticator
file should be updated for user ec2-user
. Typing y
saves the secret key, scratch codes, and the other configuration options that you select later on in the file. Run the initialization app and go through the same procedure for each user account to enable MFA on each account.
Choose y
for the following question to refuse multiple uses of the same authentication token to enhance security and prevent a man-in-the-middle attack.
Choose n
for the following question to have three valid codes in a 1:30-minute window unless you are facing issues.
Choose y
for the following question to enable rate-limiting to protect against brute-force logic attempts.
Configure SSH to use the Google Pluggable Authentication module
By default PAM is not configured to use MFA for SSH connections. Now that you have the MFA module configured and running, you must modify the PAM configurations to use MFA authentication.
There are two options for configuration to choose from based on your requirement.
Option 1: Configuring MFA for all users in the instance
Add the following to the bottom of the file to use Google Authenticator to enforce MFA for SSH connections. When this option is enabled, the system will prompt all users for MFA during SSH connections, regardless of whether MFA has been configured for their individual accounts. This applies to every user attempting to access the instance, which may disrupt access for users without MFA configuration.
Important: Before implementing this setting, ensure all users who need instance access have properly configured MFA to prevent potential lockouts.
Option 2: Configuring for specific users without affecting others
If there are other service accounts or users within the instance that should be able to log in without MFA, then add nullok
at the end of the following statement. This means that users who don’t run Google Authenticator initialization won’t be asked for a second authentication.
Comment out the password requirement, as SSH key pairs provide stronger security than password-based authentication. In this configuration, users will need both an SSH key and a verification code from Google Authenticator to establish an SSH connection – eliminating password prompts while maintaining robust security through two-factor authentication. Note that if you leave password authentication enabled (by not commenting out this line), users will be required to provide three factors: their SSH key, password and MFA code to access the instance.
Save the file. You must change the SSH configuration to make it prompt for a second authentication. Run the following command to make changes in the configuration file.
Then, change ChallengeResponseAuthentication no
to ChallengeResponseAuthentication yes
.
Lastly, you must let SSH know that it should use key pair along with interactive authentication for the MFA module to login. At the bottom of the file, add the following:
Save the file. Restart the SSH service running in the instance to let the changes take effect. Restarting the SSH service (the SSH daemon) stops the main sshd process and starts a new one, but it doesn’t disconnect existing SSH sessions.
To test the solution, open a new terminal window and SSH into the instance, and you are asked for a verification code. Keep your session in the original terminal window open while you SSH from your new window.
Type the code that’s generated on your Google Authenticator app and you are logged in to your instance.
Using MFA allows to add a further layer of security to Amazon Linux 2023 EC2 instances while logging in.
Cleanup
To avoid incurring charges, please stop or terminate the launched Amazon EC2 instance if not in use.
Conclusion
In this post, you learned how to enhance your Amazon Linux 2023 EC2 instance security by implementing multi-factor authentication (MFA) with Google Authenticator. This setup requires users to provide both their SSH key pair and a time-based one-time password from their application when connecting to instances, adding an essential extra layer of protection.