소개

우분투와 다양한 리눅스 배포판에서는 sudo 명령을 통해 특정 관리 작업을 위임할 수 있는 강력한 기능을 제공한다. 그러나 특정 사용자가 "sudo su - <사용자명>" 명령을 실행하지 못하도록 막아야 하는 상황이 발생할 수 있다. 이로 인해 권한이 무단으로 상승되어 접근해서는 안될 수준으로 확대될 수 있다. 이 글에서는 권한을 상승시키지 않으면서 허가된 사용자에게는 sudo 기능을 허용할 수 있는 구체적인 접근통제 방법을 설명한다.

사용자 지정 구성 이해

간단히 말해 해결하고자 하는 방향은 특정 사용자가 "sudo su - <사용자명>" 명령을 실행하는 것을 제한하도록 사용자 지정 sudoers 구성을 사용하는 것이다. sudo visudo 명령을 사용하여 다음과 같이 설정한다.

visudo 의 기본 에디터를 vi로 바꾸려면 sudo visudo로 열린 파일 최 상단에 Defaults editor=/usr/bin/vim 이 내용을 포함 하면 된다. export EDITOR=vim나 export VISUAL=vim 을 rc 파일에 넣어 두는것은 동작하지 않는다.

%heros ALL=(ALL) ALL,NOPASSWD: /bin/apt-get install, /bin/systemctl start, /bin/systemctl stop, !/bin/su

이 줄은 "heros" 그룹의 사용자가 특정 명령을 비밀번호를 요구하지 않고 실행할 수 있도록 허용한다. 또한 su 명령을 사용을 불허한다.
이후부터는 아래와 같은 코드를 실행함으로써,sudo su를 막아야하는 linux 계정(사용자ID)을 heros group에 넣어 주면 간단히 처리할 수 있다.

sudo usermod -aG heros <사용자ID>

해결책 실행: 스크립트

이 계획을 구체적으로 실현하기 위해 전체적인 쉘 스크립트를 작성해보겠다. 이 스크립트는 프로세스를 단순화해 통제되고 일관된 실행을 보장한다. 이 스크립트를 파일에 저장하고 실행 권한을 부여하자 (예: (chmod +x user_sudo_restrict.sh , chmod 755 user_sudo_restrict.sh).
새로운 사용자를 추가할 때 아래 코드를 실행하면 된다.

#!/bin/bash

# Check if mandatory parameters are provided
if [ -z "$1" ] || [ -z "$2" ]; then
    echo "Usage: $0 <group_name> <username>"
    echo "Please provide the group name and username as parameters."
    exit 1
fi

# Assign the provided parameters to variables
grpname="$1"
username="$2"

# Step 1: Add User
echo "Step 1: Adding User..."
sudo adduser $username
echo "User '$username' added successfully."

# Check if the group exists, if not, add it
if ! grep -qE "^$grpname:" /etc/group; then
    echo "Group '$grpname' does not exist. Adding..."
    sudo addgroup $grpname
    echo "Group '$grpname' added successfully."
fi

# Step 2: Set Proper Group and Permission
echo "Step 2: Setting Proper Group and Permission..."
sudo usermod -aG $grpname $username
echo "User '$username' added to the '$grpname' group."

# Step 3: Apply Configuration
echo "Step 3: Applying Configuration..."
# Check if custom configuration is present in sudoers
if ! sudo grep -qF "%$grpname ALL=(ALL) ALL,NOPASSWD: /bin/apt-get install, /bin/systemctl start, /bin/systemctl stop, !/bin/su" /etc/sudoers; then
    # Step 3: Apply Configuration
    echo "Step 3: Applying Configuration..."
    echo "%$grpname ALL=(ALL) ALL,NOPASSWD: /bin/apt-get install, /bin/systemctl start, /bin/systemctl stop, !/bin/su" | sudo tee -a /etc/sudoers > /dev/null
    echo "Configuration applied."
fi

# Step 4: Test Proper Functionality
echo "Step 4: Testing Proper Functionality..."
echo "Attempting to switch user with 'sudo su - $username':"

# Test sudo apt-get install
echo "Trying 'sudo apt-get install'..."
sudo -u $username sudo apt-get install nano

# Test sudo systemctl start
echo "Trying 'sudo systemctl start'..."
sudo -u $username sudo systemctl start cron

# Test sudo systemctl stop
echo "Trying 'sudo systemctl stop'..."
sudo -u $username sudo systemctl stop cron

echo "Sudo permission test completed for '$username'."


# Step 5: Rollback
read -p "Do you want to rollback these user settings? (yes/No): " rollback_choice
if [ "$rollback_choice" == "yes" ]; then
    echo "Rolling Back..."
    sudo deluser $username $grpname
    sudo sed -i "/%$grpname ALL=(ALL) ALL,NOPASSWD: \/bin\/apt-get install, \/bin\/systemctl start, \/bin\/systemctl stop, !\/bin\/su/d" /etc/sudoers
    echo "Rollback completed. User '$username' removed from '$grpname' group and configuration removed."
else
    echo "No rollback performed. User settings kept intact."
fi

echo "Script completed."

결론

sudoers 구성을 간편하게 설정함으로써 "sudo su - <사용자명>" 명령을 통한 무단 권한상승을 방지할 수 있다. 이 접근 방식은 다른 허가된 사용자의 기능에 영향을 미치지 않으면서 보안성을 유지할 수 있다.

그렇지만 이 스크립트는 root권한에서 실행해야하는 명령어를 많이 사용하는 만큼 시스템 구성에 영향을 주는 스크립트는 신중하게 실행해야 한다. 상용 시스템에서는 실제 사용하기 전에 반드시 통제된 환경(virtualbox같은 추가 리눅스 환경등)에서 테스트를 반드시 진행하여 안전하게 사용하길 바란다.

profile
개발하면서 또는 프러덕 관리하면서 겪는 기억해둬야하는 내용을 메모장 삼아 남긴다. Google Keep이나 메모 도구에 남기는 것과는 달리 잘 정리할 수 있어서 언젠가 들춰봐야할 내용들을 담은 글들이 게시된다.

0개의 댓글