리눅스 운영체제가 설치된 컴퓨터에 여러 사용자가 접속하여 작업을 진행하는 경우, 해당 사용자가 악의적인 작업을 진행하고 있지는 않는지, 관리자가 지속적으로 확인해야만 한다. 또한 사용을 허가받지 않은 사용자가, 사용자의 ID를 우연히 알게 되어, 해당 계정으로 여러 번의 접속을 시도하여 불법적인 접근이 이루어지는 것도 막아야 할 필요가 있다.
이번 포스팅에서는, 리눅스의 각 사용자 관리 및 계정 관련 설정 내용에 대해 포스팅하려고 한다. (오랜만에 쓰는 리눅스 포스팅이다...)
1. 'w' 명령어: 내 컴퓨터에서 누가 무엇을 하고 있는가?
'w' 명령어는 내 컴퓨터에 접속한 계정이 무엇인지, 그리고 그 계정이 어떻게 접속을 하였고 현재 무슨 작업을 진행하고 있는지 상세하게 출력해주는 명령어이다. 해당 명령어를 실습하기 위해, 필자는 새로운 계정 3개를 만들어, SSH 프로토콜로 원격 접속을 진행하려고 한다.
*** SSH 접속을 위해서는 리눅스 운영체제가 네트워크에 연결되어 있어야하고, IP가 부여되어 있어야하며, 접속하고자 하는 컴퓨터에 SSH 프로그램이 설치되어 있어야 한다.
(1) 리눅스가 가상 머신으로 작동하고 있는 상태라면, 네트워크 설정을 NAT로 진행하여도 본 포스팅의 실습을 진행하는데 무리가 없다. 만약, LAN 선을 두 개 이상 꼽을 수 있는 부유한(?) 분이라면, Bridge로 연결하여도 크게 상관은 없다. 하지만 Bridge로 연결하는 경우, 리눅스에 따로 IP를 지정해주어야 한다.
(2) SSH 접속 프로그램으로 putty나 Xshell이 많이 사용된다. 하지만 새 프로그램을 깔기 귀찮다면, cmd 창에서 ssh를 사용할 수 있도록 설정할 수 있다. 설정 방법은 여기를 참고하자.
(3) Putty로 IP 입력 후, 접속이 되지 않는 경우, 암호키 알고리즘의 설정이 원인일 수 있다. putty의 좌측 메뉴에서 SSH-> 키교환 탭 선택 후, 우측 상단의 "디퍼.헬만 그룹 14"를 최상단으로 올린 뒤 접속을 시도해보자.
필자는 다음과 같이 세 개의 계정을 만들고, 각각의 계정에 비밀번호를 부여해주었다. 계정 비밀번호가 없다면 SSH 접속이 불가능하니 필수로 비밀번호를 지정해주어야 한다.
각 계정 ID로 SSH 접속을 진행한 뒤,
Root 계정에서 w 명령어를 치면 다음과 같은 출력물이 나타난다.
SSH로 접속한 user1, user2, user3에 대한 정보가 고스란히 표시되고 있다. w 명령어는, 관리자 또는 사용자가, 현재 자신이 작업하는 컴퓨터에 접속한 계정에 대한 정보를 얻기 위해 사용한다. w 명령어의 출력 결과는 크게 8가지의 필드로 나뉜다.
첫 번째 필드는, 다들 알다시피, 접속한 사용자의 ID다.
두 번째의 TTY는 어떤 터미널에서 접속이 이루어졌는지(SSH인지, 아니면 로컬컴퓨터에서 작업 중인지 등)를 나타낸다. w 명령어의 가장 첫 줄에 나오는 계정은 TTY가 :0으로 되어 있는데, 이 계정의 경우 VMware 내에서 직접 로그인을 시도했기 때문에 로컬 컴퓨터로 직접 접속한 것이라고 나타내는 것이다. pts는 SSH 접속을 진행한 계정에 한해 출력되는 결과물이며, 오른쪽의 숫자는 접속 계정이 해당 컴퓨터에 몇 번째로 SSH 접속을 진행한 것인지를 알려준다.
세 번째는 접속한 계정의 IP 주소를 나타낸다. 직접 로컬 컴퓨터로 로그인한 계정의 경우, TTY와 마찬가지로 :0(로컬컴퓨터)로 나타난다.
네 번째 필드는 계정이 접속한 시간에 대해, 다섯 번째 필드는 접속 후, 활동하지 않은 시간을 나타낸다. 여섯 번째와 일곱 번째 필드는 해당 계정이 컴퓨터의 CPU를 얼마나 많이 사용하고 있는지를 나타내며, 마지막 필드는 해당 계정이 이 컴퓨터에서 어떤 작업을 수행하고 있는지를 표시한다. 만약 user3이 vi편집기를 사용하고 있다면, w 명령어의 출력 결과는 다음과 같이 변하게 된다.
'w' 명령어 외에도, 접속 계정을 살펴보는 명령어로 'who' 명령어가 있다. 말 그대로, 내 컴퓨터에 접속한 계정이 "누구"인가를 물어보는 명령어인데, 출력 결과는 'w' 명령어와 비교하면 조금 더 간략하다. (그래서 필자는 접속 계정 확인 시, who보다 w 명령어를 더 자주 사용한다)
'w'와 'who' 명령어는 접속한 계정이 무엇이고 어떤 작업을 하고 있는지에 대한 정보는 알 수 있지만, 계정에 대한 상세 정보, 그러니까 이 계정이 어느 그룹에 소속되어 있고, 어떤 Shell을 사용하는지, 혹은 Password 주기가 얼마나 길게 설정되어 있는지에 대한 정보는 확인할 수 없다. 이렇게 계정에 대한 상세 정보를 확인하기 위해서는 이전의 포스팅에서도 잠깐씩 언급했던 passwd와 shadow 파일을 봐야한다.
2. passwd 파일
passwd 파일은, 현재 컴퓨터에 생성된 계정에 대한 정보를 나타낸다. 이 파일은 각종 설정 파일을 저장하는 /etc 폴더 아래에 위치해있으며, 단순 텍스트파일이기 때문에 root 계정으로 Cat 명령어를 사용하면 내용을 읽을 수 있다. 필자는 새로 만든 계정에 대한 정보만 출력하기 위해, 다음과 같은 명령어를 사용했다.
해당 출력물은 콜론(:) 기호에 의해 필드가 구분되어 있다.
가장 첫 번째는 다들 알다시피 계정 ID에 대한 내용이다. 두 번째는 계정의 암호인데, passwd 파일에서는 보안을 위해 표시하지 않는 필드다. 대신, 계정의 암호는 shadow 파일에 암호화되어 표시된다(미리 언급하자면, Shadow 파일은 계정의 비밀번호 설정과 큰 관련이 있는 파일이다). 세 번째와 네 번째 필드는 UID와 GID 값으로, 각각 사용자 ID/그룹 ID를 나타낸다. UID는 이전에도 설명했듯이, 각 사용자를 리눅스가 이해하기 쉽게 숫자로 구분한 것을 말하는데, 가장 막강한 권한을 가지는 root 계정의 경우, UID가 0으로 설정되어 있다. 따라서 만약 일반 계정 중 어느 하나라도 UID가 0으로 수정된다면, 그 계정은 root와 동일한 권한을 가질 수 있게 된다. 필자가 다음과 같이 user1의 UID를 0으로 바꾸고 SSH 접속을 시도하면, Root 계정으로 접속한 것과 동일한 효과가 나타난다.
user 사용자는 어떠한 사용자 그룹에도 포함된 상태가 아니기 때문에, 각자가 생성한 사용자 그룹에만 포함된다. 사용자 그룹에 대한 내용은 다음 포스팅에서 언급할 예정이다.
다음 필드는 콜론 사이에 아무것도 없는 빈 공간만 보이는데(::), 이곳에는 각 사용자에 대한 Description, 즉 설명이 출력되는 부분이다. 필자가 사용자 생성을 하면서 딱히 설명을 달아놓지 않았기 때문에 표시되지 않는다. 만약, 각 계정에 설명을 추가하고 싶다면 vi 편집기로 /etc/passwd 안의 내용을 편집하면 된다.
마지막 필드는, 각 사용자가 사용하는 쉘의 종류를 나타낸다. CentOS7에서는 사용자 생성 시, 디폴트 값으로 /bin/bash 쉘을 제공한다. 전체 passwd 내용을 보면 알겠지만, 어떤 계정에는 sbin/nologins라고 설정된 계정들도 보이는데, 이 계정들은 로그인을 하더라도 쉘 사용이 불가능한 계정이다. 필자가 user4 계정에 nologins 쉘을 부여하여 계정을 만든 뒤, SSH 접속을 진행하면 다음과 같이 Permission Deny라는 오류 문구가 출력된다. 물론, 현재 존재하고 있는 계정도 마찬가지로 로그인이 진행되지 않는다.
하지만, 이미 접속한 계정에 nologins를 부여하더라도, 접속이 튕기거나 하는 일은 벌어지지 않는다. 따라서, nologins 쉘 부여는, 특정 사용자가 악의적인 작업을 반복하는 경우, 다음 접속을 차단하는 용도로 사용할 수 있다.
3. shadow 파일
앞서 잠깐 언급했듯이, shadow 파일은 계정의 비밀번호와 관련이 있는 파일이다. 즉, 비밀번호를 최대한으로 사용할 수 있는 기간은 얼마나 설정할 것인지, 혹은 최소 사용일은 어떻게 할 것인지, 비밀번호의 만료일 및 만료일 며칠 전에 사용자에게 만료일이 언제라고 알려줄 것인지 등등등에 대해 설정하는 파일이라고 보면 된다. passwd와 마찬가지로 텍스트파일이기 때문에 cat 명령어로 내용 확인이 가능하다.
필자는 새로 만든 계정 4개에 대한 정보만을 확인하기 위해, 다음과 같은 명령어를 사용했다.
출력 결과물이 상당히 긴데, 이는 두 번째 필드에 위치한 값 때문이다. 이 값은 각 계정의 암호가 SHA512라는 암호화 알고리즘으로 암호화된 결과다. 특이한 것은 각 계정에 부여한 비밀번호가 "123"으로 동일함에도 불구하고, 암호화된 값이 모두 다르다는 점이다. 이렇게 암호화되어 있는 암호 정보로 인해, 계정 ID가 탈취되더라도 비인가자의 접속을 어느정도는 지연시킬 수 있게 된다.
간혹, 이 두 번째 필드가 *로 표시되는 경우가 있는데, 이는 해당 계정의 접속을 막아두었다는 것을 의미한다.
세 번째 필드값은 비밀번호를 설정한 날을 의미한다. 응??? 날짜가 아닌데요? 그게 아니라, 리눅스는 일반적인 날짜 포맷 외에도, 1970년 1월 1일을 기준으로 현재까지 며칠이 지났는지를 계산함에 따라 오늘의 날짜를 알아낼 수 있는 기능이 있다(사실 리눅스 외의 다른 운영체제도 마찬가지다. 가끔씩 엑셀에서 날짜 잘못쳤을 때, 어떤 값이 나오는지 생각해보자). 따라서 18226이라는 숫자는, 오늘이 1970년 1월 1일부터 18226일이 지난 2019년 11월 26일이라는 소리다...
네 번째와 다섯 번째 필드는, 비밀번호 설정 후, 최소 사용일과 최대 사용일을 지정하는 칸이다. 최소 사용일이란, 비밀번호 설정 후, 다시 변경하기 위해 지나야하는 최소 일수를 말한다. 만약 이 기간이 7일로 설정되어 있다면, 비밀번호를 변경한 뒤, 7일 동안은 변경한 비밀번호 외의 다른 것은 사용할 수 없다. 최대 사용일은 반대로, 한 번 설정된 비밀번호를 최대 사용일 이상 사용할 수 없음을 말한다. 일반적인 기업에서는 비밀번호의 최대 사용일을 90일로 지정한다.
위의 예시에서는 최소 사용일이 0, 최대 사용일이 99999일로 되어 있는데, 이는 최소 사용일은 설정되지 않았으며, 최대 사용일은 거의 무한대에 가깝게 사용 가능함을 의미한다. (18226일이 40년에 가까운 시간임을 기억하자... 물론 리눅스가 100년 후에도 살아있다면 해당 비밀번호도 바꿔야 할 것이지만)
여섯 번째 필드는, 비밀번호가 만료되기 며칠 전에, 사용자에게 비밀번호 만료에 대한 공지를 할 것인지 지정하는 필드다. 디폴트 값으로 7일이 설정되어 있다. 0으로 설정하면 비밀번호 만료일이 다가오더라도 어떠한 공지를 주지 않는다. 만료된 비밀번호는 일정 기간동안 사용이 불가능하기 때문에, 일반적으로 이 필드 값을 0으로 지정하는 경우는 없다고 보면 된다.
일곱 번째 필드는 로그인 접속차단 일수를 나타낸다. 만료된 비밀번호는 파기되며, 로그인 접속 차단 일수에 따라 계정이 비활성되는 기간이 정해지게 된다.
여덞 번째 필드는 계정 자체가 만료되는 기간을 지정하는 필드다. 이 필드 값의 포맷은 "월/일/연도"로 나타난다. 지정한 일자가 지나면, 비밀번호와 관계 없이, 해당 계정 자체의 사용이 불가능해진다.
지금까지 확인한 내용들은, 새 사용자를 생성하는 과정에서(useradd 명령어), 적절한 옵션을 주면 즉시 반영되는 내용이다. 하지만, 그 많은 옵션을 다 외우고 다닐 수 있는 사람은 거의 없다고 보면 된다. 게다가, passwd와 shadow 파일을 수정함으로써, 각 계정의 설정값을 변동할 수 있기 때문에, 일반적으로 명령어를 사용한 설정은 거의 사용하지 않는다. 하지만, 필자 입장에서는, 설정 파일을 직접 편집하는 것보다, 명령어를 사용하는 것이 훨씬 안전하다고 생각하기 때문에, 만약 새 사용자를 생성하는 과정에서 해당 설정 값을 변경해야 할 일이 생긴다면, useradd --help 명령어를 통해 일부 옵션을 살펴볼 것을 권고한다.
ps: 위의 사진 때문에 표를 만들지 않아도 되어, 너무 기쁘다.
FIN.
'IT Security > LINUX Basic' 카테고리의 다른 글
10. Linux - 파일 및 폴더 권한 및 소유주 지정하기 (0) | 2019.12.01 |
---|---|
9. Linux - 로컬 계정 생성 시, 설정 관리하기(login.defs 파일) (0) | 2019.12.01 |
7. LINUX - 루트(/)의 하위 폴더 역할 (0) | 2019.08.24 |
6. LINUX - 사용자 계정 생성 및 삭제 (0) | 2019.08.24 |
5. LINUX - 파일 보관을 위한 압축/해제, tar (0) | 2019.08.11 |
댓글