---
title: "세션 보호"
description: "Alpacon 작업 세션이 서버에서 사람과 AI 에이전트를 어떻게 제한하는지 설명합니다. 명령과 sudo마다 거치는 확인, 세션이 끝날 때 닫히는 항목, Alpacon AI를 쓸 수 없을 때 확인 없이 허용되는 동작, 작업 세션 밖에서 이뤄지는 접근까지 함께 정리했습니다."
---

> Full documentation index: https://docs.alpacax.com/llms.ko.txt

# 세션 보호

사람이나 AI 에이전트가 Alpacon으로 서버에서 작업하는 동안 서버를 보호하는 장치와 그 보호가 닿지 않는 범위를 설명합니다. 보안 검토자가 답해야 하는 두 가지 질문, 즉 오작동하는 에이전트나 내부자를 무엇이 막는지, 그리고 어떤 경우에 확인 없이 허용되는지를 이 페이지만으로 판단할 수 있도록 정리했습니다.

내용은 Alpacon Cloud 기준입니다. Alpacon AI 없이 운영하는 셀프 호스팅 환경에서 동작이 다르면 해당 절에 따로 적었습니다.

## 작업 세션이 보장하는 것

서버에 대화형으로 접근하려면 [작업 세션](/use/work-sessions/)을 거쳐야 합니다. 상시 접근 권한을 가진 사람은 없습니다. 콘솔이나 CLI에 로그인한 사람이라도 해당 작업을 포함하는 승인된 활성 세션이 없으면 터미널을 열거나 파일을 전송하거나 명령을 실행할 수 없습니다.

세션은 요청자가 선언하고 승인자가 받아들인 한도입니다.

- **기능**: 웹 터미널, 파일 전송, 명령 실행, 포트 포워딩, 코드 편집기, sudo를 각각 따로 선언합니다.
- **서버**: 세션에 지정한 서버에만 접근할 수 있습니다.
- **사용자**: 세션을 배정받은 사람만 사용할 수 있습니다.
- **목적**: 작성한 목적은 승인자에게 표시되고 기록에 함께 남습니다.
- **기한**: 정해진 시각에 세션이 끝나고, 세션에서 연 것은 모두 닫힙니다.

세션 승인 시점뿐 아니라 작업이 일어날 때마다 세션과 대조합니다. 세션 범위를 벗어난 작업은 요청자의 역할과 관계없이 거부됩니다.

## 범위와 목적

세션을 요청하면 Alpacon은 선언된 내용을 다음과 같이 확인합니다.

- **기능**: AI 에이전트는 웹 터미널을 선언할 수 없습니다. 에이전트 세션은 생성할 때 거부되고, 이후에 터미널을 열려고 해도 다시 거부됩니다.
- **서버**: 세션에는 접근할 서버 목록이 있습니다. 목록에 없는 서버로 보내는 명령이나 연결은 거부됩니다.
- **계정**: **접속 계정**에서 작업할 서버 계정을 지정할 수 있습니다. 에이전트 세션은 승인받은 계정으로만 실행되며, 다른 계정은 거부됩니다. 다른 사람에게 연결된 계정으로는 어떤 세션도 실행할 수 없고, 이 제한은 어떤 규칙이나 설정으로도 풀 수 없습니다.
- **목적**: 세션에는 목적을 최대 2,048자로 적어야 합니다. 목적은 세션 내내 따라다닙니다. 명령은 목적에 비추어 판단하고, 목적에서 벗어난 작업은 보류될 수 있습니다([명령별 확인](#명령별-확인) 참고).

세션이 진행되는 동안 모든 작업은 다음 확인을 차례로 통과해야 합니다. 세션이 끝나지 않았는지, 활성 상태인지, 해당 기능이 포함됐는지, 대상 서버가 세션에 속하는지, 요청한 사람이 세션을 배정받은 사람인지 확인합니다. 다른 멤버의 세션에서 작업할 수 있는 사람은 웹 콘솔을 쓰는 Superuser뿐입니다.

## 승인

새 세션은 규칙으로 허용되지 않는 한 승인을 기다립니다.

- **기본값**: Superuser가 요청한 세션은 바로 승인됩니다. 그 밖의 세션은 승인자 한 명의 승인을 기다리며, AI 에이전트 세션은 누가 요청했든 항상 승인을 기다립니다.
- **승인자**: 접근 규칙에 지정한 사람이 승인합니다. 승인자를 지정한 규칙이 없으면 활성 상태인 모든 Superuser가 승인할 수 있습니다.
- **규칙**: **접근 규칙**의 **세션 열기** 탭에서 요청을 허용하거나, 승인자에게 보내거나, 차단하는 규칙을 둘 수 있습니다. AI 에이전트 허용 규칙은 목적을 밝힌 에이전트 세션만 허용합니다.
- **승인 경로**: 승인은 웹 콘솔이나 승인용으로 등록된 채널에서만 받습니다. 요청을 보낸 CLI, MCP 클라이언트, 토큰으로는 승인할 수 없습니다.
- **자기 승인**: 규칙에서 막지 않으면 요청자가 자기 요청을 승인할 수 있으며, 기록에는 자기 승인으로 표시됩니다. 에이전트 클라이언트와 콘솔을 구분할 수 없는 환경에서는 에이전트 세션을 요청한 사람이 직접 승인할 수 없습니다.
- **추가 인증**: 승인으로 새 권한이 생기거나 워크스페이스가 승인에 MFA를 요구하면, 승인자는 승인 직전에 MFA를 다시 거칩니다. 앞서 로그인할 때 거친 MFA는 인정하지 않습니다.
- **처리되지 않은 요청**: 아무도 결정하지 않은 요청은 요청한 종료 시각과 대기 한도(기본 24시간) 중 먼저 도달한 시점에 취소됩니다.
- **변경**: 연장은 새 세션과 같은 규칙을 거칩니다. 에이전트 세션의 목적을 바꾸거나 서버를 추가할 때도 다시 승인을 받아야 합니다.

승인 단계의 확인은 요청을 규칙과 대조할 뿐, 세션에서 무슨 일을 할지는 살펴보지 않습니다. [Alpacon이 확인하는 것과 확인하지 않는 것](/learn/security/what-alpacon-checks/)을 참고하세요.

## 명령별 확인

작업 세션 안에서 명령 API나 `alpacon exec`로 보낸 명령은 서버에 전달되기 전에 Alpacon AI가 하나씩 판단합니다. AI는 명령의 위험도를 평가하고, 승인하거나 거부하고, 세션 목적과 비교합니다. 작업 세션 안의 명령은 판단 결과에 따라 다음과 같이 처리합니다. 세션 밖에서 서비스 토큰으로 보낸 명령은 처리 방식이 다르며, [작업 세션 밖의 접근](#작업-세션-밖의-접근)을 참고하세요.

| AI 판단 | 사람이 보낸 명령 | AI 에이전트가 보낸 명령 |
|---|---|---|
| 승인 | 실행 | 아래 보류 조건에 해당하지 않으면 실행 |
| 승인했지만 AI가 확신하지 못함 | 실행 | 승인자에게 보류 |
| 세션 목적에서 벗어남 | 승인자에게 보류 | 승인자에게 보류 |
| 거부 | 승인자에게 보류, 승인자는 AI가 거부한 이유를 확인 | 승인자에게 보류, 승인자는 AI가 거부한 이유를 확인 |

- **항상 사람이 확인하는 서버**: `agent-approval-required` 서버 그룹에 속한 서버로 에이전트가 보낸 명령은 AI 판단과 관계없이 항상 보류됩니다.
- **보류된 명령**: [승인](/use/approvals/)에서 대기하며 승인자에게 알림이 갑니다. 승인하면 실행되고, 거부하거나 24시간 안에 아무도 결정하지 않으면 실행되지 않습니다. 요청자 말고는 승인할 사람이 없으면 명령은 바로 거부됩니다.
- **워크스페이스 규칙**: **명령어 실행** 탭의 규칙은 요청자, 서버 그룹, AI 위험도를 기준으로 기본 동작 대신 명령을 보류하거나 허용하거나 차단할 수 있습니다. 다만 AI가 거부한 명령을 통과시키는 규칙은 없습니다. 규칙이 차단한 명령은 거부됩니다.
- **스크립트**: 명령으로 실행하는 파일은 AI 검토를 통과해야 합니다. 승인자가 이미 허용한 스크립트는 내용이 바뀌지 않았다면 다시 보류되지 않고 실행됩니다.
- **터미널에서 입력한 명령**: Websh 터미널에서 입력한 명령은 하나씩 판단하지 않고, 그 안의 `sudo`만 판단합니다([sudo와 계정 전환](#sudo와-계정-전환) 참고). 세션 전체는 끝난 뒤 AI 분석을 받습니다.
- **Advisory 워크스페이스**: [실행 제어](/use/workspace/settings/#실행-제어)를 Advisory로 둔 워크스페이스는 판단 결과를 모두 기록하지만, 판단을 이유로 보류하거나 거부하지 않습니다. 명령은 바로 실행되고 새 세션은 승인 없이 열립니다.

결과는 명령마다 상태, AI 위험도, 그리고 보류되거나 거부된 경우 그 이유로 확인할 수 있습니다. [명령](/use/audit/events/commands/)을 참고하세요.

## sudo와 계정 전환

`sudo`를 쓰려면 세션에 sudo 기능이 선언돼 있어야 합니다. Superuser를 포함해 모든 요청자에게 똑같이 적용됩니다. 그다음 `sudo`를 쓸 때마다 권한 상승 명령에 대해 AI가 평가한 위험도로 하나씩 판단합니다. 아래 표는 이 사용 시점의 확인이며, 승인자가 이미 승인한 명령은 [아래의 예외](#approved-commands)를 따릅니다.

| 위험도 | 사람 | AI 에이전트 |
|---|---|---|
| **정보**, **낮음** | MFA 후 허용 | 허용 |
| **중간** | MFA 후 허용 | 승인자에게 보류 |
| **높음** | 승인자에게 보류 | 승인자에게 보류 |
| **심각** 또는 평가 없음 | 거부 | 거부 |

- **MFA**: 사람은 최근에 거친 MFA로 직접 작업 중임을 증명합니다. 에이전트는 이를 증명할 수 없으므로 세션 승인이 그 역할을 대신합니다. 터미널 없이 실행되는 명령은 MFA를 요청할 수 없어 `SUDO_PRESENCE_REQUIRED`로 거부되며, 인증을 마친 뒤 다시 실행하면 됩니다.
- **보류**: 보류된 `sudo`는 승인 요청을 만듭니다. 승인된 뒤 명령을 다시 실행하세요.
- <a id="approved-commands"></a>**승인된 명령**: 사람이 보류된 명령을 승인하면, 그 명령줄에 적힌 `sudo`도 위험도와 관계없이, 심각 등급까지 함께 승인됩니다. 다만 세션의 sudo 기능, 계정의 권한, `sudo`를 차단하는 워크스페이스 규칙은 이 승인으로 넘을 수 없습니다. 자기 명령을 직접 승인했다면 MFA는 여전히 거쳐야 합니다. 승인자가 명령줄에서 보지 못한 `sudo`는 위의 사용 시점 확인을 받습니다.
- **강화만 가능**: **sudo 사용** 탭의 규칙과 세션 자체의 sudo 설정은 허용을 보류로 바꿀 수만 있습니다. 세션 목적에서 벗어났다고 판단된 `sudo`는 보류됩니다. 심각 등급의 `sudo`를 허용하는 규칙은 만들 수 없으며, 그 `sudo`가 담긴 명령을 사람이 승인한 경우만 예외입니다.
- **세션 sudo 정책**: 세션에는 그 세션의 서버와 기간에만 적용되는 sudo 정책을 붙일 수 있습니다. 이런 정책을 붙인 에이전트 세션은 항상 사람의 승인이 필요합니다.
- **계정 전환**: `sudo -u`, `su`, `runuser`로 다른 사람에게 연결된 계정으로 전환하면 관리자라도 거부되며, 승인 요청으로 넘어가지도 않습니다. 전환 대상 계정을 읽을 수 없을 때도 같은 방식으로 거부됩니다. `root`와 아무에게도 연결되지 않은 계정은 위 규칙을 따릅니다.

거부된 `sudo`의 코드와 코드별 조치는 [PAM 문제](/use/work-sessions/terminal/troubleshoot-sudo/)를 참고하세요.

## 시간 제한

- **워크스페이스 최대값**: 세션은 워크스페이스의 **세션 최대 사용 시간**보다 길 수 없으며, 기본값은 4시간입니다. Superuser가 [워크스페이스 설정](/use/workspace/settings/)에서 5분부터 7일 사이로 정합니다. 이보다 긴 요청은 줄여서 받지 않고 거부합니다.
- **예약 시작**: 세션을 나중 시각에 시작하도록 예약할 수 있습니다. 그 전까지는 아무것도 할 수 없습니다.
- **만료 예고**: 세션이 끝나기 몇 분 전에 요청자와 세션을 배정받은 사람에게 연장을 권하는 알림이 갑니다.
- **연장**: 시작된 세션은 사유를 적어 연장할 수 있으며, 새 세션과 같은 승인 규칙을 거칩니다. 새 종료 시각은 연장을 요청한 시점부터 워크스페이스 최대값을 넘을 수 없습니다.
- **종료 시각 이후**: 새 작업은 모두 즉시 `work_session_expired`로 거부됩니다.

## 세션 종료

| 종료 방식 | 주체 | 대상 상태 |
|---|---|---|
| 완료 | 세션을 배정받은 사람 또는 Superuser가 **세션 완료** 사용 | 활성 세션 |
| 철회 | Superuser가 **세션 철회** 사용 | 승인 또는 활성 세션 |
| 만료 | 종료 시각에 Alpacon이 처리 | 승인 또는 활성 세션 |
| 워크스페이스에서 사용자 제거 | 사용자를 삭제할 때 Alpacon이 처리 | 해당 사용자의 승인 또는 활성 세션 전체 |

네 가지 방식 모두 세션에서 연 것을 전부 닫습니다.

- **터미널**: 열려 있는 Websh 터미널이 닫히고, 브라우저에 닫힌 이유가 표시됩니다.
- **터널**: 포트 포워딩과 코드 편집기 연결이 닫힙니다.
- **파일 전송**: 열려 있는 WebFTP 세션이 닫힙니다.
- **대기 중인 명령**: 아직 서버에 전달되지 않은 명령은 취소되며, 승인을 기다리던 명령도 포함됩니다.
- **sudo 정책**: 세션에 붙은 sudo 정책은 더 이상 적용되지 않습니다. 정책 기록은 남습니다.

세션에 걸린 변경 요청도 함께 취소됩니다. 완료와 철회는 모든 것을 즉시 닫습니다. 만료된 세션의 열린 연결은 몇 분 안에 닫히며, 그동안 새 작업은 허용되지 않습니다.

대기 중에 취소되거나 거절된 세션은 연 것이 없으므로 닫을 것도 없습니다.

사용자를 제거하지 않고 비활성화하면 그 사용자의 열린 터미널과 파일 전송은 즉시 닫히고, 다시 로그인해 세션을 사용할 수도 없습니다.

## Alpacon AI를 쓸 수 없을 때

Alpacon AI가 응답하지 않아도 Alpacon은 무한정 기다리지 않습니다. 요청 종류에 따라 처리가 다릅니다.

- **세션 안의 명령**: AI 승인 없이 실행되고, 명령 기록에 **건너뜀**으로 표시됩니다. AI 판단에 기대지 않는 규칙은 그대로 적용됩니다. 요청자나 서버를 기준으로 보류하는 규칙에 걸린 명령, `agent-approval-required` 서버로 에이전트가 보낸 명령, 이 세션에서 AI가 이미 목적에서 벗어났다고 판단한 명령은 여전히 보류됩니다.
- **명령으로 실행하는 파일**: AI 검토 없이는 스크립트를 실행할 수 없으므로 거부됩니다.
- **서비스 토큰으로 보낸 명령**: 사전 승인 여부를 확인할 수 없으므로 거부됩니다.
- **명령 안의 sudo**: 명령에 위험도 평가가 없으므로 거부됩니다. 세션에 MFA를 건너뛰는 sudo 정책이 붙어 있으면 예외입니다.
- **Websh 터미널의 sudo**: 평소의 sudo 확인으로 돌아갑니다. 일치하는 sudo 정책, 규칙이 요구하는 경우의 승인자, MFA를 확인합니다.
- **세션 승인**: AI를 쓰지 않으므로 평소대로 동작합니다.

Alpacon AI 없이 운영하는 셀프 호스팅 환경에서는 명령이 판단 없이 실행되어 **건너뜀**으로 표시되고, 파일을 명령으로 실행할 수 없습니다. 세션 안의 `sudo`는 sudo 정책과 MFA를 따르며, 서비스 토큰의 `sudo`는 거부됩니다.

## 작업 세션 밖의 접근

명령은 작업 세션 안에서, 또는 접근 제어 규칙이 적용된 서비스 토큰으로 실행합니다. 이미 명령을 실행하고 있는 개인 API 토큰만 예외이며, 아래에서 설명합니다. 작업 세션 없이 API에 접근하는 자격 증명은 세 가지이며, 보안 검토 때 반드시 함께 확인하세요.

- **서비스 토큰**: [애플리케이션](/use/iam/applications/)에 발급하는 자동화용 토큰입니다. 서비스 토큰은 자신의 scope, 서버·명령·파일 접근 제어 규칙, 허용 IP 대역과 시간대, 요청 한도 안에서만 동작합니다. Advisory가 아닌 워크스페이스에서 AI가 서비스 토큰의 명령을 거부하면 그 판단은 기록되지만, 심각 등급이 아니면 명령은 그대로 실행됩니다. 워크스페이스 규칙으로 이 기준을 더 엄격하게 할 수 있습니다. Alpacon Cloud에서는 서비스 토큰의 sudo 위험도가 심각(Critical)보다 낮거나 평가되지 않았으면 허용하고, 심각이면 거부합니다. 단, Advisory 워크스페이스에서는 위험도를 이유로 거부하지 않고 판단을 기록합니다. Advisory가 아니면 워크스페이스의 `token_exec` 규칙으로 위험도 기준을 더 엄격하게 정할 수 있습니다. 워크스페이스의 sudo 설정도 켜져 있어야 하며, 꺼져 있으면 `workspace_sudo_with_mfa_disabled`로 거부됩니다. 기본 자체 호스팅 설치에서는 서비스 토큰의 모든 sudo가 거부됩니다. sudo 정책은 서비스 토큰에 적용되지 않으며 개인 API 토큰에는 적용됩니다. [서비스 토큰](/use/iam/applications/service-tokens/)을 참고하세요.
- **등록 토큰**: 서버를 등록할 때 한 번 씁니다. 서버 등록 외에는 아무것도 할 수 없습니다.
- **개인 API 토큰**: 새 개인 API 토큰에는 명령어 실행이나 파일 전송 범위를 부여할 수 없습니다. 해당 범위를 이미 가진 토큰은 작업 세션 없이 계속 사용할 수 있습니다. 자동화와 CI에는 [서비스 토큰](/use/iam/applications/service-tokens/)을 쓰세요.

이 세 가지 모두 Websh 터미널, 코드 편집기, WebFTP 세션은 열 수 없습니다. 이 기능은 로그인한 사람이 있어야 쓸 수 있습니다. 자동화에는 서비스 토큰을 쓰세요. 한도를 관리자가 정하고, 모든 사용 내역이 애플리케이션 단위로 기록됩니다.

**외부 접근은 탐지만 하고 막지 않습니다.** Alpacon을 거치지 않고 서버에 들어온 로그인(SSH, 로컬 또는 클라우드 콘솔, `su`)은 어떤 작업 세션에도 속하지 않습니다. **직접 로그인 탐지**를 켜면 Alpacon이 이런 로그인을 하나하나 기록하고, 예상된 접근으로 등록하지 않은 로그인은 검토자에게 확인을 요청합니다. 이 기능은 누군가 켜기 전까지 꺼져 있으며, 로그인 자체를 막지는 않습니다. `sudo`를 Alpacon 안에서만 쓰게 하려면 **웹 터미널 밖 sudo**을 끄세요. [외부 접근](/use/audit/governance/external-access/)을 참고하세요.

## 기록되는 항목

- **터미널 세션**: Websh 세션은 자격 증명을 가린 채 녹화됩니다. 유료 플랜에서는 녹화 전체를 다시 재생할 수 있고, Free 플랜에서는 앞부분만 볼 수 있습니다. [세션 기록](/use/audit/sessions/)을 참고하세요.
- **명령**: 명령마다 요청자, 세션, AI 판단, 출력이 남습니다. [명령](/use/audit/events/commands/)을 참고하세요.
- **파일 전송**: 업로드와 다운로드가 거부된 것까지 세션 정보와 함께 남습니다.
- **sudo**: 허용되거나 거부된 `sudo`가 이유와 함께 남습니다. [권한 상승](/use/audit/events/sudo/)을 참고하세요.
- **승인**: 누가 요청했고 누가 언제 결정했는지, 자기 승인이었는지가 남습니다.
- **AI 분석**: 완료, 만료, 철회된 세션은 그동안 일어난 일에 대한 AI 위험 분석을 받습니다. [세션 종료 후](/use/audit/sessions/review/)를 참고하세요.
- **직접 로그인**: 탐지를 켠 경우 Alpacon을 거치지 않은 로그인이 남습니다.

감사 기록은 읽기 전용입니다. 얼마나 이전 기록까지 볼 수 있는지는 플랜에 따라 다릅니다. [요금제 페이지](https://www.alpacax.com/alpacon/pricing)를 참고하세요.

## 알려진 한계

- **명령별 확인의 중심은 AI 판단입니다**: AI를 쓸 수 없으면 세션 안의 명령은 **건너뜀**으로 표시된 채 실행되고, AI 판단에 기대지 않는 규칙만 명령을 보류합니다.
- **터미널 명령은 하나씩 판단하지 않습니다**: Websh 터미널에서는 실행 중에 `sudo`만 판단하고, 나머지는 기록해 두었다가 세션이 끝난 뒤 분석합니다. 에이전트는 터미널을 열 수 없습니다.
- **Advisory에서는 보류가 없습니다**: Advisory 워크스페이스는 판단을 이유로 보류하거나 거부하지 않으며, 세션도 승인 없이 열립니다.
- **서비스 토큰은 세션 없이 동작합니다**: 토큰의 한도 안에서만 동작하지만, AI가 거부한 서비스 토큰의 명령도 심각 등급이 아니면 실행됩니다.
- **직접 로그인은 막지 않습니다**: 탐지는 기본적으로 꺼져 있고, 켜더라도 기록만 합니다.
- **에이전트 이름은 에이전트가 스스로 밝힌 값입니다**: [Alpacon이 확인하는 것과 확인하지 않는 것](/learn/security/what-alpacon-checks/#알려진-한계)을 참고하세요.
- **자기 승인은 기본적으로 허용됩니다**: 필요한 곳에서는 규칙으로 막으세요.
- **이미 전달된 명령은 끝까지 실행됩니다**: 세션을 끝내면 아직 전달되지 않은 명령은 취소되지만, 서버에서 이미 실행 중인 명령은 멈추지 않습니다.
- **Alpacon은 샌드박스나 EDR이 아닙니다**: 누가 서버에 접근하고 Alpacon으로 무엇을 실행하는지는 통제하지만, 허용된 명령이 서버에서 하는 일을 격리하지는 않습니다.

Source: https://docs.alpacax.com/ko/learn/security/session-protection/
