본문 바로가기
Security

SMACK 적용 후 테스트 방법

by 누워서 코딩 2023. 2. 27.

SMACK(Simplified Mandatory Access Control System)은 필수 액세스 제어의 간소화된 버전을 제공하는 Linux 보안 모듈입니다. 이번 포스팅에서는 구현 후 SMACK을 테스트하는 방법에 대해 설명합니다.

 

SMACK을 사용하는 이유는 무엇인가?

SMACK은 다른 액세스 제어 메커니즘에 비해 몇 가지 이점을 제공합니다. 첫째, 사용 및 구성이 쉽습니다. 복잡한 정책이 필요한 다른 액세스 제어 메커니즘과 달리 SMACK은 쉽게 이해하고 관리할 수 있는 레이블을 사용합니다. 둘째, 높은 수준의 보안을 제공합니다. SMACK은 커널 수준에서 정책을 시행하도록 설계되어 공격자가 보안 조치를 우회하기 어렵습니다. 마지막으로 SMACK은 가볍고 오버헤드가 낮아 시스템 성능에 영향을 미치지 않습니다.

 

SMACK 테스트

구현 후 SMACK 테스트는 SMACK이 올바르게 작동하고 예상 수준의 보안을 제공하는지 확인하는 데 중요합니다. SMACK을 테스트하는 방법에는 여러 가지가 있으며 아래에서 자세히 설명합니다.

1. SMACK 정책 테스트

SMACK 테스트의 첫 번째 단계는 정의된 정책을 테스트하는 것입니다. SMACK 정책은 파일, 프로세스 및 사용자에 첨부된 레이블을 사용하여 정의됩니다. 정책을 테스트하기 위해 테스트 파일 및 프로세스를 생성하고 레이블을 할당할 수 있습니다. 그런 다음 다른 사용자를 사용하여 이러한 파일 및 프로세스에 액세스를 시도하고 정책에 따라 액세스가 허용되는지 또는 거부되는지 확인할 수 있습니다.

예를 들어 "secret" 레이블이 있는 파일에 대한 액세스를 제한하는 정책을 정의했다고 가정해 보겠습니다. "secret" 레이블이 있는 테스트 파일을 만들고 다른 사용자를 사용하여 액세스를 시도할 수 있습니다. 올바른 레이블이 있는 사용자에게 액세스 권한이 부여되고 레이블이 없는 사용자에게는 액세스가 거부되면 정책이 올바르게 작동하는 것입니다.

2. SMACK 적용 테스트

SMACK 테스트의 다음 단계는 정책 시행을 테스트하는 것입니다. SMACK 정책은 커널 수준에서 적용되므로 사용자나 프로세스가 무시할 수 없습니다. 적용을 테스트하기 위해 다른 방법을 사용하여 SMACK 정책에 의해 제한되는 리소스에 액세스를 시도할 수 있습니다.

예를 들어 "secret" 레이블이 있는 파일에 대한 액세스를 제한하는 정책을 정의했다고 가정해 보겠습니다. "unconfidential" 레이블이 있는 프로세스와 같이 올바른 레이블이 없는 프로세스를 사용하여 파일 액세스를 시도할 수 있습니다. 액세스가 거부되면 집행이 올바르게 작동하는 것입니다.

3. SMACK 통합 테스트

SMACK 테스트의 마지막 단계는 시스템의 다른 구성 요소와의 통합을 테스트하는 것입니다. SMACK은 SELinux 보안 모듈 및 AppArmor 액세스 제어 프레임워크를 포함하여 Linux 시스템의 여러 구성 요소와 통합됩니다. 통합을 테스트하기 위해 SMACK 및 다른 액세스 제어 메커니즘 모두에 의해 보호되는 리소스에 액세스를 시도할 수 있습니다.

예를 들어 SMACK 및 AppArmor를 사용하여 레이블이 "secret"인 파일에 대한 액세스를 제한하는 정책을 정의했다고 가정해 보겠습니다. SMACK 및 AppArmor 모두에 대해 올바른 레이블이 없는 프로세스를 사용하여 파일에 액세스를 시도할 수 있습니다. 액세스가 거부되면 통합이 올바르게 작동하는 것입니다.

 

SMACK 테스트 예제 코드

#include <stdio.h>
#include <fcntl.h>
#include <smack.h>

int main(int argc, char **argv)
{
    char *filename = "test_file";
    int fd;

    // Create the test_file
    fd = open(filename, O_CREAT|O_WRONLY, 0644);
    if (fd < 0) {
        printf("Error creating file\n");
        return 1;
    }

    // Set the SMACK label for the file
    smack_set_label(filename, "secret");

    // Try to read the file as a user without the correct label
    setuid(1001); // set the user ID to a user without the "secret" label
    if (access(filename, R_OK) < 0) {
        printf("Access denied\n");
    } else {
        printf("Access granted\n");
    }

    // Try to read the file as a user with the correct label
    setuid(1000); // set the user ID to a user with the "secret" label
    if (access(filename, R_OK) < 0) {
        printf("Access denied\n");
    } else {
        printf("Access granted\n");
    }

    // Clean up the test file
    close(fd);
    unlink(filename);

    return 0;
}

이 코드는 "secret" 레이블이 있는 테스트 파일을 만든 다음 두 개의 서로 다른 사용자 ID를 사용하여 파일 읽기를 시도합니다. 첫 번째 사용자 ID에는 "secret" 레이블이 없으므로 액세스가 거부되어야 합니다. 두 번째 사용자 ID에는 "secret" 레이블이 있으므로 액세스 권한이 부여되어야 합니다.

SMACK 정책을 테스트하기 위해 SMACK이 활성화된 시스템에서 이 코드를 컴파일하고 실행할 수 있습니다. 레이블에 따라 액세스 권한이 올바르게 부여되고 거부되면 정책이 올바르게 작동하는 것입니다.

 

SMACK의 다른 글 보기

SMACK 넌 도대체 무엇이냐~~!

SMACK의 기본 원리를 이해 하자~!

댓글