FRELY / BLOG

SSH 키를 건네주지 않고 AI가 서버 운영을 돕게 하기

점점 더 많은 사람들이 AI 어시스턴트에게 로그 읽기, 설정 편집, 서비스 재시작을 맡깁니다. 가장 자연스러운 방법은 내 컴퓨터에서 명령을 실행할 수 있는 AI를 실행하고, 그 AI가 ssh로 서버에 접속하게 하는 것입니다.

동작은 합니다. 하지만 한 가지 디테일은 짚고 넘어갈 가치가 있습니다. AI가 ssh를 실행하게 하려면 ~/.ssh 폴더 전체를 넘겨주게 됩니다.

노트북을 거치는 방식: 생각보다 많은 것을 넘겨주게 됩니다

AI가 내 컴퓨터에서 ssh prod를 실행하려면 ~/.ssh 안의 설정 파일과 개인 키를 읽을 수 있어야 합니다. 대부분의 권한 제어는 폴더를 읽을 수 있는지만 정할 수 있을 뿐, "이 서버 하나만"이라고 지정할 수는 없습니다. 그러면 이런 일이 생깁니다:

  • 이 서버용 키 하나가 아니라 모든 개인 키를 읽을 수 있습니다.
  • 명령이 네트워크에 닿을 수 있는 한 키는 내 컴퓨터 밖으로 나갈 수 있습니다. 한번 유출된 키는 계속 유효합니다. 나중에 AI의 접근을 꺼도 키는 회수되지 않으며, 모든 서버에서 공개 키를 제거해야 합니다.
  • ssh로 로그인한 뒤에는 서버에서 AI가 할 수 있는 일이 그 키 뒤에 있는 계정에 따라 결정됩니다. root라면 AI도 root입니다.

서버 로그에는 "내 노트북이 내 키로 로그인했다"는 기록만 남습니다. 내 명령인지 AI의 명령인지 구분할 수 없습니다.

방향을 반대로: 서버가 바깥으로 연결하게 하기

AI에게 서버 문을 여는 키를 주는 대신, 서버에 작은 프로그램 하나를 설치합니다. 서버가 AI 계정 쪽으로 연결하고, AI가 거기서 무엇을 할 수 있는지는 내가 정합니다.

Frely에서는 이렇게 동작합니다:

  1. Frely 웹사이트에서 My Devices(내 기기) → Add a computer(컴퓨터 추가)를 열어 일회용 설치 명령을 만듭니다. 그 명령을 서버에 붙여넣습니다. 토큰은 한 번만 동작하고 15분 후에 만료되며 서버에 저장되지 않습니다.
  2. 서버가 Frely 쪽으로 연결합니다. 포트를 하나도 열지 않습니다.
  3. ChatGPT, Claude 또는 Codex에서 FrelyMCP를 연결하면 AI가 해당 서버에서 파일을 읽고 명령을 실행할 수 있습니다.

이 방식이 달라지는 점:

  • 수명이 긴 키가 AI에게 넘어가지 않습니다. 서버에는 자체 기기 신원이 있고, AI가 실행하는 명령은 그 신원을 읽을 수 없습니다.
  • 명령은 기본적으로 샌드박스에서 실행됩니다. 지정한 폴더와 임시 폴더에만 쓸 수 있고, ~/.ssh와 ~/.aws 같은 자격 증명 폴더는 읽을 수 없습니다. 서버가 샌드박스를 실행할 수 없을 때는 보호 없이 실행하는 대신 명령을 거부합니다.
  • 더 많은 접근에는 내 승인이 필요합니다. AI가 요청하면 Frely 웹사이트에서 패스키(passkey)나 인증기 코드로 허용할지, 그리고 얼마나 허용할지(명령 한 번, 12시간, 또는 기기 인가가 끝날 때까지)를 결정합니다. AI가 스스로 요청을 승인할 수는 없습니다.
  • 언제든 즉시 철회할 수 있습니다. 모든 호출은 인가를 다시 확인하므로, 철회한 뒤의 다음 명령은 거부됩니다.

더 안전하게 만드는 네 가지 습관

서버에서의 경계는 "Frely가 실행되는 시스템 사용자에 샌드박스를 더한 것"입니다. 이 선택이 경계의 강도를 결정합니다:

  1. root가 아닌 전용 사용자로 설치합니다. 예를 들어 frely-ops를 만들고 앱 폴더에만 접근 권한을 줍니다. 샌드박스는 쓰기를 제한할 뿐 사용자가 읽을 수 있는 범위는 제한하지 않으므로, 사용자 권한이 작을수록 좋습니다. root 없이 시스템 로그를 읽으려면 adm과 systemd-journal 그룹에 사용자를 추가하세요.
  2. 샌드박스가 동작하는지 확인합니다. Linux에서는 bubblewrap, socat, ripgrep을 설치하세요. frely doctor가 샌드박스 사용 가능 여부를 알려줍니다. CentOS 7 같은 오래된 시스템은 샌드박스를 실행할 수 없으니, 열어두기보다는 기간을 정해 "샌드박스 없이 실행"을 승인하세요.
  3. 필요한 폴더만 공유합니다. 홈 폴더 전체를 공유하는 대신 FRELY_WORKSPACE=/srv/myapp으로 지정하고, 기기 인가 기간은 짧게 유지하세요.
  4. docker 그룹의 의미를 이해합니다. docker 그룹에 속한 사용자는 docker logs를 바로 읽을 수 있어 편리하지만, 그 소속은 root만큼 강력합니다.

그래도 ssh가 괜찮은 경우

AI가 로그를 읽고 읽기 전용 명령 몇 개만 실행하는 정도라면 노트북을 거치는 방식도 괜찮습니다. 단, 다음 조건을 지켜야 합니다:

  • 이 서버 전용 키를 따로 만들고 서버의 authorized_keys에서 from=과 restrict로 제한하며, 권한이 제한된 사용자로 로그인합니다.
  • 같은 ~/.ssh 안에 강력한 권한의 다른 키를 두지 않습니다.
  • 며칠씩 열어두지 않고, 당장의 작업에만 접근을 허용합니다.

요약

AI가 서버를 운영할 때 중요한 것은 AI가 얼마나 똑똑한지보다 무엇을 쥐고 있는지입니다. 키를 AI에게 건네주는 대신, 서버가 바깥으로 연결하게 하고 AI가 무엇을 할 수 있는지는 승인으로 정하세요.

Frely CLI로 시작하기

All posts