리눅스 서버를 운영하며 로그를 살펴보면, 전 세계에서 수많은 IP가 내 서버의 SSH 포트(22번 등)로 접속하기 위해 끊임없이 로그인을 시도하는 것을 볼 수 있습니다. 이를 **무차별 대입 공격(Brute-force Attack)**이라고 합니다.

비밀번호를 아무리 어렵게 설정해도 수만 번의 시도가 반복되면 서버 자원이 낭비되고 보안 위협이 커집니다. 오늘은 이러한 공격을 실시간으로 감시하고, 일정 횟수 이상 실패하면 해당 IP를 자동으로 차단해 주는 든든한 파수꾼, Fail2Ban의 설치 및 설정법을 알아보겠습니다.


1. Fail2Ban이란 무엇인가?

Fail2Ban은 로그 파일을 분석하여 악의적인 활동을 하는 IP를 찾아내고, 방화벽(UFW, iptables 등)을 통해 해당 IP의 접속을 일정 시간 동안 금지(Ban)시키는 보안 프레임워크입니다.

1.1 주요 작동 방식

  1. 로그 모니터링: SSH, Nginx, MySQL 등 서비스의 로그 파일을 실시간으로 읽습니다.
  2. 패턴 매칭: 'Password fail' 같은 특정 실패 패턴이 반복되는지 확인합니다.
  3. 자동 차단: 설정된 횟수(예: 5회)를 초과하면 해당 IP를 방화벽 규칙에 추가하여 차단합니다.

2. Fail2Ban 설치 및 기본 설정

2.1 설치하기

우분투 환경에서는 패키지 매니저를 통해 간단히 설치할 수 있습니다.

Bash
 
sudo apt update
sudo apt install fail2ban -y

2.2 설정 파일 관리 (.local 파일 생성)

Fail2Ban의 기본 설정 파일은 /etc/fail2ban/jail.conf입니다. 하지만 업데이트 시 초기화될 수 있으므로, 복사본인 .local 파일을 만들어 수정하는 것이 관례입니다.

Bash
 
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

3. 핵심 보안 정책 설정 (jail.local)

설정 파일 내의 [DEFAULT] 섹션에서 전역 정책을 결정합니다.

  • ignoreip: 차단에서 제외할 IP (본인의 PC IP를 등록하여 본인이 차단되는 것을 방지하세요).
  • bantime: 차단할 시간 (예: 1h는 1시간, -1은 영구 차단).
  • findtime: 실패 횟수를 계산할 시간 범위 (예: 10m 동안 5번 실패 시 차단).
  • maxretry: 허용되는 최대 실패 횟수.

3.1 SSH 보호 활성화 예시

파일 하단의 [sshd] 섹션을 찾아 아래와 같이 활성화합니다.

Plaintext
 
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = %(sshd_log)s
maxretry = 5
bantime = 1d

(위 설정은 10분 내에 5번 로그인 실패 시 해당 IP를 하루 동안 차단합니다.)


4. 서비스 실행 및 상태 확인

설정을 마쳤다면 서비스를 재시작하여 적용합니다.

Bash
 
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban

4.1 현재 차단된 IP 목록 확인

Fail2Ban이 열일하고 있는지 확인해 봅시다.

Bash
 
# SSH 서비스에 대한 차단 상태 확인
sudo fail2ban-client status sshd

명령어를 실행하면 현재 감시 중인 IP 수와 실제로 차단된(Banned) IP 목록이 나타납니다.

4.2 실수로 차단된 내 IP 해제하기

만약 본인이 차단되었다면 다른 네트워크에서 접속하여 아래 명령어로 해제할 수 있습니다.

Bash
 
sudo fail2ban-client set sshd unbanip [내IP주소]

5. 결론: 자동화된 보안의 힘

Fail2Ban은 관리자가 잠든 사이에도 서버를 공격으로부터 지켜주는 가장 효율적인 보안 도구입니다. UFW 방화벽이 성벽이라면, Fail2Ban은 성벽을 넘으려는 침입자를 감시하고 포획하는 경비병과 같습니다.

데이터베이스(DB)에는 서비스의 가장 소중한 자산인 사용자 정보와 비즈니스 데이터가 담겨 있습니다. 하지만 로컬 개발 환경에서 서버의 DB에 접속하기 위해 3306(MySQL)이나 5432(PostgreSQL) 포트를 전 세계에 개방하는 것은 매우 위험한 행동입니다.

오늘은 DB 포트를 외부에 노출하지 않고도, 마치 내 컴퓨터에 있는 DB처럼 안전하게 접속할 수 있게 해주는 SSH 터널링(SSH Tunneling) 기법을 상세히 알아보겠습니다.


1. 왜 DB 포트를 직접 열면 안 되는가?

대부분의 DB 엔진은 보안 취약점이 발견될 수 있으며, 기본 포트가 널리 알려져 있어 무차별 대입 공격(Brute-force)의 주 타겟이 됩니다.

  • 보안 위험: 포트가 열려 있다는 것만으로도 해커는 공격의 실마리를 찾습니다.
  • 데이터 유출: 암호화되지 않은 연결을 사용할 경우 중간에서 데이터가 탈취될 수 있습니다.

따라서 가장 권장되는 방식은 방화벽에서 DB 포트를 완전히 차단하고, 인증된 사용자만 SSH라는 보안 통로를 통해 우회 접속하는 것입니다.


2. SSH 터널링(포트 포워딩)의 원리

SSH 터널링은 내 PC(Local)와 서버(Remote) 사이에 암호화된 '터널'을 뚫는 기술입니다. 내 PC의 특정 포트로 보내는 신호를 SSH 터널을 통해 서버 내부의 DB 포트로 전달하는 방식입니다.

사용자 입장에서는 localhost:3307로 접속하지만, 실제로는 서버의 3306 포트에 안전하게 연결되는 마법 같은 일이 일어납니다.


3. 터미널 명령어로 SSH 터널 뚫기

별도의 도구 없이 터미널(Terminal)이나 CMD에서 아래 명령어로 터널을 생성할 수 있습니다.

Bash
 
# 기본 명령어 구조
ssh -L [로컬포트]:localhost:[서버DB포트] [서버계정]@[서버IP]

# 예시: 내 PC의 3307 포트를 서버의 3306(MySQL) 포트와 연결
ssh -L 3307:localhost:3306 yumina@1.23.456.78
  • -L: 로컬 포트 포워딩을 의미합니다.
  • 3307: 내 PC에서 사용할 임시 포트입니다. (기존 DB와 충돌을 피하기 위해 보통 다른 번호를 씁니다.)
  • localhost:3306: 서버 입장에서 본 DB의 주소와 포트입니다.

이 명령어를 실행한 채로 터미널을 열어두면 터널이 유지됩니다.


4. GUI 도구(DBeaver, MySQL Workbench) 설정법

명령어가 익숙하지 않다면, 자주 사용하는 DB 관리 도구에서도 클릭 몇 번으로 설정이 가능합니다.

4.1 DBeaver 기준 설정 단계

  1. Connection Settings에서 상단 탭의 SSH를 선택합니다.
  2. Use SSH Tunnel 체크박스를 활성화합니다.
  3. 서버의 IP, 사용자 이름, 인증 방식(비밀번호 또는 SSH Key)을 입력합니다.
  4. 다시 Main 탭으로 돌아와서 Host는 localhost, Port는 서버 내부의 포트(3306 등)를 입력합니다.

이렇게 설정하면 연결 버튼을 누를 때마다 DBeaver가 자동으로 터널을 생성하고 접속해 줍니다.


5. 실무 적용 팁: 보안 강화하기

SSH 터널링을 사용할 때 방화벽(UFW) 설정을 함께 챙겨야 보안이 완성됩니다.

  • DB 포트 차단: sudo ufw deny 3306 명령어로 외부에서의 직접 접속을 원천 차단하세요.
  • SSH 전용 계정: DB 접속 전용 SSH 계정을 만들고 권한을 최소화하면 더욱 안전합니다.
  • SSH 키 인증: 비밀번호 대신 SSH 키(Key) 방식을 사용하면 터널링의 보안 수준이 비약적으로 상승합니다.

6. 결론: 보안과 편리함은 공존할 수 있습니다

SSH 터널링은 인프라 보안의 정석과도 같은 기술입니다. 처음에는 조금 번거롭게 느껴질 수 있지만, 소중한 데이터를 보호하기 위해 반드시 익혀야 할 필수 스킬입니다.

인터넷에 연결된 모든 서버는 24시간 내내 수많은 침입 시도에 노출되어 있습니다. 불필요한 포트를 열어두는 것은 마치 대문을 열어두고 외출하는 것과 같습니다. 리눅스 서버 보안의 첫걸음은 바로 **방화벽(Firewall)**을 통해 꼭 필요한 트래픽만 허용하고 나머지는 모두 차단하는 것입니다.

오늘은 우분투(Ubuntu)에서 가장 쉽고 직관적으로 사용할 수 있는 방화벽 도구인 **UFW(Uncomplicated Firewall)**의 설정법을 완벽하게 정리해 보겠습니다.


1. UFW란 무엇인가?

UFW는 이름 그대로 '복잡하지 않은 방화벽'입니다. 리눅스 커널의 패킷 필터링 기능을 담당하는 iptables를 사용자가 더 쉽게 다룰 수 있도록 만든 인터페이스입니다. 복잡한 명령어 대신 단순한 규칙(Allow/Deny)만으로 서버를 보호할 수 있다는 장점이 있습니다.


2. UFW 시작하기: 기본 설정

2.1 UFW 상태 확인

현재 방화벽이 활성화되어 있는지 확인합니다. 처음에는 보통 inactive 상태입니다.

Bash
 
sudo ufw status

2.2 기본 정책 설정 (Default Policy)

가장 안전한 방화벽 전략은 **"들어오는 것은 모두 막고, 나가는 것은 허용하는 것"**입니다.

Bash
 
# 모든 들어오는 접속 차단
sudo ufw default deny incoming

# 모든 나가는 접속 허용
sudo ufw default allow outgoing

3. 필수 서비스 허용하기 (주의사항)

중요: 방화벽을 활성화하기 전에 반드시 **SSH(22번 포트)**를 허용해야 합니다. 그렇지 않으면 본인도 서버에 접속하지 못하는 '락아웃(Lock-out)' 현상이 발생합니다.

3.1 SSH 및 웹 서비스 허용

Bash
 
# SSH 허용 (기본 22번 포트)
sudo ufw allow ssh

# HTTP(80) 및 HTTPS(443) 허용
sudo ufw allow http
sudo ufw allow https

3.2 특정 포트 범위 허용

특정 범위의 포트를 한꺼번에 열어야 할 때 사용합니다. (예: 8000~8100번)

Bash
 
sudo ufw allow 8000:8100/tcp

4. 특정 IP 주소 관리하기 (화이트리스트)

보안을 더욱 강화하려면, 관리자 페이지나 DB 접속 포트 등은 특정 IP에서만 접속할 수 있도록 제한하는 것이 좋습니다.

4.1 특정 IP 허용

Bash
 
# 특정 IP(예: 123.123.123.123)에서의 모든 접속 허용
sudo ufw allow from 123.123.123.123

# 특정 IP가 특정 포트(예: 3306 DB 포트)에만 접속하게 허용
sudo ufw allow from 123.123.123.123 to any port 3306

4.2 특정 IP 차단 (Blacklist)

공격이 의심되는 특정 IP를 즉시 차단할 때 유용합니다.

Bash
 
sudo ufw deny from 123.123.123.123

5. 방화벽 활성화 및 규칙 삭제

모든 규칙을 설정했다면 이제 방화벽을 가동합니다.

5.1 활성화 및 비활성화

Bash
 
# 방화벽 활성화 (SSH 허용 여부 재차 확인!)
sudo ufw enable

# 방화벽 비활성화
sudo ufw disable

5.2 규칙 삭제

설정된 규칙을 삭제하고 싶을 때는 번호를 확인한 뒤 삭제하는 것이 가장 정확합니다.

Bash
 
# 규칙 번호 확인
sudo ufw status numbered

# 2번 규칙 삭제
sudo ufw delete 2

6. 결론: 보안은 겹겹이 쌓는 층(Layer)입니다

UFW는 서버를 지키는 든든한 성벽입니다. 하지만 방화벽 하나만으로 모든 공격을 막을 수는 없습니다. 앞서 다뤘던 SSH 포트 변경, Root 로그인 차단 등과 함께 적용할 때 비로소 강력한 보안 체계가 완성됩니다.

웹사이트를 운영하면서 주소창 옆에 있는 '자물쇠 아이콘'은 이제 선택이 아닌 필수입니다. HTTPS가 적용되지 않은 사이트는 구글 검색 순위에서 밀려날 뿐만 아니라, 사용자들에게 '안전하지 않음' 경고를 표시하여 신뢰도를 떨어뜨리기 때문입니다.

오늘은 Let's Encrypt를 사용하여 무료로 SSL 인증서를 발급받고, 90일마다 돌아오는 갱신 과정을 Certbot을 이용해 완전히 자동화하는 방법을 상세히 알아보겠습니다.


1. Let's Encrypt와 Certbot이란?

Let's Encrypt는 누구나 무료로 SSL/TLS 인증서를 발급받을 수 있도록 지원하는 비영리 인증 기관(CA)입니다. 그리고 Certbot은 이 Let's Encrypt 인증서를 자동으로 발급, 설치, 갱신해 주는 오픈소스 소프트웨어 도구입니다.

1.1 왜 자동 갱신이 필요한가?

Let's Encrypt 인증서의 유효 기간은 90일로 매우 짧습니다. 이는 보안성을 높이기 위함이지만, 관리자가 매번 수동으로 갱신하기에는 번거롭고 실수로 만료될 위험이 큽니다. 따라서 자동화 설정을 통해 신경 쓰지 않아도 인증서가 유지되도록 하는 것이 핵심입니다.


2. 사전 준비 사항

작업을 시작하기 전에 아래 두 가지 조건이 충족되어야 합니다.

  1. 도메인 보유: IP 주소가 아닌 실제 도메인(example.com)이 서버의 공인 IP와 연결되어 있어야 합니다.
  2. 웹 서버 설치: Nginx 또는 Apache가 서버에 설치되어 동작 중이어야 합니다.

3. Certbot 설치 및 인증서 발급 (Nginx 기준)

Ubuntu 서버 환경에서 Nginx를 위한 Certbot 설정을 진행해 보겠습니다.

3.1 Certbot 설치

Bash
 
sudo apt update
sudo apt install certbot python3-certbot-nginx -y

3.2 인증서 발급 및 자동 설정

아래 명령어를 입력하면 Certbot이 Nginx 설정 파일을 자동으로 분석하여 SSL 설정을 추가해 줍니다.

Bash
 
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
  • 이메일 입력: 만료 알림을 받을 이메일 주소를 입력합니다.
  • 약관 동의: A를 눌러 동의합니다.
  • HTTPS 리다이렉트: 기존 HTTP 접속을 자동으로 HTTPS로 넘길지 묻는 질문에는 2 (Redirect)를 선택하는 것을 권장합니다.

4. SSL 자동 갱신 설정 및 검증

Certbot은 설치 시 자동으로 시스템 스케줄러(cron 또는 systemd timer)에 갱신 스크립트를 등록합니다. 하지만 실제로 잘 작동하는지 확인하는 과정이 필요합니다.

4.1 드라이 런(Dry Run) 테스트

실제로 갱신을 수행하지 않고, 절차상 문제가 없는지 가상으로 테스트합니다.

Bash
 
sudo certbot renew --dry-run

결과 메시지에 **"Congratulations, all simulated renewals succeeded"**라는 문구가 보인다면 자동 갱신 설정에 문제가 없는 것입니다.

4.2 스케줄러 확인

인증서 갱신 작업이 등록되어 있는지 확인하려면 아래 명령어를 입력하세요.

Bash
 
systemctl list-timers | grep certbot

5. SSL 보안 등급 확인하기 (전문성 강화)

인증서 설치가 완료되었다면, 내 사이트의 보안 설정이 얼마나 견고한지 테스트해 볼 수 있습니다. SSL Labs 사이트에 접속하여 본인의 도메인을 입력하면 보안 등급(A~F)을 확인할 수 있습니다.

Nginx에서 최신 암호화 프로토콜(TLS 1.2, 1.3)만 사용하도록 설정하면 손쉽게 A 등급을 획득할 수 있으며, 이는 구글 SEO 점수에도 긍정적인 영향을 미칩니다.


6. 결론: 안전한 웹 서비스의 완성

무료 인증서라고 해서 유료 인증서보다 보안성이 떨어지는 것은 아닙니다. Let's Encrypt와 Certbot을 조합하면 비용 부담 없이 완벽한 HTTPS 환경을 구축할 수 있습니다.

요약하자면:

  1. Certbot으로 간편하게 인증서를 발급받으세요.
  2. --dry-run 테스트를 통해 자동 갱신 설정을 꼭 검증하세요.
  3. 보안 등급을 체크하여 최적의 서버 설정을 유지하세요.

애플리케이션을 개발하다 보면 데이터베이스 접속 정보, 외부 API 키, 인증 토큰 등 외부로 노출되어서는 안 되는 민감한 정보를 다루게 됩니다. 도커(Docker) 컨테이너 환경에서는 이러한 설정을 어떻게 관리하느냐가 전체 시스템의 보안 수준을 결정합니다.

오늘은 입문자가 가장 많이 실수하는 부분부터, 현업에서 권장하는 .env 파일을 활용한 환경 변수 관리 및 보안 전략을 상세히 알아보겠습니다.


1. 환경 변수 관리가 중요한 이유

코드 내부에 비밀번호나 API 키를 직접 입력(Hard-coding)하는 것은 매우 위험합니다. 코드가 GitHub와 같은 원격 저장소에 올라가는 순간, 전 세계 누구나 내 서버의 권한을 탈취할 수 있기 때문입니다.

도커 환경에서 환경 변수를 분리하여 관리하면 다음과 같은 이점이 있습니다.

  • 보안성 향상: 민감한 정보를 코드와 분리하여 저장합니다.
  • 유연성: 소스 코드를 수정하지 않고도 개발(Dev), 테스트(Test), 운영(Prod) 환경에 맞는 설정을 즉시 적용할 수 있습니다.
  • 협업 효율: 팀원 간에 공통된 설정 형식을 공유하면서도 개인별 환경에 맞게 조정이 가능합니다.

2. .env 파일 작성 및 도커 연동

가장 대중적인 방법은 프로젝트 루트 디렉토리에 .env 파일을 만드는 것입니다.

2.1 .env 파일 예시

Plaintext
 
# 데이터베이스 설정
DB_HOST=db.example.com
DB_USER=admin
DB_PASSWORD=your_secret_password_1234

# API 키
STRIPE_API_KEY=sk_test_51Mz...

2.2 Docker Run 명령어로 전달하기

컨테이너를 실행할 때 --env-file 옵션을 사용하여 파일의 내용을 한 번에 주입할 수 있습니다.

Bash
 
docker run --env-file .env my-application-image

2.3 Docker Compose에서 활용하기

docker-compose.yml 파일을 사용하면 더 직관적인 관리가 가능합니다.

YAML
 
version: '3.8'
services:
  web:
    image: my-app:latest
    env_file:
      - .env
    ports:
      - "8080:8080"

3. 절대로 잊지 말아야 할 보안 수칙

환경 변수 파일을 사용한다고 해서 보안이 완성되는 것은 아닙니다. 아래 두 가지는 반드시 실천해야 합니다.

3.1 .gitignore에 추가하기

.env 파일이 Git 저장소에 포함되지 않도록 반드시 제외 처리해야 합니다.

Plaintext
 
# .gitignore 파일 내용
.env
.env.local
.env.*.local

3.2 샘플 파일 제공 (.env.example)

팀원들이 어떤 환경 변수가 필요한지 알 수 있도록, 실제 값은 비워두고 키 이름만 적어둔 예시 파일을 공유하는 것이 매너입니다.

Plaintext
 
# .env.example (이 파일은 Git에 올려도 안전합니다)
DB_HOST=
DB_USER=
DB_PASSWORD=

4. 고급 보안 기법: Docker Secrets

만약 단순한 .env 파일을 넘어 더 강력한 보안이 필요하다면 Docker Secrets 기능을 고려해 볼 수 있습니다. 이는 Docker Swarm 모드에서 지원하는 기능으로, 변수 값을 메모리에만 저장하고 디스크에는 암호화하여 보관합니다.

  1. 민감한 정보를 Docker Secret으로 등록합니다.
  2. 컨테이너 실행 시 필요한 서비스에만 해당 Secret을 마운트합니다.
  3. 컨테이너 내부의 /run/secrets/ 경로에서 파일을 읽어 사용합니다.

5. 결론: 안전한 배포를 위한 첫걸음

도커 컨테이너 환경에서 환경 변수를 올바르게 관리하는 것은 '선택'이 아닌 '필수'입니다.

  1. 변수는 파일로 분리하고,
  2. Git 업로드를 방지하며,
  3. **상황에 맞는 도구(Docker Compose, Secrets)**를 선택하는 습관을 들이세요.

 

리눅스 서버(Ubuntu)를 처음 생성하고 공인 IP를 할당받으면, 그 순간부터 전 세계의 수많은 봇(Bot)들이 여러분의 서버에 접속하기 위해 무차별 대입 공격(Brute-force)을 시도합니다. 특히 기본 설정인 22번 포트와 root 계정은 해커들의 주요 타겟이 됩니다.

오늘은 내 소중한 서버를 안전하게 보호하기 위한 가장 기초적이면서도 필수적인 보안 설정 두 가지, SSH 포트 변경과 Root 로그인 차단 방법을 상세히 알아보겠습니다.


1. 왜 기본 설정을 변경해야 하는가?

서버 운영에 있어 '보안의 기본'은 공격자가 예측하기 어렵게 만드는 것입니다.

  • SSH 기본 포트(22번): 누구나 알고 있는 포트입니다. 공격자들은 자동화된 스크립트로 22번 포트가 열려 있는지 확인하고 접속을 시도합니다. 포트 번호만 바꿔도 자동화 공격의 90% 이상을 차단할 수 있습니다.
  • Root 계정: 리눅스에서 모든 권한을 가진 절대적인 계정입니다. ID가 'root'라는 것을 이미 알고 있기 때문에, 비밀번호만 알아내면 서버의 모든 제어권을 뺏기게 됩니다.

따라서 별도의 관리자 계정을 생성하고, root 접속은 원천 차단하는 것이 서버 보안의 시작입니다.


2. 작업 전 주의사항 (필독)

설정을 변경하다가 실수하면 **본인조차 서버에 접속하지 못하는 상황(Lock-out)**이 발생할 수 있습니다. 작업을 시작하기 전에 아래 사항을 반드시 확인하세요.

  1. 관리자 권한을 가진 일반 사용자 계정이 미리 생성되어 있어야 합니다.
  2. 사용 중인 클라우드(AWS, GCP, Azure 등)의 방화벽(Security Group) 설정에서 변경할 포트 번호를 미리 허용(Inbound)해 두어야 합니다.

3. SSH 설정 파일 수정하기

모든 SSH 관련 설정은 /etc/ssh/sshd_config 파일에서 관리합니다. 안전을 위해 원본 파일을 백업하고 수정을 시작해 보겠습니다.

3.1 설정 파일 백업 및 열기

Bash
 
# 설정 파일 백업
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 설정 파일 편집 (nano 또는 vim 사용)
sudo nano /etc/ssh/sshd_config

3.2 SSH 포트 번호 변경

파일 상단 근처에 #Port 22라는 문구를 찾으세요. 주석(#)을 제거하고 원하는 포트 번호로 수정합니다.

  • 추천 범위: 1024 ~ 65535 사이의 사용하지 않는 번호 (예: 2026, 8822 등)
Plaintext
 
# 수정 전
#Port 22

# 수정 후
Port 2026

3.3 Root 로그인 차단 설정

파일을 아래로 내리다 보면 PermitRootLogin 항목이 보입니다. 이를 no로 변경하여 외부에서 root 계정으로 직접 접속하는 것을 막습니다.

Plaintext
 
# 수정 전
#PermitRootLogin prohibit-password (또는 yes)

# 수정 후
PermitRootLogin no

 


4. 변경 사항 적용 및 테스트

설정을 마쳤다면 파일을 저장하고(Nano 기준: Ctrl+O -> Enter -> Ctrl+X), SSH 서비스를 재시작해야 적용됩니다.

4.1 서비스 재시작

Bash
 
sudo systemctl restart ssh

4.2 방화벽 설정 (UFW 기준)

서버 자체 방화벽인 UFW를 사용 중이라면 새 포트를 허용해 주어야 합니다.

Bash
 
# 새 포트 허용 (예: 2026)
sudo ufw allow 2026/tcp

# 기존 22번 포트 차단 (선택 사항)
sudo ufw delete allow 22/tcp

# 방화벽 상태 확인
sudo ufw status

5. 접속 테스트 (매우 중요!)

현재 접속되어 있는 터미널 창을 절대 끄지 마세요. 설정이 잘못되었을 경우를 대비해 현재 세션을 유지한 상태에서, 새로운 터미널 창을 열어 접속을 시도합니다.

Bash
 
# 새로운 터미널에서 접속 시도
ssh -p [변경한포트번호] [사용자계정]@[서버IP주소]

# 예시
ssh -p 2026 yumina@1.23.456.78

정상적으로 접속이 된다면 모든 설정이 성공적으로 완료된 것입니다. 이제 root 계정으로의 직접 접속은 차단되었으며, 지정한 포트를 통해서만 서버에 접근할 수 있습니다.


6. 결론 및 요약

서버 보안은 거창한 솔루션을 도입하는 것보다, 이처럼 기본적인 설정을 꼼꼼히 챙기는 것에서 시작됩니다.

오늘 배운 내용 요약:

  1. SSH 포트 변경: 자동화된 봇 공격으로부터 서버를 은닉합니다.
  2. PermitRootLogin no: 서버의 심장인 root 계정을 외부 노출로부터 보호합니다.
  3. 방화벽 설정: 서버 내부와 클라우드 외부 방화벽 모두에서 새 포트를 열어주어야 합니다.

가장 단순하지만 가장 강력한 이 두 가지 설정을 통해 더욱 안전한 서버 운영 환경을 구축하시기 바랍니다.

+ Recent posts