서버 하나 털린 적이 있습니다.
정확히는 암호화폐 채굴 악성코드가 들어와서, 결국 서버를 통째로 갈아엎었어요. 그 뒤로 제가 제일 먼저 한 일 중 하나가, 젠킨스를 외부에서 못 들어오게 막는 거였습니다.
왜 하필 젠킨스냐. 이게 오늘 얘기입니다.
젠킨스는 "명령을 실행하는 로봇"이다
젠킨스(Jenkins, 자동 배포를 돌려주는 CI 도구)를 뭐라고 설명하면 좋을까요.
공장 자동화 로봇이라고 해봅시다. 코드를 올리면 → 알아서 빌드하고 → 테스트하고 → 서버에 배포합니다. 사람이 매번 손으로 안 해도 되게요. 편하죠.
근데 이 로봇의 정체를 한 겹 벗겨보면 좀 무섭습니다. 젠킨스는 결국 "내 서버에서 아무 명령이나 실행할 수 있는 권한"을 가진 프로그램이거든요. 빌드 스크립트라는 게 사실 셸 명령이니까요.
즉, 젠킨스 관리자 화면에 들어올 수 있다는 건 = 내 서버에 명령을 내릴 수 있다는 것과 거의 같습니다.
여기서 어? 싶으시죠. 그걸 인터넷에 열어둔다고요?

공격자는 사람이 아니라 봇이다
"내 젠킨스 주소를 아무도 모르는데 괜찮지 않나요?"
저도 처음엔 그렇게 생각했어요. 근데 아닙니다.
서버 로그를 열어보면, 하루에도 수백 번씩 정체불명의 접속이 찍힙니다. .env 파일 내놔라, wp-config.php 있냐, 관리자 페이지 어디냐. 사람이 하는 게 아니라 봇이 인터넷 전체를 자동으로 훑고 다니는 겁니다.
문 손잡이를 하루종일 돌려보는 로봇이 온 동네를 돌아다닌다고 생각하면 돼요. 잠겨 있으면 넘어가고, 열려 있으면 바로 들어옵니다. 내 주소를 "몰라서" 안전한 게 아니라, 걔들은 주소를 찍어서 옵니다.
젠킨스처럼 알려진 소프트웨어는 기본 경로도 뻔합니다. 버전에 알려진 취약점이라도 하나 있으면? 그날로 끝입니다. 실제로 젠킨스는 원격 코드 실행 취약점이 여러 번 터졌던 소프트웨어예요.
그래서 어떻게 막았나
핵심은 하나입니다. 관리 도구는 인터넷에 두지 않는다.
제가 한 건 이렇습니다.
첫째, 젠킨스 도메인의 DNS를 아예 없앴습니다. 바깥에서 주소로 찾아올 수 없게요. 그리고 웹 서버(nginx)에도 혹시 모를 접속을 그냥 끊어버리는(return 444) 블록을 하나 더 뒀습니다. 이중 잠금이죠.
둘째, 그럼 나는 어떻게 쓰냐. SSH 터널로 들어갑니다. 쉽게 말하면, 이미 안전하게 뚫려 있는 SSH 통로를 타고 들어가서, 내 컴퓨터에서만 젠킨스에 접속하는 방식이에요. 외부엔 아무 문도 안 열려 있는데, 나만 뒷문 열쇠를 가진 셈입니다.
이게 포인트예요. "쓸 수 있다"와 "누구나 접근할 수 있다"는 다릅니다. 나만 쓸 수 있으면 되지, 인터넷 전체에 열어둘 이유가 없어요.
마무리
솔직히 저도 한 번 크게 당하고 나서야 이 습관이 생겼습니다.
정리하면 이렇습니다. 젠킨스, 그라파나, DB 관리 도구, 관리자 페이지 — 이런 "내부용 도구"는 기본값이 비공개여야 합니다. 편하다고 인터넷에 열어두는 순간, 그건 나만 편한 게 아니라 봇들한테도 편한 문이 됩니다.
한마디로, 관리 도구의 접근 경로는 최대한 좁힐수록 안전합니다. 지금 운영 중인 서버가 있다면, 젠킨스나 관리자 페이지가 혹시 바깥에서 열리는지 딱 한 번만 확인해보세요. 브라우저에 그 주소를 시크릿 창으로 쳐보는 것만으로도 충분합니다. 열리면, 그게 오늘 제일 급한 일입니다.
'서버, 인프라' 카테고리의 다른 글
| 서버가 털린 날 — 암호화폐 채굴 악성코드는 이렇게 들어왔다 (0) | 2026.09.24 |
|---|---|
| SSL 인증서 7개가 한날 만료됐다 — certbot이 없었던 대가 (0) | 2026.09.21 |
| 그래서 보안과 편의 사이, 어디에 서야 할까 (0) | 2026.06.21 |
| Jenkins 자동배포, 보안이랑 403이랑 한참 싸웠습니다 (0) | 2026.06.20 |
| 7개 도메인을 무중단으로 HTTPS 이전한 이야기 (0) | 2026.06.19 |