리눅스 시스템계정이나 관리자계정과 동일한 계정명으로는 가입하지 못하게 하는 방법이 있나요?

viper9의 이미지

웹프로그래밍은 막 시작하는 유저입니다.

작은 사이트를 위해서 프로그래밍하다보니 문제가 하나 있네요.

일단 회원가입을 받습니다. 간단하게 유저ID, 비밀번호, 이메일 이렇게 3개만 받게 되구요.

사용자가 가입신청 버튼을 누르면 MySQL DB에서 해당하는 ID가 있는지 확인해보고 없다면 디비에 INSERT하고 있다면 경고 얼럿 띄우고... 아주 평범한 회원가입 양식입니다.

그런데 문제가... 여기서 가입한 사용자의 계정으로 나중에 서버에 쉘접속이 가능해야합니다.

그러고보니까 서버의 기본 시스템계정들, 예를 들면, adm, mysql, root, sshd, system, admin, 관리자계정....등등.... 이런 시스템 계정들과 충돌이 나면 안되는데 이런 계정명으로 가입할 수 없도록 하려면 어떻게 해야하는지 모르겠네요.

디비에 이런 계정들을 사전에 등록해놓으면 되긴하는데 한두개도 아니고... 가입신청을 하면 디비에다가는 일단 보류한다는 마킹을 해놨다가 직접 확인한 후 사용가능하게 해주는 방법도 있는데 이건 수동으로 확인해야한다는 맹점이 있네요.

useradd 같은 명령을 수행해보고 결과를 리턴 받아서 추가 가능한 계정인지 확인해볼 수도 있을 것 같은데 웹에서 시스템계정을 실행해보는 것도 뭔가 좀 아닌거 같네요.

시스템계정명으로 가입하는 것을 막는 방법이 어떤게 있는지 궁금합니다.

P.S. 사용 플랫폼은 CentOS이고 자바(JSP와 서블릿)로 프로그래밍하고 있습니다.

dgkim의 이미지

identity에 관심이 많은 사용자입니다.

계정이라면 저는 LDAP이 기본입니다.

웹에서 사용하는 사용자도 LDAP에서 인증을 받도록 하고 있으며,
OS도 PAM-LDAP을 통해서 LDAP을 통해 인증을 수행합니다.

그러므로, 생각하시는 것과 같이 OS의 passwd파일과 DB를 생각하시면 동기화 문제가 있겠지만,

저는 ldap에 기록을 하므로, 계정 신청시 ldap api를 통해 생성과정을 거친다면, 당연히 (일반 사용자의)충돌 문제는 자동으로 잡히리라 생각됩니다. 단, os 시스템 계정의 경우 시스템이 아니라 ldap에 기록하면 문제가 발생할 소지가 있습니다.

위 내용은 웹사용자와 OS인증문제에 대한 제가 사용하는 일반적인 방법론입니다.

----

계정 통합과는 별개의 문제로 os계정과의 충돌을 생각하신다면 말씀하신 것과 같이 useradd 명령의 실패 여부와 같은 다른 조치가 필요할 것으로 보입니다. 참고로 getent passwd 명령을 통해 시스템에 등록된 사용자 목록(passwd 파일과 같이)을 보는 기능이 있습니다.

viper9의 이미지

답변 감사드립니다.

LDAP에 대해서는 대략의 개념만 들어봤지 이게 사용자인증에 어떻게 구현되는지 너무 생소해서 난감하네요. 말씀하신대로 '계정통합' 같이 큰 것을 바라는 것은 아닙니다. (물론 이게 되면 좋긴한데 LDAP 자체를 잘 모르는 상태에서 시도했다가 더 어려워질 것 같아 망설여집니다.)

일단 passwd의 아이디들을 디비에 다 입력해놓는 것이 좋을 것 같기도하네요.

useradd의 결과를 보는 것보다는 알려주신대로 passwd에서 이미 입력된 계정명을 구해보는게 더 좋을 것 같습니다.

getent passwd 명령은 해봤는데 cat passwd 명령과 무슨 차이가 있는 것인지 혹시 알려주실 수 있을까요?

dgkim의 이미지

passwd파일 뿐만 아니라, 또 다른 인증수단을 사용하는 경우 getent 명령을 수행하면, passwd 파일 내용을 보여주는 것이 아니라 다른 인증 수단에 등록된 정보도 같이 보입니다.

/etc/nsswitch.conf 파일을 참조하시면 되며, 저는 아래와 같습니다.

# To use db, put the "db" in front of "files" for entries you want to be
# looked up first in the databases
#
# Example:
#passwd:    db files nisplus nis
#shadow:    db files nisplus nis
#group:     db files nisplus nis
 
passwd:     files ldap
shadow:     files ldap
group:      files ldap
 
#hosts:     db files nisplus nis dns
hosts:      files dns

즉, 사용자정보(passwd)와 그룹정보(group)를 /etc/passwd, /etc/group 파일과 함께 ldap 정보도 사용한다는 의미입니다.

예로 보이는 것과 같이 nis와 같은 인증 수단이 ldap 대신에 활용될 수도 있는 것이고.

ymir의 이미지

사용자 uid 는 특정 값부터 증가를 하기 때문에 (대부분 linux 의 경우 1000) ..
이미 등록된 계정이라면 uid 값을 확인해서 이 값보다 작으면 시스템 계정으로 판단할 수 있습니다.

그런데 mysql 이나 www 등과 같이 현재 passwd 파일에 등록되어 있지 않고, 나중에 추가되는 계정들이 있다면...
일반 사용자에 의한 선점 여부를 확인할 수 없습니다.

이미 완전히 셋업된 시스템이라면 uid 비교로도 어느정도 커버가 되겠지만, 그렇지 않다면 대안이 없는 셈이므로..
그냥 등록 불가 계정 목록을 블랙리스트로 만들어 놓고, 필터링 하는 것이 나을 것 같습니다.

http://cr.yp.to/unixaccount.html

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

sj316의 이미지

자바에 없긴 하지만(...) getpwnam() 을 사용하면 됩니다.

http://www.bmsi.com/java/posix/posix-1.2.2/doc/posix/Passwd.html (소스: http://www.bmsi.com/java/posix/posix-1.2.2/Passwd.java)

http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/setuid/SetUID.html (소스: http://jetty.codehaus.org/jetty/jetty-6/xref/org/mortbay/setuid/SetUID.html)

등을 참조해보세요.

위에거는 단순히 passwd에서 읽어오는거라 윗분이 말씀하셨던 nss/ldap와 연동은 안되고 아래거는 C 함수를 부르는거라 가능할듯 하지만 사용하기 좀 복잡하겠네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.