PAM 및 sudo 문제
sudo with MFA와 Alpamon PAM 모듈(alpamon-pam)의 문제 해결
가이드입니다. 각 절은 화면에 표시되는 메시지를 먼저 보여준 뒤 원인과 해결 방법을 설명합니다.
”A terminal is required to authenticate”
sudo-rs를 사용하는 호스트(Ubuntu 25.10
이상)에서는 alpacon exec 등을 통해 터미널 없이 실행한 sudo 명령어가 다음 메시지와 함께 실패할 수
있습니다:
sudo: A terminal is required to authenticate이 메시지는 sudo 실행 과정에서 Alpacon 인가가 완료되지 않았다는 뜻입니다. sudo-rs는 기존 sudo와
달리 터미널이 연결되지 않으면 실패 이유를 표시할 수 없어 이 일반적인 메시지를 대신 출력합니다. 주된
원인은 다음과 같습니다:
- 명령어가 거부되었지만 터미널이 없어 이유가 표시되지 않습니다. 예를 들어 작업 세션에 명령어와 일치하는 sudo 정책이 없을 수 있습니다.
- 워크스페이스에서 sudo with MFA가 꺼져 있습니다.
sudo명령어가 Alpacon에서 추적하는 세션에서 실행되지 않았습니다.
실제 원인을 확인하려면 서버에서 시도한 시간대의 journalctl -u alpamon 출력을 확인하고 다음
로그를 찾으세요.
| 로그 내용 | 의미 |
|---|---|
No session found for PID | sudo가 Alpacon에서 추적하는 세션에서 실행되지 않았습니다. 승인된 작업 세션 또는 대화형 Websh 세션 안에서 실행하세요. |
sudo_approval response timeout | Alpacon이 요청을 보냈지만 서버로부터 제때 응답을 받지 못했습니다. 연결 상태를 확인하고 다시 시도하세요. |
approved=false와 error_code가 포함된 Processing sudo_approval response | 명령어가 거부되었습니다. “Alpacon denied this sudo command”에서 코드를 확인하세요. |
sudoers 규칙이 없는 경우
sudo를 실행할 권한이 없는 사용자에게는 sudo 구현에 따라 다음 메시지 중 하나가 표시됩니다:
# sudo-rs (Ubuntu 25.10+)
sudo: I'm sorry user. I'm afraid I can't do that
# classic sudo
user is not in the sudoers file.Alpacon이 관리하는 호스트에서는 Alpacon을 통해 sudo를 사용할 수 있게 하는 sudoers
규칙(%alpacon)이 PAM 모듈(alpamon-pam)과 함께 설치됩니다. 이 메시지가 표시된다면 보통 서버에 alpamon-pam이
설치되지 않은 것입니다. 패키지가 설치되어 있는지 확인하세요:
# Debian/Ubuntu
dpkg-query -W alpamon-pam
# RHEL/CentOS/Rocky/Alma/Fedora, openSUSE/SLES
rpm -q alpamon-pam다시 설치하려면 다음과 같이 하세요:
- 서버 한 대: 서버의 에이전트 카드에서 alpamon-pam 설치 또는 업그레이드 버튼을 누르거나 CLI로
alpacon agent install-pam <server>를 실행하세요. 두 방법 모두install_pam작업을 보내 호스트의 패키지 매니저로 패키지를 root 권한으로 설치합니다. 워크스페이스의 Alpacon을 통한 sudo가 꺼져 있으면 버튼이 비활성화되고 CLI 요청이 거부되므로 먼저 설정을 켜세요. 호스트에서 직접 설치하려면 Debian/Ubuntu는apt-get install -y alpamon-pam, RHEL 계열은yum install -y alpamon-pam, openSUSE와 SLES는zypper --non-interactive install alpamon-pam을 사용하세요. 설치를 참고하세요. - 패키지는 있지만
/etc/sudoers.d/alpacon이 없는 경우: 이미 현재 버전이 설치된 호스트에서는 이 작업이 아무것도 하지 않습니다. 셸에서apt-get install --reinstall -y alpamon-pam또는yum reinstall -y alpamon-pam으로 다시 설치해 파일을 복구하세요. - 워크스페이스 전체: Alpacon을 통한 sudo이 꺼져 있다면 접근 규칙에서 다시 켜세요. 현재 연결된 모든 서버에
alpamon-pam이 다시 설치됩니다.
openSUSE·SLES에서 sudo가 실패하거나 root 비밀번호를 묻는 경우
openSUSE와 SLES에는 alpamon-pam 1.1.5 이상이 필요합니다. 그보다 낮은 버전에서는 버전마다 다음 증상이 나타납니다.
| 버전 | 증상 |
|---|---|
| 1.1.2 이하 | zypper install alpamon-pam이 nothing provides 'jansson' 오류로 멈춥니다. |
| 1.1.3 | 서버의 모든 sudo가 unable to load /usr/lib/sudo/sudo/alpacon_approval.so 오류로 실패합니다. |
| 1.1.4 | sudo가 Alpacon 사용자에게 root 비밀번호를 묻습니다. Alpacon 사용자는 이 비밀번호를 모릅니다. |
서버의 root 셸에서 zypper --non-interactive install alpamon-pam으로 업그레이드하세요. sudo가 아예 안 되는 1.1.3이라면 root 비밀번호로 su -를 쓰거나 서버 콘솔로 접속해 root 셸을 엽니다. 서버 상세 페이지에 alpamon-pam 설치 또는 업그레이드가 보이면 이것으로도 같은 업그레이드를 할 수 있습니다. 이 작업은 에이전트가 실행하므로 sudo가 안 되는 서버에서도 동작합니다.
예전 openSUSE·SLES 설치 명령으로 등록한 서버에는 /etc/sudoers.d/alpacon-wheel이 남아 있을 수 있습니다. Alpacon 사용자에게는 필요 없는 파일입니다. Ansible 플레이가 접속하는 사용자처럼 직접 관리하는 계정이 이 파일에 기대고 있지 않다면 지워도 됩니다.
”Alpacon denied this sudo command”
sudo 거부 사유에 오류 코드가 있으면 터미널에 다음과 같이 표시됩니다:
Alpacon denied this sudo command (SUDO_NO_WORKSESSION_POLICY).오류 코드로 거부 이유와 해결 방법을 확인할 수 있습니다.
워크스페이스 설정은 접근 규칙의 Alpacon을 통한 sudo입니다. 세션에 기능을 추가하려면 세션 페이지에서 Sudo를 선택하거나 alpacon work-session update --scope를 사용하세요. 정책을 추가할 때는 sudo 명령어 패턴 규칙을 확인하세요.
| 코드 | 의미 | 조치 |
|---|---|---|
SUDO_SESSION_MISSING# | sudo 요청에 해당하는 열린 세션이나 명령어를 찾지 못했습니다. | 승인된 작업 세션이나 대화형 Websh 세션 안에서 sudo를 다시 실행하세요. |
WORK_SESSION_SCOPE_NOT_ALLOWED# | 작업 세션에 sudo 기능이 포함되어 있지 않습니다. | 세션에 sudo 기능을 추가하고 필요한 승인을 받은 뒤 다시 실행하세요. --scope는 기능 목록 전체를 바꾸므로 세션에 필요한 기능을 모두 지정하세요. |
SUDO_COMMAND_TOO_LONG# | 검토용으로 기록하기에 명령어가 너무 깁니다. | 명령어를 줄이거나 스크립트로 작성해 실행하세요. |
SUDO_SYSTEM_USER_NOT_FOUND# | sudo를 실행하는 서버 계정이 Alpacon에 등록되어 있지 않습니다. | 서버의 계정 목록에 있는 계정으로 접속하거나 관리자에게 계정 확인을 요청하세요. |
SUDO_ACCOUNT_BOUND_TO_APPLICATION# | Websh 계정이 애플리케이션에 연결되어 있어 터미널에서 sudo 권한을 받을 수 없습니다. | 애플리케이션의 서비스 토큰으로 alpacon exec를 실행하세요. |
SUDO_NO_ACCOUNTABLE_ACTOR# | 이 sudo 요청을 책임질 활성 사용자를 확인할 수 없습니다. | 서버 계정을 사용자에게 연결하거나 활성 사용자가 담당자인 작업 세션을 사용하세요. |
SUDO_STEP_UP_UNAVAILABLE# | Auth0를 사용하지 않는 배포 환경이라 필요한 MFA 인증을 진행할 수 없습니다. | sudo 정책의 승인으로 MFA를 대신하는 작업 세션을 사용하세요. |
SUDO_PRESENCE_REQUIRED# | 명령어를 실행하려면 최근에 완료한 MFA 인증이 필요합니다. | 등록한 인증 수단으로 MFA를 완료한 뒤 명령어를 다시 실행하세요. |
SUDO_COMMAND_NOT_AUTHORIZED# | 명령어를 실행하는 사용자를 확인할 수 없어 sudo를 허용할 수 없습니다. | 본인 계정으로 로그인한 세션에서 명령어를 실행하세요. |
SUDO_POLICY_MFA_REQUIRED# | 일치하는 sudo 정책은 MFA를 요구하지만 인증할 대화형 터미널이 없습니다. | Websh에서 실행하거나 관리자에게 승인으로 MFA를 대신하는 작업 세션 sudo 정책을 요청하세요. |
SUDO_NO_WORKSESSION_POLICY# | 작업 세션에 이 명령어와 일치하는 sudo 정책이 없습니다. | work-session update --sudo로 일치하는 패턴을 추가하세요. sudo 접두어를 제외한 명령어 전체가 일치해야 하며 와일드카드는 *만 쓸 수 있습니다. |
WORKSPACE_SUDO_WITH_MFA_DISABLED# | 워크스페이스에서 Alpacon을 통한 sudo를 허용하지 않습니다. | 슈퍼유저에게 워크스페이스의 sudo 설정을 켜 달라고 요청하세요. |
SUDO_APPROVAL_REQUIRED# | 명령어에 사람의 승인이 필요하여 승인 요청이 생성되었습니다. | 승인된 뒤 같은 명령어를 다시 실행하세요. |
SUDO_APPROVAL_PENDING# | 승인 대기가 끝났거나 Ctrl+C로 대기를 멈췄거나 정해진 시간 안에 MFA 인증을 마치지 못했습니다. 승인 요청은 계속 열려 있습니다. | 승인된 뒤 같은 명령어를 다시 실행하세요. |
SUDO_APPROVAL_ALREADY_WAITING# | 같은 sudo 명령어가 다른 터미널에서 이미 승인을 기다리고 있습니다. | 대기 중인 터미널을 사용하거나 그 터미널에서 먼저 Ctrl+C를 누르세요. |
SUDO_APPROVAL_REJECTED# | 승인자가 요청을 거절했거나 요청이 철회되었습니다. | 명령어는 실행되지 않았습니다. 승인자에게 이유를 묻거나 작업 이유를 더 구체적으로 적어 다시 요청하세요. |
APPROVAL_NO_OTHER_APPROVER# | 요청자 외에는 요청을 승인할 사람이 없습니다. | 슈퍼유저에게 다른 승인자나 자동 승인 규칙을 추가해 달라고 요청하세요. |
SUDO_NO_AUTHORITY# | 요청을 허용하는 sudo 권한이나 정책이 없습니다. Enforce에서는 관리자 승인 요청이 생성되며 가능한 경우 터미널이 승인을 기다립니다. Advisory에서는 승인 요청 없이 즉시 거부됩니다. | Enforce에서는 승인된 뒤 다시 실행하세요. Advisory에서는 관리자에게 상시 sudo 권한을 요청하세요. |
SUDO_TARGET_OTHER_PERSON# | 명령어가 다른 사람의 계정으로 전환하려 하므로 항상 차단됩니다. | 자신의 계정이나 공유 계정을 사용하세요. |
SUDO_TARGET_UNPARSED# | 명령어가 전환하려는 계정을 확인할 수 없습니다. | sudo -u deploy whoami처럼 대상 계정을 명확히 지정하세요. |
SUDO_INTENT_DEVIATION# | 명령어가 작업 세션의 목적에 맞지 않아 승인 요청이 생성되었습니다. | 승인을 기다리거나 이 작업을 설명하는 작업 세션을 요청하세요. |
SUDO_RISK_DENIED# | 워크스페이스의 접근 규칙이 명령어를 차단하거나 명령어의 위험도가 너무 높다고 판단했습니다. | 슈퍼유저에게 접근 규칙 검토를 요청하세요. |
승인 관련 메시지와 터미널이 기다리는 동안의 동작은 승인 대기를 참고하세요. 즉시 거부되는 경우는 터미널이 기다리지 않는 경우를 참고하세요. Auth0가 없다면 Auth0가 없는 배포를 확인하세요.
오류 메시지 참고 문서에서 sudo_session_missing,
sudo_no_worksession_policy,
workspace_sudo_with_mfa_disabled에
해당하는 콘솔 메시지를 찾아보세요.
코드 없는 메시지
다음 메시지에는 조회할 오류 코드가 없습니다. 일시적으로 인가할 수 없다는 메시지는 첫 문장만 인용했습니다.
| 메시지 | 의미 | 해결 방법 |
|---|---|---|
Alpacon denied this sudo command. | 오류 코드 없이 명령어가 거부되었습니다. Websh나 alpacon exec 밖의 로컬 sudo가 차단된 경우에도 표시됩니다. | 로컬 sudo라면 Websh에서 실행하거나 관리자에게 웹 터미널 밖 sudo 설정 확인을 요청하세요. Websh나 alpacon exec에서 실행한 명령어라면 웹 콘솔의 권한 상승에서 거부 탭을 확인하세요. |
Alpacon sudo authorization is unavailable; command denied. | 요청이 실패하거나 응답 시간이 초과되어 에이전트의 인가 결과를 받지 못했습니다. | systemctl status alpamon으로 alpamon이 실행 중인지 확인하세요. 서버 연결 상태와 에이전트 로그도 확인한 뒤 다시 시도하세요. |
Alpacon authorization is temporarily unavailable (the agent is not accepting connections); command not authorized. | 에이전트가 일시적으로 인가 요청을 받을 수 없습니다. 정책에 따른 거부가 아닙니다. | 잠시 기다린 뒤 다시 시도하세요. |
Alpacon sudo authorization returned an invalid response; command denied. | 인가 응답을 읽을 수 없습니다. | 관리자에게 에이전트 로그 확인을 요청하세요. |
Alpacon could not determine the sudo command; denied. | PAM에서 인가할 명령어를 확인하지 못했습니다. | 명령어를 확인하고 반복되면 관리자에게 에이전트와 PAM 로그 확인을 요청하세요. |
Alpacon could not determine the sudo target user; denied. | PAM에서 대상 계정을 확인하지 못했습니다. | sudo -u deploy whoami처럼 대상 계정을 명확히 지정하세요. |
Alpacon could not encode the sudo command; denied. | 인가 요청에 사용할 형식으로 명령어를 인코딩하지 못했습니다. | 명령어가 올바른 UTF-8 텍스트인지 확인하세요. |
Alpacon could not encode the sudo identity; denied. | 인가 요청에 사용할 형식으로 계정 정보를 인코딩하지 못했습니다. | 관리자에게 계정 이름과 인코딩 확인을 요청하세요. |
설치된 PAM 모듈 확인
서버 상세 페이지에는 서버마다 Alpacon을 통한 sudo 상태가 표시됩니다.
- 활성: 모듈이 설치되어 있습니다. alpamon-pam 버전을 함께 보여 줍니다.
- 비활성: alpamon-pam이 설치되어 있지 않습니다.
- 알 수 없음: 에이전트가 오래되어 상태를 보고하지 못합니다. alpamon을 업데이트하면 상태가 표시됩니다.
- 해당 없음: 설정이 꺼져 있거나 Linux 서버가 아닙니다.
이 상태는 에이전트가 마지막으로 보고한 내용입니다. Alpamon 2.0.2 이상을 실행하는 Linux 서버에서
alpamon-pam을 직접 제거하거나 버전을 바꾸면 다음 보고 때 표시된 상태에 반영됩니다.
이전 버전 에이전트에서는 서버에서
패키지를 직접 제거해도 버전이 계속 표시될 수 있습니다. 확실하지 않다면 서버에서 직접 확인하세요:
# Debian/Ubuntu
dpkg-query -W alpamon-pam
# RHEL/CentOS/Rocky/Alma/Fedora, openSUSE/SLES
rpm -q alpamon-pam