InfraPlatform

FreeIPA- 정책 관리 - user_add - 숫자로된 계정 생성 방법

IT오이시이 2026. 7. 28. 15:51
728x90

 

 

 

ipa계정 정책을 벗어나 기존의 정책을 수용해야 하는 경우가 있습니다.

ipa 는 숫자로만 구성된 계정을 만들지 못하는데  이런 예외적인 계정을 등록하는 방법을 찾고자  다음 블로그 글을 작성합니다.

전반적인 내용을 꼼꼼히 읽어 보고 다양한 실패의 교훈을 보고 정리 드립니다.

 

FreeIPA- 정책 관리 - user_add - 숫자로된 계정 생성 방법

 

-FreeIPA 계정생성 정책-

 

 

(문제)  IPA 계정 등록 정책 을 수정 할 수 있을까 ?

(?!^[0-9]+$)^[a-zA-Z0-9_.][a-zA-Z0-9_.-]*[a-zA-Z0-9_.$-]?$

 

이 정규식은 "하이픈으로 시작하는 건 막고, 특수문자(_, ., -)와 영문/숫자는 허용하되, 완전히 숫자로만 된 아이디(12345)는 금지하는 규칙"

위와 같이  첫글자가 숫자이면 안됩니다. 그리고 특수기호도 안됩니다.

 

① 부정형 전방탐색,(?!^[0-9]+$),
      "전체가 숫자로만 구성된 경우"를 차단 (Lookahead)
② 첫 글자 조건,^[a-zA-Z0-9_.],
    "시작 문자는 영문, 숫자, 언더바(), 마침표(.)만 가능", 하이픈(-)으로 시작하는 것은 방지
③ 중간 글자 조건,[a-zA-Z0-9
.-]*,
    "중간 문자는 영문, 숫자, , ., 하이픈(-) 허용 (0자 이상)", 두 번째 글자부터는 하이픈(-)이 추가로 허용
④ 끝 글자 조건,[a-zA-Z0-9
.$-]?$,
    "끝 문자는 영문, 숫자, _, ., $, - 허용 (선택적 1자)", 마지막 글자에는 NIS/Samba 계정 등에서 특수 목적(기계 계정 등)으로 쓰는 달러 기호($)가 추가로 허용

 

- - -
계정명 통과여부 거부 사유
12345 X 전체가 숫자로만 구성됨 ((?!^[0-9]+$) 규칙 위반)
u12345 O 영문 + 숫자 조합 (정상)
12345a O 숫자로 시작하지만 영문이 포함됨 (정상)
john.doe O 영문 + 마침표 조합 (정상)
-user X 시작 문자로 하이픈(-) 사용 불가

 


ㅁ 문제 해결 방안

1안) 소스를 수정하여 계정 등록을 가능도록 한다 (소스의 정규식을 수정한다) : 성공
       >> 소스를 수정하고 ipa를 재기동하여 사용자 등록 + 로그인 가능

2안 )  ipa LDAP Schema 를  수정 하여 계정을 등록 하는 방법 - 스키마 수정 :
        >> ( Schema  수정 실패)

2안 ) ipa LDAP Schema 로 커스텀 속성을 추가하여 계정을 등록 하는 방법 :
        >> ( 속성 수정 성공, 계정등록성공, 로그인은 안됨)

 


 

숫자로 구성된 계정을 만들어 보자 ( 실패)

FreeIPA 내부 유효성 검사기가 LDAP 변경값을 실시간으로 읽지 못하고 에러를 낸다면?

 

FreeIPA 최신 버전(4.x)의 내부 파이썬 검증 엔진은 입력된 계정 ID가 기본 규칙(숫자로만 된 ID 금지, 또는 특정 정규식)을 통과하지 못하면, 서버(LDAP)로 데이터를 전송하기도 전에 CLI 단에서 명령어를 스스로 차단해 버립니다.

ipa: ERROR: invalid 'login' 에러 메시지는 LDAP 데이터베이스 수정과는 별개로, FreeIPA CLI 명령어 프로그램(ipa 바이너리) 자체의 파이썬 코드 내부에 "유저네임(login) 규칙"이 하드코딩으로 엄격하게 고정되어 있기 때문에 발생한 오류

[root@ipa ~]# ipa user-add 12345 --first=Number --last=IDTest
ipa: ERROR: invalid 'login': may only include letters, numbers, _, -, . and $, refer to 'ipa help user' for complete format description

 

 

1안 ) 소스를 수정하여 계정을 등록하자  (성공) 

 


숫자로 만든 계정의 정보가 연관된 부분

# ************************************
# ipa LDAP Lib Source Relations
# ************************************

PATTERN_GROUPUSER_NAME = (
    '(?!^[0-9]+$)^[a-zA-Z0-9_.][a-zA-Z0-9_.-]*[a-zA-Z0-9_.$-]?$'
)

는 Python 모듈이 import될 때 메모리에 로드되는 상수(Constant) 입니다.

즉,

constants.py
        │
        ▼
PATTERN_GROUPUSER_NAME
        │
        ▼
baseuser.py
        │
        ▼
Str(
    'uid',
    pattern=constants.PATTERN_GROUPUSER_NAME
)

 

1) 계정 정책 (정규식) 라이브러리 소스를 수정 

/usr/lib/python3.12/site-packages/ipalib/constants.py  소스에 사용자 계정의 정규식 정책이 있습니다.

아래 와 같이 수정합니다. ( 주석 라인은 제거 합니다.)

# *********************************************
# /usr/lib/python3.12/site-packages/ipalib/constants.py
# *********************************************
#
# Maximum hostname length in Linux
# It's the max length of uname's nodename and return value of gethostname().
MAXHOSTNAMELEN = 64
# DNS name is 255 octets, effectively 253 ASCII characters.
MAXHOSTFQDNLEN = 253

# regexp definitions
PATTERN_GROUPUSER_NAME = (
   # '(?!^[0-9]+$)^[a-zA-Z0-9_.][a-zA-Z0-9_.-]*[a-zA-Z0-9_.$-]?$'
   '^[a-zA-Z0-9_.][a-zA-Z0-9_.-]*[a-zA-Z0-9_.$-]?$'
)
ERRMSG_GROUPUSER_NAME = (
    'may only include letters, numbers, _, -, . and $'
    ', refer to \'ipa help {}\' for complete format '
    'description'
)

 

수정 전 

 
PATTERN_GROUPUSER_NAME = (
    '(?!^[0-9]+$)^[a-zA-Z0-9_.][a-zA-Z0-9_.-]*[a-zA-Z0-9_.$-]?$'
)

 

수정 후

PATTERN_GROUPUSER_NAME = (
    '^[a-zA-Z0-9_.][a-zA-Z0-9_.-]*[a-zA-Z0-9_.$-]?$'
)

 

2) FreeIPA 서비스 재시작

ipactl restart

 

3) 숫자 계정 생성 테스트

# 숫자로 구성된 계정을 생성합니다.
ipa user-add 12345 --first=NumberTest --last=User



# 계정의 패스워드를 등록합니다.
ipa user-mod 12345 --password


# ssh 로그인 테스트
ssh   12345@localhost -p 22

 

 


 ipa 사용자 수동 등록  실패한 경우를 남겨 봅니다.

 

ipa  사용자 등록은 다음 두가지 스키마의 영향을 받고 있다.

2안 ) ipaConfig  속성을 수정 하여 계정 등록 (Schema 수정 실패) 

3안) 커스텀 속성을 수정하여 계정 등록 (성공)  : 우회방법 ( 등록, 수정 성공, 로그인 실패)

 

다음 두가지 Ldap DB 스키마를 수정해야 하는 과정이 필요하나 (1안은 실패)

# 2안 :  ipa user add 관련 정책 <- 등록이 필요하나 수정이 안됨
 /etc/dirsrv/slapd-IPARKM-IO/schema/60ipaconfig.ldif


# 3안 : ipa custom 필드명 등록 <- 사용자정의 컬럼 추가
 /etc/dirsrv/slapd-IPARKM-IO/schema/99user.ldif

 

 

3안)  ipaConfig  커스텀 스키마를 수정하여  사용자 계정을 생성하는 방안 (실패)

ㅁ ipaConfig  속성을 수정 하여 등록 (실패)
  -  다음과 같이  ipaConfig -> ipatextusernamepattern 속성을 추가 하고자 하였으나 스키마 수정이 실패 하였다

#
# ipaConfig -> ipatextusernamepattern 속성을 추가 하고자 하였으나 실패
#
ldapmodify -Y EXTERNAL -H ldapi:///var/run/slapd-IPARKM-IO.socket <<EOF
dn: cn=ipaConfig,cn=etc,dc=iparkm,dc=io
changetype: modify
replace: objectClass
objectClass: top
objectClass: ipaConfig
objectClass: ipaConfigObject
add: ipatextusernamepattern
ipatextusernamepattern: [a-zA-Z0-9_.][a-zA-Z0-9_.-]*[a-zA-Z0-9_.$-]?$
EOF

 

2안)  사용자 정의 커스텀 스키마를 수정하여  사용자 계정을 생성하는 방안 (성공)

 ** 현재 이 방법은  ipa Portal의 계정 등록은 되었으나 , 서버 계정 로그인 연동이 되지 않아 확인중

ipa 명령어가 앞단에서 차단한다면, 앞서 성공하셨던 ldapmodify (또는 ldapadd) 방식을 사용하여 FreeIPA 백엔드 디렉터리에 계정 데이터를 사용자 정의 컬럼으로 입력하면 CLI의 파이썬 검증 인터셉터를 완벽하게 우회할 수 있습니다.
ipactl restart


ldapmodify -Y EXTERNAL -H 'ldapi://%2fvar%2frun%2fslapd-IPARKM-IO.socket' <<EOF
dn: uid=12345,cn=users,cn=accounts,dc=iparkm,dc=io
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
uid: 12345
cn: Number IDTest
sn: IDTest
givenName: Number
uidNumber: 877400004
gidNumber: 877400004
homeDirectory: /home/12345
loginShell: /bin/sh
krbPrincipalName: 12345@IPARKM.IO
EOF

 

 

3안 ) 커스텀 속성 생성 후 FreeIPA  관리자 와 로그인  확인 (성공)

 

LDAP으로 직접 계정을 밀어 넣은 후, 아래 명령어를 실행하여 FreeIPA 시스템이 숫자로 된 계정을 정상적인 사용자로 인식하고 불러오는지 검증합니다.
 
 
ㅁ ipa user-show   등록정보 확인
 
# FreeIPA 명령어로 유저 정보가 정상 조회되는지 확인
ipa user-show 12345

 

ㅁ ipa user-mod  비밀번호 강제 수정

# kinit admin : 관리자 로그인 (인증)

[root@ipa ~]# kinit admin
Password for admin@IPARKM.IO:


# ipa user-mod : 비밀번호 강제 변경 명령어 실행

[root@ipa ~]# ipa user-mod 12345 --password
Password:
Enter Password again to verify:
---------------------
Modified user "12345"
---------------------
  User login: 12345
  First name: Number
  Last name: IDTest
  Home directory: /home/12345
  Login shell: /bin/sh
  Principal alias: 12345@IPARKM.IO
  UID: 877400004
  GID: 877400004
  Job Title: Manager ipa
  User authentication types: password
  Account disabled: False
  Password: True
  Member of groups: ipausers, developer
  Kerberos keys available: True

 

 

ipa  관리 화면에서 계정의 정보는 보이나 로그인 연동이 되지 않는다. 관련해서는 좀더 확인후 업데이트 예정임

728x90
반응형