---
title: "MFA로 sudo 사용"
description: "Websh에서 sudo with MFA를 설정하고 대화형 sudo 명령어를 실행하는 방법을 안내합니다. 승인 요청이 필요한 명령어가 터미널에서 기다리는 동안 표시되는 내용과 승인·거절·시간 초과 후 해야 할 일을 설명합니다. 필요한 버전과 로그인 방식도 미리 확인하세요."
---

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

# MFA로 sudo 사용

<span id="sudo-with-mfa" />

# MFA로 sudo 사용

sudo with MFA를 사용하면 영구적인 sudo 권한 없이 Websh 터미널 세션에서 `sudo` 명령어를 실행할 수
있습니다. `sudo` 명령어를 입력하면 실행 전에 MFA 확인이 필요합니다.

이 페이지는 대화형 터미널 세션을 다룹니다. 토큰으로 실행하는 자동화 파이프라인에서 `sudo`를 사용하는
방법은 [명령 패턴과 sudo](/use/iam/applications/service-tokens/command-patterns/)를 참고하세요. 토큰은 인가 방식이
다르며, 서비스 토큰에는 sudo 정책이 적용되지 않습니다.

## 요구 사항

- 대상 서버에 **Alpamon 1.3.2** 이상 설치 필요
- Policies의 [접근 규칙](/use/policies/access-rules/)에서 **sudo 사용** 탭 상단의 **Alpacon을 통한 sudo**을 켜야 합니다. 서버에 필요한 PAM 모듈이 자동으로 설치됩니다.

<span id="sudo-with-mfa-활성화" />

## MFA로 sudo 사용 활성화

1. 사이드바에서 **Policies > Access rules**(**접근 규칙**)로 이동해 **sudo 사용** 탭을 여세요([sudo 및 root 접근](/use/policies/access-rules/) 참고).
2. **Alpacon을 통한 sudo**을 켜세요.
3. 그 시점에 연결된 Alpamon 1.3.2+ 실행 서버에 PAM 모듈이 자동으로 설치됨

그 시점에 오프라인이던 서버에는 설치가 전달되지 않고, 다시 연결돼도 자동으로 재시도하지 않습니다. 서버가 다시 연결되면 [에이전트 카드](/use/servers/manage/#에이전트-카드)의 **alpamon-pam 설치 또는 업그레이드** 버튼이나 CLI의 [`alpacon agent install-pam`](/reference/cli/agent/install-pam/)으로 `alpamon-pam`을 설치하세요. 호스트에서 직접 설치하는 방법은 [sudoers 규칙이 없는 경우](/use/work-sessions/terminal/troubleshoot-sudo/#sudoers-규칙이-없는-경우)를 참고하세요.

Alpacon Cloud에서는 Superuser만 **sudo 사용** 탭의 스위치와 **MFA 유효 시간**을 변경할 수 있습니다. **root 직접 로그인**도 Superuser만 변경할 수 있습니다. Staff 사용자는 sudo with MFA가 활성화되면 사용할 수 있지만 이 설정들은 변경할 수 없습니다. Auth0를 사용하지 않는 자체 호스팅 배포에서는 Staff 사용자가 **root 직접 로그인**을 변경하고 **웹 터미널 밖 sudo**를 켜서 로컬 sudo를 허용할 수 있습니다. 로컬 sudo를 차단하도록 끌 수는 없으며, **Alpacon을 통한 sudo** 설정은 누구도 변경할 수 없습니다. 저장된 값이 그대로 적용됩니다.

MFA를 요청할 수 없는 배포(자체 호스팅, Auth0 미사용)에서는 **Alpacon을 통한 sudo** 스위치가 표시되지만 변경할 수 없고, 이미 저장된 값이 계속 적용됩니다.
[Auth0가 없는 배포](#auth0가-없는-배포)를 참고하세요.

sudo with MFA는 **root 직접 로그인** 설정과 독립적으로
작동합니다. 루트 계정으로 직접 접속할 수 없도록 설정해도 사용자는 sudo with MFA로 `sudo` 명령어를
실행할 수 있습니다.

<span id="sudo-with-mfa-비활성화" />

## MFA로 sudo 사용 비활성화

[접근 규칙](/use/policies/access-rules/)의 **sudo 사용** 탭에서 **Alpacon을 통한 sudo**을 끄면 즉시 적용되며, 워크스페이스 전체의 동작이 다음과 같이 바뀝니다.

- **Alpacon이 `sudo` 인가를 중지합니다.** PAM 모듈 설치 여부와 관계없이 모든 서버에서 Alpacon에 도달한 `sudo` 요청이 거부되며, 거부 코드 `WORKSPACE_SUDO_WITH_MFA_DISABLED`가 표시됩니다. ["Alpacon denied this sudo command"](/use/work-sessions/terminal/troubleshoot-sudo/#alpacon-denied-this-sudo-command)를 참고하세요. Alpacon이 호스트를 관리하기 전부터 자체 sudoers 권한이 있던 시스템 계정은 그 권한을 유지합니다.
- **서버는 변경되지 않습니다.** 패키지를 제거하거나 서버에 명령어를 보내지 않습니다. `alpamon-pam` 패키지와 설정, 이 패키지가 관리하는 sudoers 규칙은 그대로 유지됩니다. 다만 설정이 꺼져 있는 동안에는 효력이 없습니다.
- **이미 승인을 기다리는 요청은 거부되지 않습니다.** 승인 대기열에 남아 있지만 승인해도 `sudo` 명령어를 실행할 수 없으며, 관련 인가는 정해진 시각에 만료됩니다.
- **웹 터미널 밖 sudo**가 자동으로 켜집니다. 로컬에서 실행하는 sudo에는 해당 계정의 sudoers 규칙이 적용됩니다. 이 설정을 꺼서 로컬 sudo를 차단하려면 **Alpacon을 통한 sudo**이 켜져 있어야 합니다.

  비활성화는 정책만 바꿉니다. Alpacon의 `sudo` 인가가 중지되며 서버에서는 아무것도 변경되지
  않습니다. 따라서 설정을 다시 켜면 서버를 복구할 필요 없이 sudo with MFA를 다시 사용할 수 있습니다.

**Alpacon을 통한 sudo**을 다시 켜면 `sudo` 인가가 즉시
재개됩니다. 그 시점에 연결된 모든 서버에도 `alpamon-pam`이 설치되므로, 아직 패키지가 없는 서버도
설치됩니다.

## 작동 방식

터미널에서 `sudo` 명령어를 실행하면 다음과 같이 진행됩니다.

1. `sudo` 명령어 입력(예: `sudo systemctl restart nginx`)
2. 터미널에 **MFA 인증이 필요해요** 화면이 표시됨. **클릭하여 인증하기**를
   클릭하면 인증 창이 열림
3. MFA 인증을 마치면 명령어가 실행됨
4. sudo with MFA 타임아웃이 끝날 때까지 이후 `sudo` 명령어에는 MFA 인증이 다시 필요하지 않습니다. 이
   시간은 워크스페이스 관리자가
   [접근 규칙](/use/policies/access-rules/)에서 설정합니다.

인증에 실패하거나 MFA 세션이 만료되면, 터미널에서 명령어를 다시 실행해 재인증하라는 안내가
표시됩니다.

### 인증을 완료할 수 있는 로그인 방식

sudo MFA 인증은 웹 콘솔에 로그인했거나 `alpacon login`으로 브라우저 로그인을 마친 CLI 사용자만
완료할 수 있습니다. 개인 API 접근 토큰, 서비스 토큰, AI 에이전트의 MCP 연결처럼 자체 MFA 인증이 없는
자격 증명으로는 사용할 수 없습니다. 그 자격 증명을 쓰는 사람이 다른 곳에서 인증을 마쳤더라도
마찬가지입니다.

CLI에 API 토큰으로 로그인했다면(`alpacon login -t`), MFA가 필요한 `sudo` 명령어는 "Sudo MFA cannot
be completed with this credential" 메시지와 함께 중지됩니다. `-t` 없이 `alpacon login`으로 다시
로그인한 뒤 명령어를 다시 실행하세요. 사람의 개입 없이 `sudo`가 필요한 작업에는 승인자의 결정이 MFA 단계를 대신하도록 sudo 정책을 연결한 작업 세션([`alpacon work-session create --sudo`](/reference/cli/work-session/create/)
참조)이나 [명령 패턴과 sudo](/use/iam/applications/service-tokens/command-patterns/)에 설명된 서비스 토큰을
사용하세요.

### Auth0가 없는 배포

sudo with MFA 인증에는 Auth0가 필요합니다. Auth0가 없는 자체 호스팅 배포 환경에서는 MFA 인증이
필요한 `sudo` 명령어를 실행하면 완료할 수 없는 인증 창을 여는 대신 `SUDO_STEP_UP_UNAVAILABLE` 코드와
함께 즉시 거부됩니다. 이 환경에서 `sudo` 권한을 얻으려면 승인자의 결정이 MFA 단계를 대신하도록 sudo 정책을 연결한 작업 세션을
사용하세요([`alpacon work-session create --sudo`](/reference/cli/work-session/create/) 참조).

## 승인 대기

Websh 터미널에서 대화형 `sudo` 명령어를 실행할 때 다른 사람의 승인이 필요하면 터미널이 승인자의 결정을 기다립니다. 규칙에 따라 승인이 필요하거나(`SUDO_APPROVAL_REQUIRED`), 명령어가 [작업 세션](/use/work-sessions/)의 목적에서 벗어나거나(`SUDO_INTENT_DEVIATION`), 실행할 상시 권한이 없을 때(`SUDO_NO_AUTHORITY`) 대기합니다. 단, 실행 제어가 Advisory인 워크스페이스에서는 상시 권한이 없으면 즉시 거부됩니다.

자체 호스팅 환경에서 승인 대기 기능을 사용하려면 Alpacon 2.44.0 이상, Alpamon 2.8.4 이상, alpamon-pam 1.2 이상이 필요합니다. 이전 버전에서 `sudo`가 어떻게 동작하는지는 [sudo 명령어가 거부될 때](#sudo-명령어가-거부될-때)를 참고하세요.

### 터미널에 표시되는 내용

1. 터미널에 `승인을 기다리는 중입니다 (요청 <요청 ID>, <분>분 후 만료) ...`가 표시되고, 승인자가 결정하거나 대기가 끝날 때까지 명령어 실행이 멈춤. 최대 5분 동안 기다리며 승인 가능 시간이 더 짧으면 그 시간까지만 기다림
2. 승인자가 요청을 승인한 경우:
   - 콘솔에서 활동 중이라면 명령어가 바로 실행됨
   - 추가 MFA 인증이 필요하다면 콘솔에 인증 화면이 표시됨. 인증을 마치면 명령어가 실행됨
3. 승인자가 요청을 거절하거나 요청자가 철회하면 터미널에 거절 메시지가 표시되고 명령어는 실행되지 않음
4. 대기가 끝날 때까지 결정이 없거나 승인 후 MFA 인증을 마치지 못하면 `SUDO_APPROVAL_PENDING`과 함께 승인 요청이 계속 유효하다는 안내가 표시됨. 승인된 뒤 같은 명령어를 다시 실행해야 함

대기를 멈추려면 Ctrl+C를 누르세요. 터미널에 `You stopped waiting. The request stays open; run the command again once it's approved (SUDO_APPROVAL_PENDING).`가 표시됩니다. 승인 요청은 계속 유효하므로 승인된 뒤 명령어를 다시 실행할 수 있습니다.

한 터미널에서 승인을 기다리는 동안 다른 터미널에서 같은 `sudo` 명령어를 실행하면 두 번째 명령어는 `SUDO_APPROVAL_ALREADY_WAITING`으로 거부됩니다. 대기 중인 터미널을 사용하거나 그 터미널에서 먼저 Ctrl+C를 누르세요. 명령어가 같은지 판단할 때는 실행 대상 계정과 `-u`로 지정한 계정도 확인합니다. 따라서 `sudo -u alice cmd`와 `sudo -u bob cmd`는 각각 기다릴 수 있습니다.

### 터미널이 기다리지 않는 경우

다음 경우에는 터미널이 승인 결정을 기다리지 않습니다.

- **작업 세션 밖의 Websh 세션**: 이전과 같이 `sudo`가 거부됨
- **대화형이 아닌 `sudo`**: `sudo -n`, `sudo -S`, `sudo -b` 등
- **AI 에이전트와 서비스 토큰**
- **상시 sudo 권한이 없는 Advisory 워크스페이스**: `SUDO_NO_AUTHORITY`로 즉시 거부되고 승인 요청도 생성되지 않습니다. 워크스페이스 소유자에게 [서버 접근 정책](/use/policies/server-access/)에서 상시 sudo 권한을 부여하도록 요청해야 합니다.
- **즉시 거부되는 명령어**: 다른 사람의 개인 계정으로 전환하거나 우회 및 범위 제한에 걸린 명령어 등
- **본인 외에 승인자가 없는 요청**: `APPROVAL_NO_OTHER_APPROVER`로 즉시 거부됨. 두 번째 승인자나 자동 승인 규칙 추가 필요

### 승인자를 위한 안내

승인자에게는 달라지는 점이 없습니다. 요청은 이전처럼 [**요청 관리**](/use/approvals/) 페이지에 표시됩니다. [요청 검토](/use/approvals/reviewing/)에 따라 검토하세요.

## sudo 명령어가 거부될 때

Alpacon이 Websh 터미널에서 `sudo` 명령어를 거부하면 명령어는 실행되지 않고, 터미널에 괄호로 묶인
코드가 포함된 한 줄이 출력됩니다.

```
Alpacon denied this sudo command (SUDO_APPROVAL_REQUIRED).
```

아래 세 코드는 명령어 자체에 관한 것이며, 여기서 안내하는 대응 방법은 Websh에 적용됩니다. 토큰이나
`alpacon exec`로 실행한 명령어는 다르게 처리되므로
[명령 패턴과 sudo](/use/iam/applications/service-tokens/command-patterns/)를 참고하세요. 다른 코드에 대해서는
["Alpacon denied this sudo command"](/use/work-sessions/terminal/troubleshoot-sudo/#alpacon-denied-this-sudo-command)을
참고하세요.

### `SUDO_APPROVAL_REQUIRED`

이 명령어를 실행하려면 다른 사람의 승인이 필요하며, Alpacon은 이미 승인 요청을 보냈습니다.
워크스페이스에서 요청을 승인할 수 있는 다른 사람에게
[**요청 관리**](/use/approvals/) 페이지에 요청이 표시됩니다. 승인을
받으면 같은 명령어를 다시 실행하세요. 서버와 에이전트가 [승인 대기](#승인-대기)에 적힌 버전 이상이면 이 거부 메시지 대신 터미널이 승인을 기다립니다. 아무도 결정하지 않은 요청은 몇 분 뒤 만료됩니다.

### `SUDO_INTENT_DEVIATION`

현재 Websh 세션은 [작업 세션](/use/work-sessions/)에 속해 있으며, 명령어가 그 작업 세션에 적힌
목적과 맞지 않습니다. `SUDO_APPROVAL_REQUIRED`와 마찬가지로 Alpacon이 승인 요청을 보냈으므로, 승인을
기다렸다가 명령어를 다시 실행할 수 있습니다. 서버와 에이전트가 [승인 대기](#승인-대기)에 적힌 버전 이상이면 터미널에서 결정을 기다릴 수도 있습니다. 작업 내용이 원래 목적에서 달라졌다면 새 목적을 적어
[작업 세션을 새로 요청](/use/work-sessions/create/)하고 그 세션에서 명령어를 실행하세요.

### `SUDO_RISK_DENIED`

워크스페이스의 접근 규칙이 차단했거나 명령어의 위험도가 너무 높다고 판단되어, 이 명령어는 `sudo`로
실행할 수 없습니다. 승인 요청은 생성되지 않으며, 같은 명령어를 다시 실행해도 결과는 같습니다.
슈퍼유저에게 Policies의 **접근 규칙** 페이지에서 규칙을 검토해 달라고
요청하세요.

## sudo 정책과 부여

`sudo` 명령어의 인가 방식은 Policies의 [접근 규칙](/use/policies/access-rules/)에 있는 **sudo 사용** 탭의 규칙에 따라 달라집니다.

- **Sudo 정책**: 관리자가 특정 사용자나 서버에 대해 지정한 명령어를 미리 인가할 수 있음.
  승인된 [작업 세션](/use/work-sessions/)에 연결된 정책은 일치하는 sudo 명령어에서 세션 승인이 MFA 단계를 대신하도록 설정할 수 있음. `exec`를 실행하는 AI 에이전트처럼 대화형 입력을 할 수 없는 호출자도 해당 명령어를 MFA 입력 없이 실행할 수 있음. 작업 세션이 끝나면 정책도 적용되지 않음
- **승인**: 관리자의 승인으로 sudo 요청을 인가할 수 있음

직접 부여한 권한, 정책, 승인 중 어떤 방식으로 인가했든 기록이 남습니다.
[Privilege elevation](/use/audit/events/sudo/)에서 확인하세요.

## sudo-rs 호환성

Ubuntu 25.10 이상 버전(26.04 포함)에서는 sudo-rs가 기본 `sudo`로 제공됩니다. 이 호스트에서도
sudo with MFA를 사용할 수 있지만 `alpamon-pam` 패키지 1.1.2 이상이 필요합니다. Alpacon은 sudo-rs를
탐지하고 PAM으로 `sudo` 명령어를 인가합니다.

기존 sudo(1.9+)에서는 Alpacon이 별도의 sudo 승인 플러그인도 `/etc/sudo.conf`에 등록합니다.
sudo-rs에는 플러그인 인터페이스가 없어 sudo-rs 호스트에서는 이 플러그인을 사용하지 않으며
`/etc/sudo.conf`에도 나타나지 않습니다. 이는 예상된 동작이며 설정 오류가 아닙니다.

터미널이 연결되지 않은 sudo-rs 호스트에서 `sudo` 명령어가 거부되면(예: `alpacon exec`로 실행할 때),
sudo-rs가 거부 사유를 표시하지 못하고 대신 `A terminal is required to authenticate`를 출력합니다.
실제 원인은
[PAM 및 sudo 문제](/use/work-sessions/terminal/troubleshoot-sudo/#a-terminal-is-required-to-authenticate)에서
확인하세요.

## 관련 문서

- [명령어 실행하기](/use/work-sessions/terminal/commands/)
- [계정 선택](/use/work-sessions/account-selection/)
- [워크스페이스 설정](/use/workspace/settings/)
- [명령 패턴과 sudo](/use/iam/applications/service-tokens/command-patterns/)

Source: https://docs.alpacax.com/ko/use/work-sessions/terminal/sudo-with-mfa/
