MCP SSH Manager - Model Context Protocol을 통한 원격 서버 관리
요약
MCP SSH Manager는 Model Context Protocol(MCP)을 사용하여 Claude Code와 OpenAI Codex 같은 AI 어시스턴트가 여러 원격 SSH 연결을 관리할 수 있게 합니다. 이를 통해 명령 실행, 파일 전송, DB 관리 등 DevOps 작업을 자동화하여 서버 관리를 효율적으로 수행합니다.
핵심 포인트
- AI 어시스턴트를 위한 통합 SSH 관리 솔루션 제공
- 명령어 주입 방지 등 보안 취약점 수정 및 강화
- DevOps 작업(파일 전송, 상태 모니터링)을 자동화하여 서버 관리 용이
MCP SSH Manager - Model Context Protocol을 통한 SSH 원격 서버 관리 🚀
A Model Context Protocol (MCP) 서버로, Claude Code와 OpenAI Codex가 여러 SSH 연결을 관리할 수 있도록 합니다. AI 어시스턴트로부터 직접 명령 실행, 파일 전송, 데이터베이스 관리, 백업 생성, 상태 모니터링 및 DevOps 작업을 자동화하여 서버 전체에 걸쳐 수행할 수 있습니다.
<div align="center">
🎉 v3.8.6의 새로운 기능
🔒 보안 릴리스 — 6개의 취약점 수정. 업그레이드하세요. (출시일: 2026년 10월 8일)
- 🔴 기본
on-error훅을 통한 자체 기계의 명령어 주입 (Command injection) (GHSA-759m-wfpq-xmx3) — 서버가 선택하는 텍스트인 연결 오류가 셸 명령에 붙여넣어졌습니다. mcp-ssh-manager를 실행하는 기계에서 접속하는 모든 SSH 서버는 명령을 실행할 수 있었습니다. 이제 훅 값은 명령어 텍스트가 아닌 셸 변수로 명령어에 전달되며, 기본 훅은 셸 없이 로그를 작성합니다. - 🔴
restricted모드가 라인의 시작만 확인 (GHSA-rfxw-26h6-7w42) —^echo는echo hi; id를 통과시켰습니다. 목록이나 파이프라인의 모든 명령어는 이제 허용 목록(allowlist)과 일치해야 합니다. 명령어 치환 및 파일 쓰기는 거부됩니다. - 🔴
cwd가 셸에 따옴표 없이 도달 (GHSA-37fv-fcpc-j236), 보안 정책을 우회했습니다. - 🔴
ssh_db_query에서 쓰기 가능 (GHSA-9w6j-vg8f-hp8g, GHSA-q37w-vhpx-q5q9) —SELECT … INTO OUTFILE, 새로운 테이블에 대한SELECT … INTO, 그리고 MongoDB 쿼리에서의 JavaScript가 문제였습니다. 이제 쿼리는 읽기 전용 트랜잭션으로 실행되며, MongoDB 쿼리는 필터 문서여야 합니다. - 🟠 호스트 키 비교를 수행하지 않음 (GHSA-cwg3-pfmm-w8rm) — OpenSSH처럼 변경된 호스트 키는 이제 거부됩니다. 키가 기록된 이후 재설치된 서버의 경우
ssh-keygen -R <호스트>를 한 번 실행해야 합니다. ssh_deploy와ssh_backup_schedule는 모든 값을 따옴표 처리하며, 크론 스케줄은 반드시 스케줄이어야 합니다.
훅 설정(Hook settings), 별칭(aliases), 활성 프로필(active profile) 및 로그는 이제 설치된 패키지 내부가 아닌 ~/.ssh-manager/에 위치하여 오직 사용자만 읽을 수 있으며, 이전에는 모든 업그레이드 시 손실되었습니다.
전체 변경 로그 보기 → · 이전 버전: v3.8.5, 세 가지 명령어 주입 관련 권고 사항.
🔐 에이전트에게 SSH 접근 권한 부여하기, 안전하게
MCP SSH 서버는 AI 에이전트에게 줄 수 있는 가장 위험한 도구입니다. 바로 중요한 기계에 대한 셸(shell)이기 때문입니다. 이 서버는 전역적으로가 아니라 서버별로 에이전트가 얼마나 멀리 갈 수 있는지 사용자가 결정할 수 있도록 구축되었습니다.
| Mode | 에이전트가 수행할 수 있는 작업 |
|---|---|
unrestricted (기본값) | 모든 것. 다른 SSH MCP 서버와 동일한 동작을 합니다. |
| ... |
SSH_SERVER_PROD_MODE=readonly
SSH_SERVER_STAGING_MODE=restricted
SSH_SERVER_STAGING_ALLOW_PATTERNS=^systemctl (status|restart) myapp$;^tail -n \d+ /var/log/
이와 함께:
- sudo 비밀번호가 원격 명령줄에 절대 도달하지 않습니다. SSH 채널의 stdin을 통해 전송되므로,
ps나/proc/<pid>/cmdline, 또는auditd기록에서 보이지 않습니다. 이는 이 범주에서 흔히 사용되는echo "$pass" | sudo -S패턴과는 다릅니다 (#34). - 모든 데이터베이스 인수는 중앙 집중식 헬퍼를 통해 셸 따옴표 처리됩니다. 이는 648 조합의 주입 테스트로 보호받습니다.
- 읽기 전용 SQL이 강제됩니다. 제안하는 것이 아니라,
ssh_db_query는SELECT가 아닌 것은 거부합니다. - 취약점은 숨겨지지 않고 공개됩니다. 보고 절차와 이미 수정된 권고 사항은 SECURITY.md를 참조하십시오.
- 재현 가능한 설치: lockfile을 커밋하고, CI는
npm ci로 설치하며, 테스트는 모든 의존성이 integrity hash가 포함된 registry.npmjs.org에서 해결되고 검토되지 않은 설치 스크립트가 없는지 확인합니다。
이전 릴리스 (Previous Releases)
<details> <summary><b>📜 릴리스 기록 — v3.8.4부터 v1.0.0까지</b> (클릭하여 확장)</summary>v3.8.4 - 로거가 더 이상 비밀 정보를 평문으로 작성하지 않으며, 모든 커밋에 CodeQL 적용 (2026년 8월 28일)
- 🔒 로거는 더 이상 비밀 정보를 평문으로 기록하지 않습니다.
~/.ssh-manager.log와 stderr(MCP 호스트가 캡처하는 곳)에 기록하기 때문에, 서버 설정을 전달하는 단 한 번의 호출 지점만으로도 운영 환경 비밀번호가 영구적으로 저장될 수 있었습니다. 이제 마스킹(Redaction)은 로거 내부에서 이루어집니다. 또한: 모든 푸시마다 CodeQL을 적용하고, SHA로 고정된 모든 액션에 대해 적용하며, 이전에 구문 분석되지 않던 오류 예제도 수정했습니다. 전체 변경 로그 →
v3.8.2 / v3.8.3 - sudo 비밀번호 유출 문제 해결, MCP 레지스트리 도입, 서명된 릴리스 (2026년 8월 28일)
- 🔒 sudo 비밀번호가 더 이상 원격 명령어 라인에 도달하지 않습니다 (#34) — 이전에는
echo "<password>" | sudo -S를 통해 전송되어 호스트의 모든 계정에서ps및/proc/<pid>/cmdline으로 읽을 수 있었습니다. 이제는 SSH 채널의 stdin을 통해 전달됩니다. 또한: 공식 MCP Registry에io.github.bvisible/mcp-ssh-manager로 등재되었으며, CI를 통해 게시되는 릴리스에는 SLSA provenance와 CycloneDX SBOM이 포함되고, 서버별 보안 모드가 문서화되었습니다. 전체 변경 로그 →
v3.8.1 - 재현 가능한 설치 및 품질 게이트 차단 (2026년 8월 28일)
- 커밋된 lockfile (#60 — @cudatuda 기여)와
npm run test:lockfile을 추가하여 드리프트 및 변조로부터 보호합니다. CI는npm ci를 사용하며, ESLint와 JSDoc 타입 검사가 순수하게 장식용이었던 것에서 차단 게이트가 되었습니다. 전체 변경 로그 →
v3.8.0 - 설정에 그룹 추가, Windows에서의 ssh_sync, 터널 충돌 수정 (2026년 8월 14일)
- 👥 서버별 새로운 선택적
group필드 (#56 — @ice616 기여, #55에서 요청됨) — 서버에group = "production"으로 태그를 지정하면 해당 그룹에 포함되며,ssh_execute_group은.env/TOML에서 멤버를 직접 해석하고 기존의.server-groups.json과 합칩니다. 또한: Windows 호스트에서의ssh_sync가 수정되었고 (#59 — @2836603852 기여), 바쁜 포트에서의 터널이 더 이상 전체 MCP 서버를 다운시키지 않으며,@modelcontextprotocol/sdk의 최소 버전이 세 가지 권고 사항을 거쳐^1.30.0으로 상향 조정되었고, CI에 JSDoc 타입 검사가 추가되었습니다. 전체 변경 로그 →
v3.7.0 - 서버별 SSH 에이전트 포워딩 (2026년 7월 13일)
- 🔗 새로운 선택적
FORWARD_AGENT/forward_agent옵션 (#53 — @raphaelbahat가 #52에서 요청함) — OpenSSH의ForwardAgent yes와 동일하며, 서버별로 적용됩니다. 원격 호스트의 프로세스가 로컬ssh-agent에 있는 키를 사용하여 다른 SSH 호스트에 인증할 수 있게 하며, 어떤 개인 키도 복사하지 않습니다. 에이전트가 실행 중이어야 하며 기본값은false입니다. 전체 변경 로그 →
v3.6.7 - 보안: 데이터베이스 헬퍼의 명령어 주입 수정 (2026년 7월 11일)
- 🔒 모든
ssh_db_*인수가 이제 쉘 따옴표로 감싸짐 (#51 — Ugur Ozer, Aeon AI Risk Management (http://airiskmanagement.ca)가 책임감 있게 공개함, #48 참조) — 호출자가 제어하는 값(ssh_db_list가 가장 대표적이며,readonly/restricted모드에서 허용됨)이 쉘 평가 문자열에 삽입되어 SSH 대상에서 임의의 명령어 실행을 가능하게 했습니다. 이제 중앙 집중식shellQuote()가 모든 15개 빌더의 모든 값을 감싸며, 648가지 조합의 주입 테스트로 보호합니다. 전체 변경 로그 →
v3.6.6 - SUDO_PASSWORD / DEFAULT_DIR / ssh_sync 키 인증 재작동 (2026년 7월 11일)
- 🔑 카멜 케이스(camelCase) 설정 필드 읽기 (#50 — @egoan82 덕분) — v3.0.0 ConfigLoader 리팩토링 이후,
ssh_execute_sudo가SUDO_PASSWORD를 무시했고,DEFAULT_DIR는ssh_execute/ssh_group_execute/ssh_list_servers에 의해 무시되었으며,ssh_sync는 설정된 SSH 키를 rsync에 전달하지 않았습니다. 이제 로더의 카멜 케이스 필드와 모두 일치하며, 회귀 테스트가 로더 출력 형태를 고정합니다. 전체 변경 로그 →
v3.6.5 - ssh_db_query 셸 인젝션 보안 수정 및 실제 행 개수(row_count) 반영 (2026년 6월 30일)
- 🔒 쿼리가 단일 따옴표를 사용한 heredoc을 통해 stdin으로 전달됩니다 ([#44]...) — 원격 셸이 더 이상 쿼리 내부의 백틱/
$(…)을 파싱하지 않습니다 (이는 백틱 식별자를 손상시키고 "SELECT 전용" 도구가 임의의 셸 명령을 실행하도록 허용했었습니다). 또한,row_count는 이제 래퍼 라인을 세는 대신 각 엔진의 실제 출력을 반영합니다. 전체 변경 로그 →
v3.6.4 - 내부 정리 및 데드 코드(dead-code) 품질 게이트 추가 (2026년 6월 18일)
- 🧹 데드 코드 제거 (−343 라인), 동작 변화 없음 — 사용하지 않는 export 27개와 중복 export 2개를 제거했습니다. MCP 서버와 CLI는 동일하게 작동합니다 (명령어 빌더/파서가 바이트 단위로 동일하며, 모든 37개 도구가 end-to-end 검증되었습니다). 보정된
knip.json과 차단(blocking)knipCI 단계가 사용하지 않는 코드가 다시 침투하는 것을 방지합니다. 전체 변경 로그 →
v3.6.3 - ssh_sync가 실제 전송 건수를 보고합니다 (2026년 6월 18일)
- 📊 더 이상 "전송할 파일이 필요하지 않음"이라는 허위 메시지가 없습니다 ([#42]...) — rsync의
--stats파싱을 수정했습니다: 이제--stats가 항상 전달되며, rsync 2.x/3.x 문구, openrsync의B접미사, 그리고 로케일 구분자 모두 처리됩니다. 전체 변경 로그 →
v3.6.2 - 풍부해진 도구 설명 (2026년 6월 9일)
- 📝 모든 37개 도구 설명 재작성 — 이제 모든 MCP 도구가 단순한 4~10단어 요약 대신 실제 동작(사이드 이펙트, 파괴적/읽기 전용 성격, Idempotency, sudo/인증 요구 사항, 보안 모드 게이팅, 매개변수 의미론)을 문서화합니다. 에이전트는 이제 도구를 호출하기 전에 그 결과를 알게 됩니다. 행동 변화는 없으며,
description문자열만 변경되었습니다. 전체 변경 로그 →
v3.6.1 - Teardown 위생 관리 후속 조치 (2026년 6월 9일)
- 🔌 모듈 수준 타이머가 더 이상 이벤트 루프를 고정하지 않음 (#41에 대한 후속 조치) —
tunnel-manager.js와session-manager.js는unref()되지 않은 모듈 수준의setInterval을 등록하여, 두 모듈 중 어느 것을 가져오더라도 Node의 이벤트 루프를 살아있게 유지했습니다. 이제 둘 다unref()처리되었습니다. 전체 변경 로그 →
v3.6.0 - 실시간 설정 핫 리로드 + stdio 생명 주기 수정 (2026년 6월 9일)
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Codex tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기