이전 편

이번엔 리눅스 보안에 대해 알아보자. 윈도우랑 비슷한 구석이 없잖아 있다. 

UNIX/Linux 기본


먼저 유닉스와 리눅스의 로그인 과정을 알아보자. 


윈도우의 SAM 파일 같이 /etc/passwd 파일의 내용과 비교하여 일치하면 로그인을 시켜준다. 


구체적으로 어떻게 실행되는지를 알려면 /etc/passwd 파일의 필드가 어떤게 있는지 알아 둘 필요가 있다.


vi 편집기로 열어본 passwd 파일의 내용이다. user 계정의 정보로 필드를 분석해 보자.


user:x:1000:1000:user:/home/user:/bin/bash 이렇게 되어있는데 각 필드의 내용은

이렇게 되어있다. 참고로 웬만한 비번칸이 x로 설정이 되어있을텐데 이것은 비밀번호를 암호화 처리가 되어 /etc/shadow 파일에 저장 되어 있다는 것을 의미한다. 


비밀번호 없이 계정을 생성하면 아에 필드 자체가 비어있다.


쉘은 운영체제와 커널 사이에서 사용자의 명령어를 해석해서 커널에 던져주는 역할을 하는 애다. 


리눅스의 로그인 과정은 ‘계정명 입력 → /bin/login 프로그램 실행 → /etc/passwd, etc/shadow 등 로그인에 필요한 파일들 참조 → 로그인’ 이렇게 실행이 될 것이다. 왜 될 것이다 라고 해놨냐면 정확히 어떻게 굴러가는지는 몰라서 ㅎㅎ 여하튼 저렇게 로그인이 성공되면 HOME 디렉토리 위치에 내가 지정한 쉘을 가지고 컴퓨터에 접속한 상태가 된다. 보통은 bash 쉘로 지정되어 있을 것이다. 


이 /etc/passwd 파일은 굉장히 중요하다. 예시를 한번 알아보자.

같은 /etc/passwd의 파일 내용 중 일부분을 가져왔다. root는 윈도우의 Administrator라고 생각하면 된다. 


여기서 보안 지적사항으로 test01처럼 UID와 GID를 0 으로 설정해 놓은 계정이 있으면 안된다. 기본적으로 리눅스에서는 보안상의 이유로 root 계정을 막아놓는다. 


그런데 root의 UID와 GID를 가지고 있으면 root의 권한을 가지고 활동을 할 수 있기에 test01같이 uid gid가 0인 계정을 함부로 만들면 심히 곤란하다. 패스워드를 변경하는 명령어는 ‘passwd’이다. 

그냥 사용하면 현재 로그인 한 사용자의 비밀번호를 바꾸는 과정을 거치며 ‘passwd <사용자 계정명>’ 으로 특정 사용자의 비밀번호를 재설정 할 수도 있다. 


‘id <사용자 계정>’ 명령어도 있는데 이것은 현재 시스템에 접속 중인 사용자를 확인하는 명령어 이다. 또한 사용자를 추가하는 명령어는 ‘adduser’, ‘useradd’가 있는데 useradd는 /etc/default/useradd 파일의 내용대로 사용자를 생성하는 것이고 ‘adduser’는 uid, gid, 홈 디렉토리와 코멘트, 비밀번호까지 한번에 설정하게 하는 명령어이다. VM으로 깔아서 직접 명령어를 확인해 보는 방법이 좋을 것이다. 그 외에도 계정에 대한 수정 명령어를 내리는 ‘usermod’, 유저 삭제를 하는 ‘userdel’ 등의 명령어도 있다.


리눅스의 그룹은 윈도우의 그룹과 유사하게 작동한다. 사용하는 이유는 접근 권한 및 보안 등을 관리하기 위하여 사용한다더라. 


리눅스 시스템은 파일이나 디렉토리 같은 자원에는 소유주와 소유그룹이 있는데 이들 모두 접근권한을 다르게 설정 할 수 있다. 그래서 소유그룹에 속해 있는 사용자는 자원에 대해서 소유그룹의 접근권한을 가지고 접근할 수 있다. 


리눅스의 사용자는 하나의 기본 그룹(Primary Group)과 여러 개의 보조 그룹(Secondary Group)에 소속될 수 있다. 기본그룹은 /etc/passwd의 4번째 필드의 GID가 기본 그룹이다. 그룹에 대한 내용은 /etc/group 파일을 열어보면 확인이 가능하다.

/etc/group 파일은 이렇게 구성되어 있다.

필드를 살펴보자.

기본 그룹 소속자들은 4번째 필드에 표현되지 않는다. 책에는 소속된 사용자 계정들 이라고만 나와있어서 일단 적어놨다. 그룹에 관한 명령어를 알아보자. 그룹을 추가하는 ‘groupadd’, 또는 ‘addgroup’이 있고 그룹을 수정하는 ‘groupmod’, 그룹 삭제를 하는 ‘groupdel’, 소속된 사용자를 확인하는 ‘groups’가 있다.


그 외에 사용하는 명령어를 알아보자. 먼저 입출력을 재지정하는 명령어가 있는데 이 것은 내가 화면에 출력한 내용을 파일로 출력하는 기능이다. 


입출력재지정 명령어에는 입력으로 ‘[명령어] < [파일이름]‘,‘[명령어] > [파일이름]’, ‘[명령어] >> [파일이름]’ 으로 지정할 수 있다. ‘>’ 는 같은 이름의 파일 존재 시 새로운 파일의 내용으로 교체 되고 >> 는 해당 파일의 내용에 추가로 들어가는 식이다. 덮어쓰기? 같은 느낌이라고 보면 되겠다. 


그 다음으로 알아볼 것은 파이프 이다. 파이프는 ‘|’ (‘\’ + shift)인데 둘 이상의 명령을 함께 묶어 출력의 결과를 다른 프로그램의 입력으로 전환하는 기능이다. 사용은 ‘[명령어] | [명령어] | ...’ 로 사용하고 앞의 명령의 출력 데이터가 뒷 명령어의 입력 데이터로 전달이 된다. 


자주 사용하는 특수문자로는 .(현재 디렉토리), ..(상위 디렉토리), #(주석), $(쉘 변수), &(백그라운드 작업), *(와일드카드, 전체라고 생각하자) 등이 있다.


글이 좀 이상할 수 있는데 이해 안가는 부분이 있거나 이상한 부분이 있으면 지적해줭