본문 바로가기

별걸다하는 IT/리눅스 유닉스

UNIX/LINUX(리눅스) 로그인 상세 동작과정(getty, bash login등 인증 절차, 셸 시작)

[유닉스/리눅스 목차]


유닉스/리눅스 로그인 과정 (Unix/Linux Login Process)

오늘은 유닉스/리눅스에서 로그인 시 이뤄지는 상세 과정에 대해서 살펴볼거예요.


The procedure that we now describe is used to log in to a UNIX system using a terminal. 

오늘 우리가 다룰 사항은 터미널을 이용해서 유닉스 시스템에 로그인 할 때 이뤄지는 과정이예요. (리눅스는 유닉스 기반인거 아시죠?)

The procedure is similar regardless of the type of terminal we use- it could be a character-based terminal, a graphical terminal emulating a simple character-based terminal, or a graphical terminal running a windowing system.

이 진행과정은 우리가 사용하는 터미널 유형과는 상관 없습니다. 문자 기반 터미널(텍스트 터미널)이 될 수도 있고, 텍스트 터미널을 실행시키는 그래픽 터미널이 될 수도, 윈도우시스템에서 돌아가는 그래픽 터미널이 될 수도 있습니다.


BSD Terminal logins (리눅스는 BSD 진행과정과 매우 유사합니다)

The BSD terminal login procedure has not changed much over the past 35 years.

BSD 터미널 로그인 과정은 35년이 넘도록 크게 변한 것 없이 쭉 사용되고 있습니다.



1. 부팅하고 init 프로세스가 생성

시스템이 부팅되면 커널은 프로세스 ID 1을 갖는 시작 프로세스를 만드는데 이 시작 프로세스는 멀티유저 모드를 실행시킵니다. init process는 언제나 첫번째 프로세스라고 해서 init(시작) 프로세스입니다! 리눅스 시스템에서 init은 보통 /sbin/init에 있습니다. 


2. 터미널마다 프로세스가 생성되고 getty가 실행

The init process reads the file /etc/ttys and, for every terminal device that allows a login, does a fork followed by an exec of the program getty.

이 init 프로세스는 /etc/ttys 파일을 읽어요. 그리고 그 파일 정보에 있는 각각 터미널, 가상 콘솔마다 모두 프로세스를 만들어 getty 프로그램을 실행시킴으로써 사용자들이 로그인 할 수 있도록 합니다. getty는 get tty의 준말로 하나의 터미널에 대한 서비스를 제공해요. 

우분투의 경우, 설정 파일이 *.conf같은 형태를 주로 띄고 있어요. /dev/tty1 가상 콘솔에서 돌아가는 getty 프로세스 내용들은  보통 /etc/init/tty1.conf 파일에 저장되어 있습니다.



3. getty는 로그인을 기다림, 환영 메세지 출력

이 프로세스들은 실제 실제 유저 ID 0을 갖습니다. getty가 있으면 터미널 디바이스가 연결되기 때문에 터미널로부터 타이핑을 읽거들이거나 쓸 수 있어요. getty는 터미널에서 로그인하려는 사용자가 있는지 살펴보면서 기다립니다.(즉 사용자가 뭔가를 타이핑하지 않는지 살펴봄)

사용자가 있다면 getty는 환영 메세지를 출력하고 (이 메세지는 /etc/issue에 들어가 있습니다) 로그인 프롬프트를 띄웁니다.


4. 계정입력과 로그인 프로그램 실행.

우리가 계정을 입력하고 들어가면 getty일은 끝나고 로그인 프로세스를 일으킵니다. ( exec("/bin/login") )

There can be options in the gettytab file to have it invoke other programs, but the default is the login program.

gettytab파일에 다른 프로그램을 호출하라는 옵션이 있을 수도 있는데 항상 디폴트로 정해진 기본프로그램은 로그인 프로그램입니다.

로그인은 인증을 확인하고 만약에 맞으면 setuid() 같은 시스템 콜을 이용해서 그 유저로 바꿔주고, 환경변수를 세팅하고 umask를 설정하고 로그인 셸을 실행시키는 등의 여러 일을 합니다. 

로그인 프로그램은 username(사용자 계정)을 매개변수로 전달받습니다 그리고 해당 로그인 프로세스는 getpass(3)을 호출해서 프롬프트에 비밀번호 입력하라고 띄웁니다. (Password: )

 

5. 비번 입력과 해독

그리고 비번이 입력되면 읽어들입니다. 로그인 프로세스는 crypt(3)을 호출해서 패스워드를 해독 그리고 shadow 파일에 있는 우리 비번과 일치하는지 비교합니다.

/etc/passwd에서 유저계정을 확인하고 *를 만나면 /etc/shadow로 들어가서 암호화된 비밀번호를 확인합니다.


6. 로그인 실패시 

If the login attempt fails beacuse of an invalid password (after a few tries), login calls exit with an argument of 1. 

몇 번 시도 후(보통 3번)에 패스워드 불일치로 로그인이 실패하면 1이라는 아규먼트를 가진 exit을 호출합니다

자식 프로세스가 이렇게 종료되면 부모 프로세스인 init 프로세스에게 이 사실이 전달되고 init 프로세스는 다시 fork해서 (자식 프로세스 생성) getty의 exec를 호출해 새로운 getty를 띄어 놓습니다. 이 터미널의 진행과정을 다시 시작하는거죠.

이게 UNIX 시스템에서 사용된 전통적인 인증 절차입니다.


7. 잠깐! PAM이란 

요새는 PAM(Pluggable Authentication Modules)이라고 하는 더 좋은 인증 절차방법이 나와서 사용되고 있습니다. FreeBSD, 리눅스, 맥OS X, 솔라리스에서 지원하고 있어요. 좀 더 말하자면 PAM은 각종 어플리케이션 인증을 위해 제공된 다양한 인증용 라이블러리들을 말합니다. 일반적으로 /lib/security 또는 usr/lib/security 디렉터리에 해당 라이브러리가 저장되어 있습니다. (배포판마다 다를 수 있어요)


PAM allows an an administrator to configure the authentication methods to be used to access services that are written to use the PAM library.

PAM 라이브러리에 적힌 인증 방법들을 관리자가 선택해서 사용할 수 있어요. PAM 설정에서 로그인 최대 실패 허용 횟수를 정할 수도 있습니다.


8 로그인 성공! 유저에 맞는 기본적인 설정 수행 

로그인이 잘 되면 로그인 프로그램은 /etc/passwd을 참조해 사용자의 기본 정보(유저아이디, 그룹아이디, 홈 디렉터리, 기본 쉘 등)을 확인합니다.

그래서 유저에 맞게 홈 디렉터리를 바꿀꺼고 (chdir) 터미널 디바이스의 소유권을 소유하도록 바꾸고,

접근권한 설정, 그룹 아이디 설정(setgid, initgroups), 유저아이디 변경(setuid), 로그인이 가진 정보들로 환경변수 세팅할거예요.(HOME, SHELL, USER, LOGNAME, PATH 등의 환경변수들이요!) 이런일들을 쫙 수행합니다. 로그인 프로그램은 지금 말한 것보다 더 많은 일을 수행해요. 이정도까지만 일단 알아둡시다. 


여기까지를 전체적으로 그려보면 아래와 같습니다.



9. 로그인 성공하면 배너 띄우기 

Once it gathers all the properties and before the start of user shell it read /etc/motd file and display it's content as banner message to user.  

정보를 다 확인하고 유저가 설정한 기본 셸을 시작하기 전에(지금 돌아가고 있는 셸은 그냥 로그인 셸) /etc/motd 파일을 읽고 유저에게 배너 메세지를 띄웁니다. 


10. /etc/profile 읽기

로그인은 /etc/profile 파일을 읽어요. 이 파일은 system wide default file이라고 시스템 모든 유저에게 공통으로 적용되는 설정이 적혀있는 파일입니다.  반면 .bashrc파일같은 경우는 user specific settings라고 해요.


11. Bash 셸 실행!

지금까지 돌아가고 있던 셸은 로그인 셸인데요 셸은 login shell과 non-login shell로 나뉩니다. 로그인 셸은 처음 리눅스를 부팅하고 터미널을 켰을 경우에 나타나는 셸을 의미해요. 유저가 설정한 셸로 들어가거나 명령어로 특정 셸로 들어가면 그건 non-login shell이 되겠죠?


/etc/profile 파일을 다 읽었으면 유저 홈 디렉터리 내용을 읽고 만약 기본 셸이 BASH 이면 .bashrc, .bash_profile에 따라 유저 셸 프로퍼티들을 변경합니다. 유저마다 설정된 기본 셸이 다를 수 있는데 이 정보를 /etc/passwd 파일에서 가져옵니다. 우분투는 보통 따로 설정하지 않으면 기본 셸이 bash예요.


이렇게 login shell에서 bash 셸이 실행됩니다!

로그인시작부터 셸 실행까지 전체적인 과정을 쭉 간단하게 훑어봤어요