[태그:] 도커 보안

  • 인프라 보안, 초보 운영자를 위한 필수 가이드

    인프라 보안, 초보 운영자를 위한 필수 가이드

    1. 서론 (Introduction)

    서버, 워드프레스, 도커, n8n. 직접 자신만의 디지털 인프라를 운영하는 것은 정말 멋진 일입니다. 하지만 동시에 해킹, 데이터 유출 등 수많은 보안 위협에 노출될 수 있다는 의미이기도 합니다. 초보 운영자에게 ‘보안’은 복잡하고 어려운 산처럼 느껴질 수 있습니다.

    이 가이드의 목적은 바로 그 막막함을 덜어드리는 것입니다. 복잡한 보안 개념을 초보자의 눈높이에서 가장 실용적이고 필수적인 내용만 골라 단계적으로 안내합니다. 이 글을 끝까지 따라오시면, 여러분의 소중한 인프라를 안전하게 지킬 수 있는 든든한 기초를 다질 수 있을 것입니다.

    이 가이드에서는 접근 통제, 시스템/앱 보안, 네트워크 보안, 데이터 보호라는 4가지 핵심 원칙을 중심으로, 지금 당장 실천할 수 있는 구체적인 방법들을 다룹니다.

    2. 기본 중의 기본: 강력한 접근 통제와 인증 (Foundational Security: Strong Access Control and Authentication)

    보안의 첫걸음은 ‘허가된 사람만 들어오게 하는 것’입니다. 아무리 성벽을 높게 쌓아도, 성문 관리가 허술하면 아무 소용이 없겠죠. 인프라 보안도 마찬가지입니다.

    2.1. 안전한 계정 관리와 비밀번호 정책

    • Setup Steps:
      • 기본 계정 사용 최소화: 서버 최초 설정 후, 가장 먼저 `root`나 `admin` 같은 최고 관리자 계정이 아닌, 개인적으로 사용할 일반 계정을 만드세요. (`adduser newuser`) 그리고 이 계정에 관리자 권한이 필요할 때만 `sudo` 명령어를 사용하도록 설정하세요.
      • 최소 권한 원칙: 새로 만든 계정에는 꼭 필요한 권한만 부여하세요. 모든 계정에 관리자 권한을 주는 것은 매우 위험합니다.
      • 2단계 인증(MFA/2FA) 설정: 비밀번호가 유출되더라도 추가 인증(스마트폰 앱, OTP 등) 없이는 로그인할 수 없도록 2단계 인증을 반드시 설정하세요. SSH, 워드프레스, 클라우드 콘솔 등 로그인하는 모든 곳에 적용하는 것이 좋습니다.
    • Common Mistakes:
      • `password`, `123456`, `admin123` 등 추측하기 쉬운 비밀번호를 사용하는 것.
      • 모든 서버 작업을 편리하다는 이유로 `root` 계정으로 직접 진행하는 것.
      • 여러 웹사이트나 서비스에 동일한 비밀번호를 돌려쓰는 행위. 하나가 뚫리면 모두 뚫립니다.
    • Practical Tips:
      • 비밀번호 관리자 사용: 1Password, Bitwarden 같은 비밀번호 관리자를 사용해 각 서비스마다 복잡하고 긴 비밀번호를 생성하고 안전하게 관리하세요.
      • 정기적인 비밀번호 변경: 회사 정책이 아니라면 필수는 아니지만, 유출이 의심될 때는 즉시 변경해야 합니다.
      • 불필요한 계정 삭제: 퇴사자나 더 이상 사용하지 않는 서비스 계정은 즉시 비활성화하거나 삭제하여 잠재적 위협을 제거하세요.

    2.2. SSH 키 기반 인증과 포트 변경

    서버에 원격으로 접속할 때 사용하는 SSH는 해커들의 주된 공격 목표입니다. 비밀번호 대신 훨씬 안전한 ‘열쇠’를 사용해 접속하도록 바꿔야 합니다.

    • Setup Steps:
      • SSH 키 페어 생성 및 적용: 내 컴퓨터에서 `ssh-keygen` 명령어로 공개키(Public Key)와 개인키(Private Key) 한 쌍을 만듭니다. 그리고 공개키를 `ssh-copy-id user@your_server_ip` 명령어로 서버에 복사합니다.
      • 비밀번호 인증 비활성화: 서버의 `/etc/ssh/sshd_config` 파일에서 `PasswordAuthentication no` 로 설정하여 비밀번호 로그인을 원천 차단합니다. 이제 개인키 파일이 없으면 아무도 접속할 수 없습니다.
      • 기본 SSH 포트 변경: 같은 파일에서 `Port 22`를 `Port 2222` 등 다른 번호로 변경하세요. 자동화된 공격 봇들은 대부분 22번 포트만 노리기 때문에, 포트 변경만으로도 수많은 공격 시도를 피할 수 있습니다.
    • Operational Cautions:
      • 개인키(Private Key) 절대 유출 금지: 개인키는 여러분의 집 열쇠와 같습니다. 파일 권한을 `chmod 600 ~/.ssh/id_rsa`로 설정하고, 절대 타인에게 공유하거나 공개된 장소에 업로드하지 마세요.
      • 변경된 포트 번호 기억: 변경한 포트 번호를 잊어버리면 서버에 접속할 수 없게 됩니다. 또한, 방화벽 설정 시 변경된 포트를 반드시 허용해줘야 합니다.
      • root 계정 SSH 접속 비활성화: `sshd_config` 파일에서 `PermitRootLogin no` 로 설정하여 root 계정의 직접적인 원격 접속을 막는 것이 안전합니다.
    • Practical Tips:
      • Fail2Ban 설치: 로그인 실패가 반복되는 IP를 자동으로 차단해주는 Fail2Ban 같은 도구를 설치하면 무작위 대입 공격을 효과적으로 방어할 수 있습니다.
      • 클라우드 보안 그룹 연동: AWS, GCP 등 클라우드 서비스를 사용한다면, 보안 그룹(Security Group)에서 SSH 접속 허용 IP를 내 집이나 사무실 IP로 제한하여 보안을 한층 강화할 수 있습니다.

    3. 시스템과 애플리케이션 보안: 꾸준한 업데이트와 안전한 설정

    튼튼한 성문을 만들었으니 이제 성벽 자체를 견고하게 만들 차례입니다. 운영체제와 애플리케이션의 취약점을 방치하는 것은 성벽에 구멍을 내버려 두는 것과 같습니다.

    3.1. 운영체제 및 소프트웨어 최신 상태 유지

    • Setup Steps:
      • OS 정기 업데이트: 우분투(Ubuntu)라면 `sudo apt update && sudo apt upgrade -y`, CentOS라면 `sudo dnf upgrade -y` 명령어를 주기적으로 실행하거나 스케줄링하여 시스템을 항상 최신 상태로 유지하세요.
      • 워드프레스 업데이트: 워드프레스 코어, 테마, 플러그인에 새로운 보안 취약점이 발견되는 경우가 많습니다. 관리자 페이지에서 항상 최신 버전으로 업데이트하세요. 자동 업데이트 기능을 활성화하는 것도 좋은 방법입니다.
      • 도커 이미지 관리: 도커를 사용한다면 `docker pull` 명령어로 항상 최신 버전의 공식 이미지를 사용하고, Trivy 같은 스캐닝 도구로 이미지 내의 취약점을 주기적으로 점검하세요.
    • Common Mistakes:
      • ‘업데이트하면 뭔가 고장 날 것 같아서’라는 이유로 보안 업데이트를 미루는 행위.
      • 더 이상 지원이 종료된(End-of-Life) 오래된 버전의 PHP나 OS를 계속 사용하는 것.
      • 업데이트 전 백업을 하지 않아, 문제 발생 시 되돌릴 수 없게 되는 상황.
    • Operational Cautions:
      • 중요한 서비스라면 업데이트 전에 테스트 서버나 스테이징 환경에서 먼저 호환성 테스트를 진행하는 것이 안전합니다.
      • 업데이트로 인한 서비스 중단 시간을 최소화할 수 있는 시간대(예: 새벽)에 작업을 계획하세요.

    3.2. 불필요한 기능 제거 및 보안 설정 강화

    시스템에 설치된 기능이 많을수록 공격당할 경로도 많아집니다. 꼭 필요한 것만 남기고, 남은 것들은 설정을 최대한 안전하게 바꿔야 합니다.

    • Setup Steps:
      • 불필요한 서비스 제거: 사용하지 않는 FTP, Telnet 같은 서비스는 비활성화하거나 삭제하세요. 파일 전송은 훨씬 안전한 SFTP나 SCP를 사용하는 것이 좋습니다.
      • 웹서버 보안 강화: Nginx나 Apache 설정에서 HTTPS를 강제하고, 서버 버전 정보 등 불필요한 정보가 노출되지 않도록 설정하세요. 디렉토리 리스팅 기능도 비활성화해야 합니다.
      • 워드프레스 `wp-config.php` 강화: 파일 권한을 440 또는 400으로 설정하여 외부에서 수정할 수 없게 하고, WordPress.org에서 제공하는 SALT 키를 생성하여 적용하세요. 운영 환경에서는 디버그 모드(`WP_DEBUG`)를 반드시 `false`로 설정해야 합니다.
      • 도커 컨테이너 최소 권한 실행: 도커 컨테이너를 실행할 때 기본 `root` 사용자가 아닌, 별도의 사용자를 지정(`–user` 옵션)하여 실행하면 컨테이너 탈출(escape) 공격의 피해를 최소화할 수 있습니다.
    • Operational Cautions:
      • 설정 파일을 변경하기 전에는 반드시 `cp config.conf config.conf.bak` 와 같이 원본 파일을 백업하는 습관을 들이세요.
      • API 키, 데이터베이스 비밀번호 등 민감한 정보는 소스 코드에 직접 작성하지 말고, 환경 변수(Environment Variables)를 통해 주입하는 방식을 사용하세요.
    • Practical Tips:
      • 워드프레스 보안 플러그인: Wordfence, iThemes Security 같은 보안 플러그인을 설치하면 로그인 시도 제한, 악성 코드 스캔 등 다양한 보안 기능을 손쉽게 추가할 수 있습니다.
      • 환경 변수 관리: 도커에서는 `.env` 파일과 `docker-compose.yml`을, n8n에서는 환경 변수 설정을 통해 민감 정보를 안전하게 관리할 수 있습니다.

    4. 네트워크 보안의 첫걸음: 방화벽과 포트 관리

    이제 외부와의 통로인 네트워크를 통제할 차례입니다. 방화벽은 허가된 통신만 허용하고 나머지는 모두 차단하는 우리 인프라의 든든한 경비원입니다.

    4.1. 기본적인 방화벽 설정과 이해

    • Setup Steps:
      • 운영체제 방화벽 활성화: 우분투의 UFW는 사용법이 매우 간단합니다. `sudo ufw allow ssh` (또는 변경한 포트), `sudo ufw allow http`, `sudo ufw allow https` 처럼 필요한 서비스만 허용한 뒤, `sudo ufw enable` 명령어로 활성화하세요.
      • 클라우드 보안 그룹 설정: AWS의 보안 그룹(Security Group)이나 GCP의 방화벽 규칙(Firewall Rules)을 사용하세요. 모든 IP(`0.0.0.0/0`)에 모든 포트를 열어두는 것은 절대 금물입니다. 웹 서비스(80, 443)는 모든 IP에, SSH는 내 IP에만 허용하는 식으로 규칙을 세분화해야 합니다.
    • Common Mistakes:
      • 방화벽이 설치는 되어 있지만, 비활성화된 상태로 서버를 운영하는 것.
      • 테스트를 위해 잠시 열어둔 포트를 잊어버리고 그대로 방치하는 것.
      • ‘일단 다 열어두고 나중에 막자’는 생각으로 인바운드 규칙을 `ALL-OPEN`으로 설정하는 것.
    • Practical Tips:
      • 서버에서 사용하는 포트 목록(예: SSH 2222, WEB 80/443, DB 3306)을 만들고, 이 목록에 없는 포트는 모두 차단하는 ‘화이트리스트’ 방식을 사용하세요.
      • 데이터베이스 포트(MySQL 3306 등)는 외부에서 직접 접근할 수 없도록 막고, 웹서버가 내부 네트워크를 통해서만 접속하도록 설정하는 것이 안전합니다.

    4.2. SSL/TLS 적용과 네트워크 모니터링

    사용자와 서버 간의 모든 통신은 암호화되어야 합니다. 암호화되지 않은 데이터는 중간에서 누구나 엿볼 수 있기 때문입니다.

    • Setup Steps:
      • 무료 SSL/TLS 인증서 발급: Let’s Encrypt와 Certbot을 이용하면 누구나 무료로 SSL/TLS 인증서를 발급받아 웹사이트에 HTTPS를 적용할 수 있습니다. Certbot은 설치 후 간단한 명령 몇 줄로 인증서 발급부터 웹서버 설정, 자동 갱신까지 처리해 줍니다.
      • HTTPS 강제: 인증서 적용 후, HTTP로 접속하는 모든 사용자를 HTTPS로 자동 전환(Redirect)하도록 웹서버(Nginx, Apache) 설정을 변경해야 합니다.
      • 네트워크 트래픽 확인: `netstat -tuln` 또는 `ss -tuln` 명령어로 현재 서버에서 어떤 포트들이 열려 있고 통신 중인지 주기적으로 확인하는 습관을 가지세요.
    • Operational Cautions:
      • SSL/TLS 인증서는 유효 기간이 있습니다. Let’s Encrypt는 90일로 짧기 때문에, Certbot의 자동 갱신 기능이 제대로 동작하는지 꼭 확인해야 합니다.
      • HTTPS를 적용하지 않으면 사용자들이 브라우저에서 ‘안전하지 않은 사이트’라는 경고를 보게 되고, 로그인 정보 등이 암호화되지 않은 채 전송되어 매우 위험합니다.
    • Practical Tips:
      • Qualys SSL Labs: 웹사이트 주소를 입력하면 내 서버의 SSL/TLS 설정이 얼마나 안전한지 점수로 보여주는 무료 서비스입니다. A+ 등급을 목표로 설정을 개선해 보세요.
      • CDN 활용: Cloudflare 같은 CDN 서비스를 사용하면 DDoS 공격 방어, 웹 방화벽(WAF) 등 추가적인 네트워크 보안 기능을 손쉽게 이용할 수 있습니다.

    5. 데이터 보호와 비상 대비: 백업과 모니터링

    아무리 보안을 철저히 해도 100% 완벽한 방어는 없습니다. 최악의 상황이 발생했을 때를 대비해 데이터를 복구할 수 있는 ‘보험’을 들어두어야 합니다.

    5.1. 정기적인 백업 전략 수립과 실행

    • Setup Steps:
      • 자동 백업 스케줄링: cron job을 이용해 매일 새벽 등 정해진 시간에 자동으로 백업 스크립트가 실행되도록 설정하세요. 워드프레스 파일(`tar` 명령어)과 데이터베이스(`mysqldump` 명령어)를 모두 백업해야 합니다.
      • 원격지에 백업 저장: 백업 파일을 원본 데이터가 있는 서버에 그대로 두는 것은 의미가 없습니다. 해킹이나 하드웨어 장애 시 함께 유실될 수 있기 때문입니다. AWS S3, Google Cloud Storage 같은 원격 스토리지나 다른 물리적 위치의 서버에 백업 파일을 전송하세요.
      • 복원 테스트: 백업은 복원될 수 있을 때만 의미가 있습니다. 최소 분기에 한 번은 백업 파일로 실제 데이터를 복원하는 테스트를 진행하여 백업이 정상적인지 검증해야 합니다.
    • Common Mistakes:
      • 백업의 중요성을 알면서도 ‘나중에 해야지’라며 미루다가 데이터를 모두 잃는 것.
      • 백업 파일을 원본 서버의 `/backup` 같은 디렉토리에 저장하는 것.
      • 수년 동안 백업만 하고 한 번도 복원 테스트를 해보지 않는 것.
    • Practical Tips:
      • 3-2-1 백업 규칙: 3개의 데이터 복사본을, 2개의 다른 종류의 저장 매체에 보관하고, 그중 1개는 원격지(off-site)에 두는 것을 목표로 하세요.
      • 클라우드 스냅샷: 클라우드 서버를 사용한다면 EBS 스냅샷(AWS)이나 디스크 스냅샷(GCP) 기능을 활용해 서버 전체를 통째로 백업할 수 있어 매우 편리합니다.
      • 워드프레스 백업 플러그인: UpdraftPlus 같은 플러그인을 사용하면 클릭 몇 번으로 파일과 DB를 함께 백업하고 원격 스토리지로 자동 전송할 수 있습니다.

    5.2. 로그 관리 및 시스템 모니터링

    로그는 우리 시스템에서 일어나는 모든 일을 기록한 일지입니다. 로그를 꾸준히 살피는 것은 침입 시도를 조기에 발견하고 문제의 원인을 파악하는 가장 좋은 방법입니다.

    • Setup Steps:
      • 주요 로그 파일 확인: SSH 로그인 시도 기록(`auth.log`), 웹서버 접근 기록(`access.log`), 에러 기록(`error.log`) 등을 주기적으로 확인하는 습관을 들이세요.
      • 모니터링 및 알림 설정: CPU, 메모리, 디스크 사용량이 갑자기 급증하는 것은 이상 징후일 수 있습니다. 클라우드에서 제공하는 모니터링 서비스(CloudWatch 등)나 직접 설치하는 도구(Prometheus, Zabbix)를 이용해 임계치를 설정하고, 문제 발생 시 이메일이나 Slack으로 알림을 받도록 설정하세요.
      • n8n 로그 모니터링: n8n을 운영한다면, 워크플로우 실행 로그와 에러 로그를 주기적으로 확인하여 비정상적인 동작이나 데이터 유출 시도가 없는지 점검해야 합니다.
    • Operational Cautions:
      • 로그 파일이 무한정 커지지 않도록 `logrotate` 설정을 통해 주기적으로 오래된 로그를 압축하거나 삭제해야 합니다.
      • 보안 사고가 발생했을 때, 관련 로그는 법적 증거가 될 수 있으므로 임의로 삭제해서는 안 됩니다.
    • Practical Tips:
      • 시스템 자원 모니터링은 보안뿐만 아니라 성능 문제를 진단하는 데도 매우 중요합니다. 평소 시스템 상태를 파악해두어야 비정상적인 상태를 빠르게 인지할 수 있습니다.
      • 로그를 통해 반복적으로 공격을 시도하는 IP가 있다면, 방화벽에서 해당 IP를 차단하는 조치를 취할 수 있습니다.

    6. 결론 (Conclusion)

    지금까지 초보 운영자가 꼭 알아야 할 인프라 보안의 핵심들을 함께 살펴보았습니다. 다시 한번 강조하지만, 가장 중요한 것은 강력한 접근 통제, 꾸준한 최신 업데이트, 꼼꼼한 방화벽 설정, 그리고 비상시를 대비한 백업과 모니터링입니다.

    보안은 한 번 설정하고 끝나는 이벤트가 아닙니다. 새로운 위협은 계속해서 등장하기 때문에, 지속적으로 배우고 관리해야 하는 ‘과정’입니다. 처음에는 어렵게 느껴질 수 있지만, 오늘 배운 내용들을 하나씩 실천하다 보면 어느새 안전한 인프라를 운영하는 자신을 발견하게 될 것입니다.

    이 가이드가 여러분의 든든한 첫걸음이 되었기를 바랍니다. 이 지식을 바탕으로 더욱 안전하고 즐거운 서버 운영의 세계를 경험하시길 응원합니다!

    🏷️ 관련 태그: 서버 보안, 워드프레스 보안, 도커 보안, SSH 보안, 데이터 백업