Ubuntu 서버 초기 설정 ① — SSH 키 인증과 root 비활성화

Ubuntu 서버 초기 설정 ① — SSH 키 인증과 root 비활성화

서버를 처음 받으면 가장 먼저 해야 할 일은 앱 설치가 아니라 문 잠그기다.

VPS를 결제하고 나면 "빨리 뭔가 올려보고 싶다"는 마음이 앞선다. 하지만 지금 이 순간에도 전 세계 봇이 22번 포트를 두드리며 root 비밀번호를 무차별 대입하고 있다. 문을 잠그고, 열쇠를 바꾸고, 기존 열쇠를 폐기하는 것이 가장 먼저다.

이 시리즈는 Ubuntu 24.04 LTS 기준으로 진행한다. 다른 버전이라도 대부분 동일하게 적용할 수 있다.

Ubuntu 서버에 처음 접속하는 방법

VPS를 생성하면 호스팅 업체가 IP 주소root 비밀번호(또는 SSH 키)를 제공한다. 터미널을 열고 접속한다.

# Windows: PowerShell 또는 Windows Terminal
# macOS/Linux: 기본 터미널
ssh root@서버_IP_주소

처음 접속하면 Are you sure you want to continue connecting?이라는 메시지가 나온다. yes를 입력하면 된다. 이후 비밀번호를 입력하면 접속 완료다.

Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-xx-generic x86_64)
root@server:~#

root@server:~# 프롬프트가 보이면 성공이다. 🎉

💡 호스팅 업체별 접속 정보 위치: - Vultr / DigitalOcean / Linode — 대시보드에서 서버 클릭 → IP, 비밀번호 또는 SSH 키 확인 - AWS EC2 — 인스턴스 생성 시 다운로드한 .pem 키 파일로 접속: ssh -i key.pem ubuntu@IP - Oracle Cloud — EC2와 동일. 기본 사용자는 ubuntu


apt 패키지 업데이트

서버에 접속했다면 무조건 첫 번째로 패키지를 업데이트한다. 호스팅 업체가 제공하는 이미지가 최신이 아닐 수 있기 때문이다.

apt update && apt upgrade -y
명령어 역할
apt update 패키지 목록을 최신으로 갱신
apt upgrade -y 설치된 패키지를 최신 버전으로 업그레이드 (-y는 자동 승인)

커널 업데이트가 포함됐다면 재부팅이 필요할 수 있다.

# 재부팅 필요 여부 확인
[ -f /var/run/reboot-required ] && echo "재부팅 필요" || echo "재부팅 불필요"

# 필요하면 재부팅
reboot

sudo 관리자 계정 생성

root로 서버를 운영하는 것은 관리자 비밀번호가 적힌 명찰을 달고 돌아다니는 것과 같다. 실수 한 번이면 시스템 전체가 날아간다. 일반 사용자 계정을 만들고, 필요할 때만 sudo로 관리자 권한을 빌려 쓰는 것이 안전하다.

사용자 생성

# 새 사용자 생성 (원하는 이름으로 변경)
adduser deploy

비밀번호와 기본 정보를 입력하라는 프롬프트가 나온다. 비밀번호만 입력하고 나머지는 Enter로 건너뛰면 된다.

sudo 권한 부여

# deploy 사용자를 sudo 그룹에 추가
usermod -aG sudo deploy

권한 확인

새 사용자로 전환해서 sudo가 작동하는지 테스트한다.

# deploy 사용자로 전환
su - deploy

# sudo 테스트
sudo whoami
# 출력: root ← 성공

root가 출력되면 sudo 권한이 정상적으로 부여된 것이다.


SSH 키 인증 설정 방법

비밀번호는 무차별 대입(brute-force) 공격에 취약하다. SSH 키 인증은 수학적으로 복제 불가능한 열쇠 쌍을 사용하므로 비밀번호보다 압도적으로 안전하다.

동작 원리

구성 요소 비유 저장 위치
개인 키 (Private Key) 내 금고 열쇠 — 절대 남에게 주지 않음 내 로컬 PC (~/.ssh/id_ed25519)
공개 키 (Public Key) 금고 자물쇠 — 서버에 걸어둠 서버 (~/.ssh/authorized_keys)

접속할 때 서버는 "이 자물쇠에 맞는 열쇠를 갖고 있는가?"를 수학적으로 검증한다. 비밀번호처럼 네트워크를 통해 전송되지 않으므로 가로채기도 불가능하다.

1단계 — 로컬 PC에서 SSH 키 생성

내 PC(로컬)에서 실행한다. 서버가 아니다.

ssh-keygen -t ed25519 -C "deploy@myserver"
옵션 설명
-t ed25519 최신 알고리즘. RSA보다 짧고 빠르고 안전함
-C "..." 키에 붙이는 메모 (식별용)

비밀번호(passphrase)를 묻는 화면이 나오면 입력하는 것을 권장한다. 키 파일이 유출되더라도 passphrase 없이는 사용할 수 없기 때문이다.

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): [Enter]
Enter passphrase (empty for no passphrase): [비밀번호 입력]
Enter same passphrase again: [비밀번호 재입력]

2단계 — 공개 키를 서버에 복사

ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@서버_IP

비밀번호를 입력하면 공개 키가 서버의 ~/.ssh/authorized_keys에 자동으로 추가된다.

⚠️ Windows에서 ssh-copy-id가 없는 경우: powershell type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@서버_IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

3단계 — SSH 키로 접속 테스트

ssh deploy@서버_IP

비밀번호 대신 passphrase를 묻거나 (passphrase를 설정한 경우), 아무것도 묻지 않고 바로 접속되면 성공이다.

🔴 매우 중요: 다음 단계(비밀번호 인증 비활성화)로 넘어가기 전에 반드시 새 터미널을 열어 키 인증으로 접속이 되는지 확인하라. 이 확인 없이 비밀번호를 끄면 서버에서 영원히 잠긴다.


비밀번호 인증 비활성화

SSH 키로 접속이 확인됐으니, 이제 비밀번호 로그인을 끈다. SSH 설정 파일을 수정한다.

sudo nano /etc/ssh/sshd_config

아래 항목을 찾아서 수정한다. 주석(#)이 달려 있으면 주석을 제거하고 값을 변경한다.

# 비밀번호 인증 끄기
PasswordAuthentication no

# 빈 비밀번호 차단 (이미 기본값이지만 명시)
PermitEmptyPasswords no

# 키보드 인터랙티브 인증 끄기 (비밀번호 우회 방지)
KbdInteractiveAuthentication no

설정을 저장하고 SSH 서비스를 재시작한다.

sudo systemctl restart sshd

💡 확인: 재시작 후 현재 접속은 끊지 말고, 새 터미널에서 비밀번호로 접속을 시도해보라. Permission denied (publickey) 오류가 나오면 정상이다.


root 로그인 차단

마지막으로 root 계정의 SSH 직접 접속을 차단한다.

sudo nano /etc/ssh/sshd_config
# root 직접 로그인 차단
PermitRootLogin no
sudo systemctl restart sshd

이제 root로는 SSH 접속 자체가 불가능하다. 관리자 작업이 필요하면 deploy 계정으로 접속한 뒤 sudo를 사용한다.

최종 확인 체크리스트

테스트 예상 결과
ssh deploy@서버_IP ✅ SSH 키로 접속 성공
ssh root@서버_IP Permission denied
ssh -o PubkeyAuthentication=no deploy@서버_IP Permission denied (비밀번호 차단 확인)

세 가지 모두 통과하면 1편의 보안 설정이 완료된 것이다. 🔒


📝 정리

  • [x] 첫 접속 후 즉시 apt update && apt upgrade 실행
  • [x] sudo 사용자 생성 — root 직접 사용 대신 deploy 계정 + sudo 권한
  • [x] SSH 키 인증 전환 — ed25519 키 생성 → ssh-copy-id로 서버에 등록 → 키 접속 확인
  • [x] 비밀번호 인증 비활성화PasswordAuthentication no 설정
  • [x] root 로그인 차단PermitRootLogin no 설정
  • [x] 순서 필수 — 문 잠그기(계정) → 열쇠 만들기(SSH 키) → 기존 열쇠 폐기(비밀번호 끄기)

다음 편 예고

2편: SSH 포트 변경, UFW 방화벽, fail2ban

비밀번호를 끈 것만으로는 부족하다. 기본 22번 포트를 바꾸고, UFW 방화벽으로 필요한 포트만 열고, fail2ban으로 반복 실패 IP를 자동 차단하는 방법을 다룬다.