SSH 기본 사항
SSH(Secure Shell)은 Linux 서버 관리에 가장 필수적인 도구입니다. 이 문서에서는 OpenSSH 설치 및 구성, 키 관리 및 보안 모범 사례를 다룹니다.
OpenSSH 설치
서버 설치
# Install OpenSSH server
sudo apt update
sudo apt install openssh-server -y
# Start and enable on boot
sudo systemctl enable --now ssh
# Check running status
sudo systemctl status ssh
# Check SSH listening port
ss -tlnp | grep ssh클라이언트 설치
# Ubuntu comes with the client pre-installed. If not:
sudo apt install openssh-client -ySSH 키 관리
1키 쌍 생성
ssh-keygen -t ed25519 -C "you@host" — 개인 키는 로컬에 보관하고, 공개 키는 공유해도 됩니다.
2공개 키 전송
ssh-copy-id user@server로 공개 키를 원격 ~/.ssh/authorized_keys에 추가합니다.
3보안 세션 열기
ssh user@server는 개인 키로 인증하며 세션 전체가 암호화됩니다. 이후 비밀번호 로그인을 비활성화하세요.
키 기반 인증은 비밀번호 인증보다 더 안전하고 편리합니다.
키 쌍 생성
# Generate an Ed25519 key (recommended)
ssh-keygen -t ed25519 -C "your_email@example.com"
# Generate an RSA 4096-bit key (better compatibility)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# Specify a filename
ssh-keygen -t ed25519 -f ~/.ssh/id_myserver -C "myserver key"키 생성 후:
- 개인 키:
~/.ssh/id_ed25519(엄격히 비밀로 유지) - 공개 키:
~/.ssh/id_ed25519.pub(배포 가능)
공개 키를 서버에 복사
# Method 1: Use ssh-copy-id (recommended)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip
# Method 2: Manual copy
cat ~/.ssh/id_ed25519.pub | ssh user@server-ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# Method 3: If you already have the public key content, add it directly on the server
echo "ssh-ed25519 AAAA... your_email@example.com" >> ~/.ssh/authorized_keysSSH 에이전트 관리
# Start the SSH Agent
eval "$(ssh-agent -s)"
# Add a key to the Agent
ssh-add ~/.ssh/id_ed25519
# List loaded keys
ssh-add -l
# Remove all loaded keys
ssh-add -DSSH 클라이언트 구성
연결을 단순화하려면 ~/.ssh/config을 편집하세요.
# ~/.ssh/config example
Host myserver
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_myserver
Host production
HostName prod.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/id_prod
ForwardAgent yes
Host jump
HostName jump.example.com
User admin
# Connect to an internal server via a jump host
Host internal
HostName 10.0.0.50
User admin
ProxyJump jump
# Default settings for all hosts
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
Compression yes구성된 별칭 사용:
# Connect directly using the alias
ssh myserver
# Equivalent to
ssh -i ~/.ssh/id_myserver -p 22 ubuntu@192.168.1.100SSH 서버 구성
기본 구성 파일은 /etc/ssh/sshd_config입니다.
보안 강화 구성
# Back up the original configuration
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# Edit the configuration
sudo nano /etc/ssh/sshd_config권장 보안 설정:
# /etc/ssh/sshd_config
# Change the default port (reduces scanning risk)
Port 2222
# Listen only on a specific address
ListenAddress 0.0.0.0
# Disable remote root login
PermitRootLogin no
# Disable password authentication (ensure key-based login is configured first)
PasswordAuthentication no
# Disable empty passwords
PermitEmptyPasswords no
# Enable public key authentication
PubkeyAuthentication yes
# Limit maximum authentication attempts
MaxAuthTries 3
# Limit maximum concurrent unauthenticated connections
MaxStartups 10:30:60
# Set login timeout
LoginGraceTime 30
# Disable X11 forwarding (usually not needed on servers)
X11Forwarding no
# Disable insecure authentication methods
KbdInteractiveAuthentication no
# Display last login information
PrintLastLog yes
# Client keepalive detection
ClientAliveInterval 300
ClientAliveCountMax 2
# Allow only specific users to log in
AllowUsers ubuntu deploy
# Or allow only specific groups
# AllowGroups sshusers# Check configuration syntax
sudo sshd -t
# Reload configuration (does not disconnect existing sessions)
sudo systemctl reload ssh드롭인 구성 사용
Ubuntu 26.04은 /etc/ssh/sshd_config.d/에 독립형 구성 파일 추가를 지원합니다.
# Create a custom configuration
sudo tee /etc/ssh/sshd_config.d/hardening.conf << 'EOF'
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
X11Forwarding no
EOF
sudo systemctl reload ssh일반적인 SSH 작업
기본 연결
# Basic connection
ssh user@server-ip
# Specify a port
ssh -p 2222 user@server-ip
# Specify a key
ssh -i ~/.ssh/id_myserver user@server-ip
# Execute a remote command
ssh user@server-ip "df -h && free -h"
# Connect in verbose mode (for debugging)
ssh -v user@server-ip
ssh -vvv user@server-ip # Even more verbose파일 전송
# SCP: Copy a file to remote
scp localfile.txt user@server-ip:/remote/path/
# SCP: Copy a file from remote
scp user@server-ip:/remote/file.txt ./local/
# SCP: Copy a directory
scp -r ./local-dir user@server-ip:/remote/path/
# SFTP: Interactive file transfer
sftp user@server-ip
# rsync: Incremental sync (recommended for large numbers of files)
rsync -avz --progress ./local-dir/ user@server-ip:/remote/dir/SSH 포트 포워딩
# Local port forwarding: Map a remote service to localhost
# Access local port 8080 to reach remote MySQL
ssh -L 8080:localhost:3306 user@server-ip
# Remote port forwarding: Expose a local service to the remote machine
# The remote machine's port 9090 will forward to local port 3000
ssh -R 9090:localhost:3000 user@server-ip
# Dynamic port forwarding (SOCKS proxy)
ssh -D 1080 user@server-ip
# Run port forwarding in the background
ssh -fNL 8080:localhost:3306 user@server-ipSSH 점프 호스트
# Connect to a target server via a jump host
ssh -J jump-user@jump-host target-user@target-host
# Multi-hop jumping
ssh -J user1@jump1,user2@jump2 user@target주요 파일 권한 요구 사항
SSH에는 엄격한 파일 권한 요구 사항이 있습니다.
# Correct permission settings
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 # Private key
chmod 644 ~/.ssh/id_ed25519.pub # Public key
chmod 600 ~/.ssh/authorized_keys # Authorized keys
chmod 600 ~/.ssh/config # Client configuration무차별 대입 보호
Fail2ban 사용
# Install fail2ban
sudo apt install fail2ban -y
# Create local configuration
sudo tee /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF
# Start the service
sudo systemctl enable --now fail2ban
# Check ban status
sudo fail2ban-client status sshd
# Manually unban an IP
sudo fail2ban-client set sshd unbanip 1.2.3.4UFW를 사용하여 SSH 액세스 제한
# Allow SSH only from a specific subnet
sudo ufw allow from 192.168.1.0/24 to any port 22
# Rate-limit connections (max 6 connections within 30 seconds)
sudo ufw limit ssh문제 해결
# View SSH service logs
sudo journalctl -u ssh -f
# View authentication logs
sudo tail -f /var/log/auth.log
# Test connection (verbose mode)
ssh -vvv user@server-ip
# Check server configuration syntax
sudo sshd -t
# Check the authorized_keys file
cat ~/.ssh/authorized_keys
# Check whether SELinux/AppArmor is blocking connections
sudo aa-status일반적인 문제
“권한이 거부되었습니다(공개키)”
# Check that the client key is correct
ssh-add -l
# Check authorized_keys permissions on the server
ls -la ~/.ssh/
ls -la ~/.ssh/authorized_keys
# Confirm public key authentication is enabled in sshd_config
grep PubkeyAuthentication /etc/ssh/sshd_config“연결이 거부되었습니다”
# Check whether the SSH service is running
sudo systemctl status ssh
# Check the port
ss -tlnp | grep ssh
# Check the firewall
sudo ufw status“호스트 키 확인에 실패했습니다”
# Remove the old host key
ssh-keygen -R server-ip
# Or edit the known_hosts file to delete the corresponding line
nano ~/.ssh/known_hostsLast updated on