Aws How To Ssh Into Ec2

Aws How To Ssh Into Ec2

Reading time1 min
#AWS#Cloud#Security#EC2#SSH#SessionManager

Mastering SSH Access to EC2: Secure, Efficient Connection Practices Beyond the Basics

Direct SSH access to Amazon EC2 forms the backbone of most infrastructure management workflows, but typical practices rarely hold up under scrutiny—especially when threat models or compliance standards tighten. Basic key-pair authentication is the default, but treating SSH as a fire-and-forget utility leaves both security and operational efficiency on the table.

Below: patterns and countermeasures field-tested across AWS environments managing hundreds of instances—plus practical examples beyond the usual “connect with a .pem file”.


SSH Is Your First Attack Surface

A lost SSH private key, or a security group exposing port 22 to the world (0.0.0.0/0:22), invites unnecessary risk. Regulated environments (PCI DSS, HIPAA, SOC 2) outright forbid weak control of administrative access. This alone justifies extra rigor in session controls, key distribution, and audit logging.


Standard SSH: Refresh in 20 Seconds

The canonical command—still valid, but full of technical friction at scale:

ssh -i ~/.ssh/aws-demo.pem ec2-user@ec2-18-210-XX-XX.compute-1.amazonaws.com
  • .pem keypair typically lives in ~/.ssh/—should be permission mode 0400; otherwise, expect:
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: UNPROTECTED PRIVATE KEY FILE!              @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    
  • Username is AMI-dependent: ec2-user (Amazon Linux, RHEL), ubuntu, or admin.
  • DNS/IP: changes on instance stop/start unless using Elastic IPs.

Side note: If you’re passing the key path via -i every time—this does not scale. See below.


Key Management: Beyond Lone PEMs

Agent Setup—Eliminate Manual Key Churn

Store keys in ssh-agent rather than referencing the .pem file directly.

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/aws-demo.pem

Benefits:

  • Avoids credential exposure in command histories and process lists.
  • Enables agent forwarding across complex jump-host/double-hop topologies.

SSH Agent Forwarding Caveat:
Agent forwarding (ForwardAgent yes) is powerful but opens risk if any intermediate server is untrusted. Use only with hosts under your admin.

Per-User Key Pairs & IAM

Stop sharing a company-wide PEM among operators. Instead, provision per-user key pairs, record which key belongs to whom, and set up fine-grained IAM restrictions for access (e.g., limit SSM actions via resource tags). Map each access to an individual, not an amorphous “DevOps group”.

No Public IPs: SSM Session Manager as the Bastion, Not SSH

Remove the hard dependency on public-facing SSH. AWS Systems Manager Session Manager provides shell access without public IPs or open security group rules.

Required Setup:

  • IAM Role: Attach AmazonSSMManagedInstanceCore to the instance.
  • Confirm SSM Agent >= 3.0 is installed. All Amazon Linux 2 AMIs post-2018.03, Ubuntu 18.04+, and Windows Server 2019+ should be fine.
  • Verify network reachability: either a route to public SSM endpoints or configure private VPC endpoints for air-gapped environments.

Command-line session launch:

aws ssm start-session --target i-0781e29cXXXXXX

Advantages:

  • All session start/stop events are logged in CloudTrail.
  • Enforce least privilege by attaching SSM permissions to user roles (try restricting to os-level commands, not interactive shell).
  • No exposure to noisy bots forever probing port 22.

Gotcha:
Legacy Ubuntu AMIs and custom distros sometimes lack the SSM Agent or it runs with outdated configs. Verify via systemctl status amazon-ssm-agent.


Harden SSH Daemon for Remaining Direct Access

Not every instance is guaranteed SSM-ready—kubernetes node pools, embedded devices, or AMIs with custom init. For those:

  • Disable root login:
    PermitRootLogin no
  • Disable password authentication:
    PasswordAuthentication no
  • Restrict logins:
    AllowUsers ec2-user opsadmin
  • Rotate away from port 22:
    Example:
    Port 4422
    PermitRootLogin no
    PasswordAuthentication no
    AllowUsers ec2-user devlead
    
    Restart with sudo systemctl restart sshd.
    Note: Custom ports help, but port scanning will still find you. Use with strict network ACLs.

~/.ssh/config: Stop Repeating Yourself

Managing several environments means distinct keys, usernames, and sometimes jump hosts. Populate ~/.ssh/config:

Host prod-app
    HostName ec2-18-194-XX-XX.compute-1.amazonaws.com
    User ec2-user
    IdentityFile ~/.ssh/prod-app.pem
    ForwardAgent no

Host dev-db
    HostName ec2-54-93-XX-XX.eu-central-1.compute.amazonaws.com
    User ubuntu
    IdentityFile ~/.ssh/dev-db.pem
    Port 4422

This allows simple commands (ssh prod-app) and prevents mistakes attaching the wrong key.

Tip:
For multi-hop scenarios (on-prem jump hosts, private subnets), combine ProxyJump syntax:

Host staging-bastion
    HostName bastion.company.com
    User ubuntu
    IdentityFile ~/.ssh/company-bastion.pem

Host staging-internal-*
    ProxyJump staging-bastion
    User ec2-user

This ensures all SSH sessions go via the bastion by default.


MFA Enforcement for SSH via SSM & IAM

For environments needing traceable access with strong identity guarantees, enforce AWS IAM MFA before session startup.
Attach policies conditional on:

"Condition": {
  "Bool": { "aws:MultiFactorAuthPresent": "true" }
}

Sessions started without valid MFA will be denied—see SSM session denial events for troubleshooting.


Automation at Scale: Parallel SSH & SSM Automation

For coordinated tasks—patching, log collection, “whoops we need to kill ‘node’ everywhere”—consider:

  • AWS Systems Manager Run Command:
    Send shell scripts/commands fleet-wide. No SSH access required.
  • parallel-ssh (pssh >= 2.4.X):
    parallel-ssh -h ./ec2-hosts.txt -l ec2-user -A "uptime"
    
  • Ansible, with dynamic AWS inventory plugin, for idempotent state changes across heterogeneous EC2 fleets.

Note: Tools like pssh assume SSH keys and direct connectivity. For high compliance, prefer SSM Run Command—it logs output and failures centrally; no need to SSH in just to tail logs.


Non-Obvious: What About Key Expiry and Auto-Rotation?

AWS doesn’t expire EC2 key pairs natively. Integrate keypair rotation into your lifecycle—e.g., rotate on staff departure, or use tools like aws-ec2-ssh to sync authorized_keys from IAM user attributes. Downside: increased infrastructure complexity and potential propagation lags.


Key Takeaways

  • Move toward SSM Session Manager: disables public port exposure, tracks operator identity, easy to audit.
  • Never share PEM keys between people: individual accountability, revokability.
  • Harden legacy SSH servers: disable passwords, restrict users, rotate away from port 22 if only for noise reduction.
  • Automate fleet actions with SSM or approved SSH tools: scales to hundreds of instances, fewer mistakes.
  • Use ~/.ssh/config for reliability and sanity: especially if juggling prod/staging/dev, or complex topologies.

Try This: Remove ingress TCP:22 from all security groups—access your environments using only SSM for two weeks. Note which workflows break (jump hosts? scp jobs?), and use findings to inform your long-term access patterns. No fix is perfect, but holes shrink with each control layered in.