SAP

SU01 잠금 해제 안 하면 큰일 #shorts #SAP #Basis

▶ YouTube에서 보기

이 글에서 다루는 내용

월요일 아침, 급여 마감 담당자가 "로그인이 안 돼요"라고 외치는 순간 Basis 담당자의 하루가 시작됩니다. SU01은 SAP NetWeaver AS ABAP의 사용자 계정을 생성·수정·잠금 해제하는 핵심 트랜잭션이며, 계정 잠금 대응 속도가 곧 업무 연속성입니다. 이 글은 SU01 기반 계정 관리 5단계 체크리스트를 실전 예제와 함께 다룹니다.

  • 계정 잠금이 발생하는 4가지 원인과 USR02 테이블의 UFLAG 값 구조 이해
  • SU01 화면에서 잠금 해제하는 표준 절차
  • BAPI를 활용한 잠금 상태 조회·해제 자동화 (에러 처리 포함)
  • SM12 잠금 엔트리 확인, SUIM 감사 리포트 활용
  • 프로덕션 환경에서 지켜야 할 예방 체크리스트 5단계

시작 전에 알아두면 좋은 것

SAP GUI 로그인과 트랜잭션 코드 실행 방법을 알고 있으면 충분합니다. ABAP 예제를 따라 하려면 SE38 리포트 작성 경험이 있으면 좋지만, 화면 조작 파트(1단계)는 코드 없이 진행할 수 있습니다. 권한 개념(권한 오브젝트 S_USER_GRP)은 본문에서 필요한 만큼 설명합니다.

환경 및 준비물

이 글의 예제는 다음 환경을 기준으로 작성했습니다.

  • SAP NetWeaver AS ABAP 7.50 이상 (S/4HANA 1909~2023 온프레미스에서도 동일하게 동작)
  • SAP GUI for Windows 8.00 이상
  • 필요 권한: S_USER_GRP(활동 05 잠금/잠금해제), S_TCODE(SU01, SM12, SUIM)
  • ABAP 예제 실습용 개발 시스템 접근 권한 (SE38)

일반적으로 프로덕션에서는 SU01 변경 권한을 Basis·보안 팀으로 제한하므로, 실습은 반드시 개발(DEV) 시스템에서 진행하는 것을 권장합니다.

핵심 개념: 계정 잠금은 어떻게 동작하는가

SAP의 계정 잠금은 호텔 카드키에 비유할 수 있습니다. 카드키가 정지되는 이유는 두 가지입니다. 투숙객이 비밀번호를 여러 번 틀려 시스템이 자동으로 막은 경우(자동 잠금), 그리고 프런트 직원이 의도적으로 정지시킨 경우(관리자 잠금)입니다. SAP은 이 상태를 테이블 USR02의 UFLAG 필드에 숫자로 기록합니다.

UFLAG 값의미해제 주체
0잠금 없음-
32관리자에 의한 전역 잠금 (CUA 환경)중앙 시스템 관리자
64관리자에 의한 로컬 잠금해당 시스템 관리자
128비밀번호 오입력 누적으로 인한 자동 잠금관리자 또는 자동 해제

자동 잠금(128)의 임계값은 프로파일 파라미터 login/fails_to_user_lock(기본 5회)이 결정하고, login/failed_user_auto_unlock이 1이면 자정 이후 자동으로 풀립니다. 관리자 잠금(32/64)은 자동으로 풀리지 않으므로 반드시 SU01 또는 BAPI로 해제해야 합니다.

여기서 흔히 혼동하는 개념이 하나 있습니다. SM12에서 보이는 잠금은 계정 잠금이 아니라 엔큐(Enqueue) 잠금, 즉 데이터 편집 충돌 방지용 오브젝트 잠금입니다. 예를 들어 두 관리자가 동시에 같은 사용자를 SU01에서 열면 오류가 나는데, 이때 확인할 곳이 SM12입니다. "계정 잠금 = USR02.UFLAG", "편집 잠금 = SM12 엔큐"로 구분해야 원인 분석이 빨라집니다.

예방 관점의 계정 관리 5단계 체크리스트는 다음과 같습니다.

  1. 원인 분류: UFLAG 값으로 자동 잠금인지 관리자 잠금인지 먼저 구분
  2. 세션 확인: SM12에서 편집 충돌 여부 확인 후 해제 작업 진행
  3. 이력 감사: SUIM 변경 문서로 누가 언제 잠갔는지 추적
  4. 정책 점검: login/* 파라미터와 비밀번호 만료 주기 검토
  5. 기록 남기기: 해제 사유를 티켓·애플리케이션 로그에 반드시 기록

실전 예제 3단계

1단계 — SU01 화면에서 잠금 해제 (기본)

화면 조작만으로 1분 안에 끝납니다.

  1. 커맨드 필드에 SU01 입력 후 실행
  2. 사용자 ID 입력(예: HR_PAY01) 후 상단의 자물쇠 아이콘(Ctrl+F5) 클릭
  3. 팝업에서 잠금 유형 확인: "비밀번호 오입력으로 잠김" 또는 "관리자에 의해 잠김"
  4. 잠금해제 버튼 클릭 후 필요 시 초기 비밀번호 발급

해제 전 잠금 상태를 코드로 확인하고 싶다면 BAPI_USER_GET_DETAIL을 사용합니다.

REPORT zchk_user_lock.
PARAMETERS pv_uid TYPE xubname DEFAULT 'HR_PAY01'.
DATA: ls_lock TYPE bapislockd,
      lt_msg  TYPE STANDARD TABLE OF bapiret2.
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
  EXPORTING username = pv_uid
  IMPORTING islocked = ls_lock
  TABLES    return   = lt_msg.
IF ls_lock-wrng_logon = 'L'.
  WRITE: / pv_uid, ': 비밀번호 오입력 자동 잠금(128)'.
ELSEIF ls_lock-local_lock = 'L'.
  WRITE: / pv_uid, ': 관리자 로컬 잠금(64)'.
ELSE.
  WRITE: / pv_uid, ': 잠금 없음'.
ENDIF.

2단계 — 다수 계정 일괄 해제와 로깅

비밀번호 정책 변경 직후 수십 명이 동시에 잠기는 상황은 실무에서 드물지 않습니다. 아래 리포트는 자동 잠금(128) 사용자만 골라 해제하고, 실패 건은 메시지와 함께 출력합니다.

REPORT zunlock_auto_batch.
DATA: lt_locked TYPE STANDARD TABLE OF usr02-bname,
      lt_ret    TYPE STANDARD TABLE OF bapiret2.
SELECT bname FROM usr02
  INTO TABLE @lt_locked
  WHERE uflag = 128
    AND bname NOT LIKE 'DDIC%'
    AND bname NOT LIKE 'SAP*'.
LOOP AT lt_locked INTO DATA(lv_user).
  CLEAR lt_ret.
  CALL FUNCTION 'BAPI_USER_UNLOCK'
    EXPORTING username = lv_user
    TABLES    return   = lt_ret.
  READ TABLE lt_ret INTO DATA(ls_ret) WITH KEY type = 'E'.
  IF sy-subrc = 0.
    WRITE: / '[실패]', lv_user, ls_ret-message.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'.
    WRITE: / '[해제]', lv_user, sy-datum, sy-uzeit.
  ENDIF.
ENDLOOP.

3단계 — 프로덕션: 권한 검사·BAL 로그·안전장치

REPORT zunlock_prod_safe.
CONSTANTS: gc_object TYPE balobj_d  VALUE 'ZSEC',
           gc_subobj TYPE balsubobj VALUE 'UNLOCK'.
PARAMETERS pv_uid TYPE xubname OBLIGATORY.
PARAMETERS pv_tkt TYPE char20  OBLIGATORY.
AUTHORITY-CHECK OBJECT 'S_USER_GRP'
  ID 'CLASS' FIELD '*' ID 'ACTVT' FIELD '05'.
IF sy-subrc <> 0.
  MESSAGE '잠금해제 권한이 없습니다' TYPE 'E'.
ENDIF.
IF pv_uid CP 'DDIC*' OR pv_uid CP 'SAP*'.
  MESSAGE '시스템 계정은 이 리포트로 해제 불가' TYPE 'E'.
ENDIF.
DATA lt_ret TYPE STANDARD TABLE OF bapiret2.
CALL FUNCTION 'BAPI_USER_UNLOCK'
  EXPORTING username = pv_uid
  TABLES    return   = lt_ret.
DATA(ls_log) = VALUE bal_s_log(
  object    = gc_object
  subobject = gc_subobj
  extnumber = |{ pv_uid } / 티켓 { pv_tkt }| ).
DATA lv_handle TYPE balloghndl.
CALL FUNCTION 'BAL_LOG_CREATE'
  EXPORTING i_s_log      = ls_log
  IMPORTING e_log_handle = lv_handle.
CALL FUNCTION 'BAL_DB_SAVE' EXPORTING i_save_all = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'.
WRITE: / pv_uid, '해제 완료. SLG1 로그 기록됨.'.

흔한 실수와 트러블슈팅

Q1. 잠금 해제했는데 로그인이 안 됩니다.

UFLAG가 0이어도 비밀번호 만료 상태면 로그인이 거부됩니다. SU01 로그온 데이터 탭에서 비밀번호 상태와 유효 기간을 확인하세요.

Q2. SU01에서 "다른 사용자가 편집 중" 오류가 납니다.

SM12에서 USR04 테이블 기준으로 해당 사용자의 엔큐 엔트리를 조회하세요. 끊긴 GUI 세션이 잠금을 쥐고 있는 경우가 대부분입니다.

Q3. 해제해도 몇 분 뒤 다시 잠깁니다.

RFC 목적지(SM59), 배치 잡 실행 사용자, 인터페이스 미들웨어에 저장된 자격 증명을 점검하세요. SM20 보안 감사 로그에서 실패 로그온의 출발지 터미널을 확인하면 빠르게 원인을 찾을 수 있습니다.

이어서 살펴볼 주제

SU10을 이용한 대량 사용자 변경, SUIM 권한 분석 리포트(RSUSR002), SM19/SM20 보안 감사 로그 설정, CUA 환경에서의 전역 잠금 처리 흐름이 자연스러운 확장 경로입니다. S/4HANA 환경이라면 IAM 기반 비즈니스 사용자 관리와 SU01의 관계도 함께 살펴보면 좋습니다.

더 읽어볼 자료

  • SAP Help Portal — User and Role Administration of AS ABAP (NetWeaver 7.50)
  • SAP Help Portal — 로그온·비밀번호 관련 프로파일 파라미터
  • SAP Community — ABAP / Basis 사용자 관리 토론

댓글 0

아직 댓글이 없습니다.