컴퓨터에 여러 사용자의 계정이 존재하고, 각 사용자가 이 컴퓨터를 공유하여 업무를 진행한다고 가정해보자. 그리고 많은 사용자 중 일부가 함께 협업 프로젝트를 진행하게 되어, 파일을 공유해야 할 일이 발생했다고 생각해보자.
각자 사용자가 만들어 낸 파일은 소유자와 소유 그룹이 사용자 자신의 ID와 그룹명으로만 표시된다. 그리고, 일반적으로 생성된 파일은 644 권한을, 폴더는 755 권한을 가지게 된다. 이렇게 될 경우, 프로젝트와 관계없는 사람들도 해당 파일과 폴더 내용을 확인(r, 폴더의 경우 ls 명령어로 내부 파일 리스트를 확인하는 것이 가능하다)하는 것이 가능하기 때문에 프로젝트를 진행하면서 보안상의 문제가 발생할 가능성이 매우 높다.
그렇다고 각 사용자가 만들어낸 파일의 퍼미션 중 other 권한을 000으로 돌려버리자니, 같이 프로젝트를 진행하는 팀원들마저 이 파일을 읽을 수 없게 되는 상황이 발생한다. SetUID를 설정하는 것 역시, 프로젝트 관계자가 아닌 타인에게 노출될 우려가 있기 때문에 사용하기는 어렵다.
리눅스 사용자 중 일부가 자신들이 만들어낸 생성물을 공유해야 할 경우가 종종 생기는데, 지금까지 잠깐씩 언급하면서 넘어갔던 "사용자 그룹 관리"를 이용하면 외부인에게 정보 노출없이 작업이 가능해진다.
그룹은 사용자 일부를 하나의 묶음으로 관리할 수 있도록 만들어준다. 따라서 파일이나 폴더의 소유 그룹이 TEST라고 지정되어 있다면, 이 TEST 그룹에 속하지 않은 사람들이 파일에 접근하거나 조회하는 것을 매우 쉽게 차단할 수 있다. 하나씩 살펴보자.
1. groupadd, groupdel 명령어
사용자를 하나의 그룹으로 묶기 위해서는 사용자를 담을 수 있는 "바구니", 즉 그룹이 먼저 생성되어야 한다. 그룹의 생성은 groupadd 명령어로 진행하며, 포맷은 다음과 같다.
=========================
groupadd {생성 그룹명}
=========================
group과 관련된 명령어는 user 관련 명령어와 마찬가지로, root만이 접근할 수 있는 권한을 가지고 있다. 따라서 sudoer에 등록된 계정으로 해당 작업을 진행할 경우 sudo를 함께 사용하여 그룹을 추가해주면 된다.
그룹 생성 시, 그룹에서 사용할 비밀번호를 지정할 수 있는데, groupadd 명령어를 사용할 때, 옵션으로 -p {사용할 비밀번호}를 입력하거나, 그룹 생성 후, gpasswd {그룹명}으로 비밀번호를 설정할 수 있다. 일반적으로 gpasswd 명령어로 비밀번호를 지정해주는데, 그 이유는 groupadd -p 명령어로 암호를 지정할 경우, 암호가 shadow 파일에 암호화되지 않은 상태로 기록되기 때문이다.
생성된 그룹을 삭제하는 명령어는 groupdel 명령어이다. groupadd와 사용 방법은 동일하다.
==========================
groupdel {삭제할 그룹명}
==========================
2. 생성된 group의 확인.
생성된 그룹의 확인 방법은 cat 명령어를 통해 /etc/group 파일을 확인하면 된다. 생성된 사용자를 /etc/passwd에서 관리하는 것과 마찬가지로, 생성된 그룹은 /etc/group 파일에서 관리한다. 위의 사진의 아랫부분을 참고하자.
/etc/group 파일의 내용은 사용자 계정에 대한 정보를 담는 /etc/passwd와 유사하지만, 필드 숫자가 조금 더 적게 존재한다. 각 필드는 순서대로 "그룹명":"암호(X)":"GID":"그룹 사용자" 값을 가진다.
사용자와 마찬가지로 그룹 역시 그룹 암호를 지정할 수 있는데, 이 암호에 대한 정보는 /etc/gshadow 라는 파일에 저장된다. /etc/gshadow 파일의 내용은 아래와 같다.
사용자 계정 암호와 관련된 /etc/shadow보다는 조금 더 간단한 형태를 보이는데, 각 필드는 순차적으로 "그룹명":"암호화된 비밀번호":"그룹 관리 계정":"그룹에 포함된 사용자" 값을 가진다.
3. 그룹에 사용자 추가 및 삭제하기
이제 생성된 그룹에 사용자를 추가해야 할 차례다. 그룹에 사용자를 추가하는 방법은 크게 두 가지가 있다. groupmems 명령어를 사용하거나, gpasswd를 사용하는 방법이 있는데, 각각의 사용법은 아래와 같다.
================================
groupmems -g {그룹명} -a {추가할 사용자계정}
gpasswd {그룹명} -a {추가할 사용자계정}
================================
어느 방법을 사용하더라도, 그룹에 사용자 추가는 문제없이 잘 이루어짐을 확인할 수 있다.
만약 추가한 사용자를 삭제하고자 한다면, -a 옵션만 -d로 살짝 바꿔주면 된다.
================================
groupmems -g {그룹명} -d {추가할 사용자계정}
gpasswd {그룹명} -d {추가할 사용자계정}
================================
4. 그룹 권한으로 파일 접근 확인하기
현재 필자의 리눅스에는 user1~user5 까지의 사용자가 존재하며, mngt_users라고 불리는 그룹을 하나 만들어 user1부터 user3까지 해당 그룹에 추가하는 작업을 진행했다. 이제 필자는 sudo 명령어를 이용하여, 소유주와 소유 그룹이 root인 grouptest라는 이름의 폴더를 생성할 것이다. 퍼미션은 other 권한을 모두 박탈한 상태로 말이다.
이렇게 될 경우, root를 제외한 나머지 일반 계정은 grouptest 폴더에 접근하는 것은 물론, 내부 내용을 확인하는 것도 불가능해진다. 하지만, 필자가 해당 폴더를 mngt_users로 소유 그룹을 변경한다면, 이 그룹에 포함된 일반 사용자 user1, user2, user3은 아무런 문제없이 해당 폴더의 내용을 확인하는 것이 가능해진다.
이를 확인하기 위해, root 계정으로 grouptest폴더 밑에 2개의 파일을 만들고, user1 계정으로 해당 파일이 grouptest 폴더에 존재하는지 확인해보았다.
user1의 경우 grouptest폴더의 소유자는 아니지만, 소유 그룹에 포함된 계정이기 때문에, rwx 권한을 모두 가지고 있다. 따라서 해당 폴더 내에 root가 생성한 파일에 대한 정보를 확인하는 것도 가능하다.
반대로, mngt_users에 포함되지 않은 user4나 user5의 경우, grouptest 폴더에 접근하지 못하고 허가 거부가 되는 상황이 발생한다. 이들 계정은 그룹에 포함되지 않았기 때문에 other 권한의 영향을 받는데, 위에서 보다시피 other에는 아무런 권한이 없기 때문에 접근조차 불가능한 것이다.
하지만, 현재같은 상황에서 mngt_users에 포함된 모든 계정이 grouptest 폴더에 접근이 가능하더라도, root가 만들어 낸 파일의 내용을 확인하는 것은 불가능하다. 우선 root가 만들어 낸 파일의 소유 그룹이 root로 지정되어 있을 뿐더러, other 권한 역시, 아무것도 주어지지 않았기 때문이다. 따라서 해당 그룹에 속한 계정들이 파일의 내용을 확인할 수 있도록 하기 위해서는, 해당 파일의 소유 그룹도 변경해주어야 할 필요가 있다.
각 파일의 권한 및 소유 그룹을 변경하고, file1에 확인을 위한 의미없는 내용을 추가하였다. 이제 다시 mngt_users 그룹에 속한 계정 중 하나인 user1로 접속하여, 해당 파일 내용을 확인해보면 아래와 같이 제대로 출력되는 것을 확인할 수 있다.
user1의 경우, 자신이 속한 mngt_users 그룹에 rwx 권한이 있기 때문에 root 소유의 grouptest 폴더에 자신의 파일을 만드는 것도 가능하다.
보통 그룹에 속한 사용자의 경우, 해당 폴더에 파일을 생성할 경우, 소유 그룹은 자기 자신의 계정과 동일한 이름으로 지정된다. 따라서 해당 파일의 내용을 user1이 아닌 다른 그룹 계정이 확인하려고 시도한다면 아래와 같이 허가 거부가 되는 것을 확인할 수 있다.
5. newgrp 명령어로 그룹에 속하지 않은 계정의 접근 허용하기
만약, 이 프로젝트에 일시적으로 참여를 해야 하는 사람이 생겼다고 가정해보자. 예를 들면 임원 한 분이 이 프로젝트의 파일 내용 중 일부 수정 사항을 자신이 직접 수정하는 경우가 생겼다고 말이다(실무자는 바빠서 이 업무를 할 수 없는 상황이라고 가정하자).
보통 이런 상황이라면 임원의 계정을 그룹에 추가하고, 임원 분이 작업이 끝난 직후 그룹에서 계정을 삭제해 주면 되는데... 정말 극단적으로 생각했을 때, 임원이 산업 스파이고, 계정 담당자가 이 임원 계정을 그룹에서 삭제하는 것을 깜빡했다면...? 참 재미있는 상황이 연출될 것이다(시나리오 작가나 해볼까...).
따라서, 이런 경우, 해당 폴더에 단 한 번만 접속할 수 있도록 허용할 수 있는 명령어를 사용하면 좋은데, 여기에 사용하는 명령어가 newgrp이라는 명령어이다. newgrp은 해당 그룹에 속하지 않은 사용자가 일시적으로 폴더나 파일에 접근하고자 할 때, 사용할 수 있는 명령어다. 사용 방법은 아래와 같다.
===========================
newgrp {접속할 계정명}
===========================
참고로, 해당 그룹에 암호가 설정되어 있지 않은 경우, newgrp 명령어로 그룹에 속해있지 않은 사용자가 접속하는 것이 불가능하다. 그리고 보통 이런식으로 그룹에 접속하는 경우, 그룹 관리자가 직접 그룹 암호를 타이핑함으로써, 해당 폴더와 파일을 안전하게 관리한다.
user5는 분명 mngt_users 그룹에 속해있지 않은 계정임에도 불구하고, newgrp 명령어로 그룹 접속을 정확히 진행하자 grouptest 폴더와 하위 파일에 접근하는 것이 가능해진다(물론, user1_1파일의 내용 확인은 여전히 불가능하다). 심지어 이 폴더에 자신이 직접 파일을 만드는 것도 가능하다. 왜냐하면 소유 그룹의 권한 중 w가 존재하고 있기 때문이다.
하지만 그룹 소속 계정과 달리, 생성된 파일의 소유 그룹은 항상 mngt_users가 디폴트 값으로 지정되게 된다는 차이점이 있다. 물론, 파일 생성 후 소유 그룹을 자기 자신의 계정명과 동일하게 변경하는 것도 가능하긴 하다(하지만 그룹 관리자나 폴더 소유자가 이를 허락할지는...).
newgrp 명령어로 접속한 그룹을 벗어나기 위해서는 exit 명령어를 입력해주면 된다. 하지만, 그룹 접속을 벗어난 뒤에는, 폴더 자체에 접근이 불가능하기 때문에 자신의 파일조차도 확인할 수 없게되는 아이러니가 펼쳐지게 된다.
지금까지 사용자 그룹 관리 및 관련 명령어와 파일에 대해 살펴보았다. 사실 리눅스와 관련된 서적 중에서도 왠만큼 두꺼운 서적이 아니고서는 group과 관련된 이야기는 간략히만 서술하고 넘어가는 통에, 실무에서는 잘 사용하지는 않는 듯 하다. 하지만, 필자가 나름대로 정보를 찾고 실습을 진행해 본 결과로는, 이 그룹 명령어를 잘만 사용할 줄 안다면 사용자 관리뿐만 아니라, 자체적인 스크립트 작성 등에도 상당히 도움이 될 수 있겠다는 생각이 든다.
마지막으로 사용자 그룹과 관련된 명령어 및 파일들을 간략히 정리하면서 이번 포스팅을 마무리한다.
명령어 | 옵션 | 설명 |
groupadd {생성할 그룹명} | 그룹 생성 | |
-p {PASSWORD} |
그룹 생성 시, 암호 설정 (일반적으로 사용하지 않음) |
|
groupdel {삭제할 그룹명} |
존재하는 그룹 삭제 |
|
groupmems -g {그룹명} -a {사용자명} gpasswd {그룹명} -a {사용자명} |
그룹에 사용자 추가 | |
groupmems -g {그룹명} -d {사용자명} gpasswd {그룹명} -d {사용자명} |
그룹에서 사용자 삭제 | |
groupmod {옵션} {그룹명} | 그룹 관련 설정 변경 | |
-p {PASSWORD} | 암호화된 암호 설정 | |
newgrp {그룹명} |
그룹에 속하지 않은 사용자가 그룹에 일시적으로 접속하고자 할 때 사용함 (그룹 암호가 설정되어 있어야 함) |
|
/etc/group |
그룹 리스트, GID, 그룹 멤버 정보를 포함하는 파일 |
|
/etc/gshadow |
암호화된 그룹 암호, 그룹 관리계정 및 그룹 멤버 정보를 포함하는 파일 |
FIN.
'IT Security > LINUX Basic' 카테고리의 다른 글
15. 리눅스 IP 확인 및 원격 접속 (0) | 2020.03.31 |
---|---|
14. Linux - 리다이렉션(Redirection)을 이용한 표준 입출력 변환 (0) | 2020.03.03 |
12. Linux - Sudo 명령어 및 sudoers 파일 (0) | 2019.12.05 |
11. Linux - Umask, Set UID, Set GUI, sticky bit (0) | 2019.12.01 |
10. Linux - 파일 및 폴더 권한 및 소유주 지정하기 (0) | 2019.12.01 |
댓글