stamper
CLI개인서버TailscaleSSHZeroTrust

개인 서버 구축 2: Tailscale·SSH 관리망을 잠그는 CLI 프롬프트

개발자김철수1시간 전조회 2추천 0
변수 입력6
변수를 채운 뒤 완성본을 복사하세요

이번 단계의 목표

공인 IP, 통신사 NAT, 공유기 제조사와 관계없이 관리 장치와 서버를 같은 tailnet에 연결한다. SSH 22번을 인터넷에 공개하지 않고 Tailscale 주소로만 관리하는 것이 목표다.

Tailscale은 전송 경로를 만들고, 실제 접속 권한은 tailnet policy와 Linux 계정 권한이 함께 결정한다. OpenSSH를 Tailscale interface에서 사용하는 방식과 Tailscale SSH는 별도 선택지이므로 agent가 둘을 동시에 무작정 활성화하지 않게 한다.

준비할 정보

  • {{SERVER_OS}}: 배포판과 버전
  • {{ADMIN_DEVICES}}: 접속할 notebook·desktop·mobile
  • {{TAILNET_OWNER}}: 개인용 identity provider 계정 종류. 이메일 자체는 적지 않는다.
  • {{SSH_MODE}}: OpenSSH over Tailscale 또는 Tailscale SSH
  • {{ADMIN_USER}}: 서버의 non-root 관리자 계정명
  • {{CURRENT_ACCESS}}: local console 또는 현재 SSH session

두 SSH 방식 선택 기준

  • OpenSSH over Tailscale: 기존 sshd, Linux key와 설정을 그대로 사용한다. 익숙하고 이식성이 좋지만 key와 sshd_config를 직접 관리한다.
  • Tailscale SSH: tailnet identity와 policy로 SSH를 제어한다. 중앙 정책이 편리하지만 policy와 check mode를 이해하고 구성해야 한다.

처음 구축한다면 하나를 주 경로로 정하고 local console을 비상 경로로 남긴다. SSH 설정을 변경하는 동안 현재 정상 연결은 절대 먼저 끊지 않는다.

복사해서 쓰는 CLI agent 프롬프트

개인 Linux 서버의 원격 관리망을 Tailscale로 구축하고 SSH를 잠가줘.

서버 OS: {{SERVER_OS}}
관리 장치: {{ADMIN_DEVICES}}
tailnet identity 종류: {{TAILNET_OWNER}}
선택한 방식: {{SSH_MODE}}
Linux 관리자: {{ADMIN_USER}}
현재 복구 가능한 접속: {{CURRENT_ACCESS}}

보안 목표:
- 공유기 port forwarding과 공인망 SSH 노출 없음
- root login과 password brute force 차단
- 사용자·장치 단위 최소 권한
- 설정 실패 시 local console로 복구 가능

작업 규칙:
1. 현재 OS, network interface, listening port, firewall, sshd effective config를 읽기 전용으로 조사해. IP, public key, 계정명은 보고서에서 마스킹해.
2. Tailscale은 현재 OS용 공식 package 절차를 사용해. `curl | sh`를 쓴다면 먼저 URL·내용·공식 출처를 설명하고, 가능한 경우 공식 package repository 절차를 우선해.
3. `tailscale up` 인증 URL이나 auth key를 기록·채팅·commit에 남기지 마. reusable·preauthorized key를 기본값으로 만들지 마.
4. 서버와 관리 장치가 tailnet에 나타나고 Tailscale IP·MagicDNS 이름으로 양방향 확인될 때까지 SSH 방화벽을 바꾸지 마.
5. 선택한 {{SSH_MODE}}만 구성해. Tailscale SSH라면 현재 tailnet policy와 check mode를 먼저 검토하고, OpenSSH라면 authorized key 권한과 `sshd -t`를 확인해.
6. 새 terminal에서 key 기반 로그인이 성공하고 `sudo` 사용을 검증하기 전에는 `PasswordAuthentication`이나 `PermitRootLogin`을 변경하지 마.
7. SSH 설정은 drop-in 파일을 우선 사용하고 원본·변경 diff·복구 명령을 남겨. `sshd -t` 실패 시 reload하지 마.
8. firewall을 켜기 전 현재 session, Tailscale interface와 Docker 사용 여부를 확인해. SSH를 전체 인터넷에 허용하는 규칙을 만들지 마.
9. tailnet policy는 모든 사용자·모든 장치 허용 대신 관리자 identity가 server tag의 SSH에만 접근하도록 최소화해. 기존 policy가 있으면 덮어쓰지 말고 diff와 test 결과를 보여줘.
10. key expiry 해제를 편의상 기본 적용하지 마. 필요하다면 위험과 분실 시 revoke 절차를 설명하고 별도 승인을 받아.
11. 공유기 22번 forwarding, router DMZ, 공인 IP bind는 설정하지 마.

결과는 '현재 노출 / SSH 방식 선택 / Tailscale 설치 / policy 초안 / 단계별 실행·검증 / sshd hardening / firewall / 복구 절차 / 최종 노출 점검' 순서로 보고해.

단계별 검증 명령 예시

환경에 맞는 명령인지 agent가 먼저 확인해야 하며, 출력의 IP와 identity는 공개하지 않는다.

tailscale status
tailscale ip -4
sudo ss -lntup
sudo sshd -t
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication'
sudo ufw status verbose

관리 장치의 새 terminal에서 Tailscale IP 또는 MagicDNS 이름으로 접속하고 다음을 확인한다.

  1. key 또는 tailnet identity로 로그인된다.
  2. 기대한 Linux 사용자로 접속된다.
  3. sudo -v가 의도대로 동작한다.
  4. 서버 재부팅 후 tailscaled와 선택한 SSH 방식이 복구된다.
  5. 외부 network에서 공인 IP의 22번은 열려 있지 않다.

복구 절차에 반드시 포함할 것

  • local keyboard·monitor 또는 신뢰할 수 있는 LAN console 확보
  • 변경한 SSH drop-in의 정확한 파일명과 이전 내용
  • sshd -t 후 reload하는 명령과 drop-in을 제거하는 명령
  • 잘못된 tailnet policy를 이전 버전으로 되돌리는 절차
  • 분실한 장치·노출된 key를 admin console에서 revoke하는 절차

즉시 중단할 조건

  • local console 없이 현재 SSH session 하나만 남아 있다.
  • 새 Tailscale 경로가 검증되지 않았는데 firewall 또는 SSH 인증을 잠그려 한다.
  • auth key·private key·인증 URL을 파일이나 대화에 출력하려 한다.
  • 기존 tailnet policy의 영향을 분석하지 않고 전체 policy를 교체하려 한다.

공식 자료

댓글 0

아직 댓글이 없습니다.