selinux를 리눅스 우분투에 설치하는 것은 매우 쉽다.

하지만 한가지 명심 해야하는 것은 selinux의 차단률이 매우 높기 때문에 apt (Advanced Packaging Tool : 우분투의 고급 패키지 관리 툴)가 enforcing 상태에서는 제대로 동작하지 않는 다는 것이다.


만약 패키지 설치가 필요하다면 selinux의 상태를 enforcing에서 'permissive'로 바꾸어 주어야 마땅하다.

만약 그렇지 않다면 apt postinst(패키징 설치시 동작하는 필요 스크립트)가 제대로 작동 하지 못하고 리턴 오류가 연달아 발생할 것이다.

리눅스 우분투에서의 설치 방법은


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 일반 레파시토리에서 selinux를 설치 한다.


user@user-test:~$ sudo apt install selinux


-> 콘솔창에서 사용권 계약에 대한 내용이 뜨면 '동의(Agree)'


// 하위 스크립트 오류 발생하니 dpkg --configure로 잡아줌


user@user-test:~$ sudo dpkg --configure -a


// 재부팅 한다.


user@user-test:~$ sudo reboot


// 재부팅 후 selinux가 enable (자동 양호) 상태인지를 확인한다.


user@user-test:~$ sestatus

    {
    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             ubuntu
    Current mode:                   permissive
    Mode from config file:          permissive
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      30
    }
-> 상황목록이 위와 같이 제대로 뜨면 정상적으로 설치된 것이다.

// enforcing 으로 전환을 테스트 한다.

user@user-test:~$ sudo setenforce 1
user@user-test:~$ sestatus
    {
    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             ubuntu
    Current mode:                   enforcing
    Mode from config file:          permissive
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      30
    }
-> 여기까지 했다면 귀하의 pc에는 selinux가 정상적으로 설치되고 작동 되고 있는 것이며 'setenforce 1' 명령으로 currunt mode가 'permissive'에서 'enforcing'으로 바뀐 것을 확인 할수가 있다.


     
하지만 명심해야 하는 것은 selinux가 깔려 있다고 해서 부팅시 곧바로 고급 차단 정책인 'enforcing'이 바로 작동 되는 것은 아니며,
permissive에서 enforcing으로 모드를 바꿔저야 완전한 차단 정책이 적용 되는 것이다.

뿐만 아니라 또 앞서 말했듯이 소프트웨어를 설치 하는 과정인 apt를 활용 하려면 'permissive' 로써 정책을 변경해 줘야만 한다.


enforcing -> permissive 변경 하는 방법



-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>


user@user-test:~$ sudo setenforce 0 




영상을 통하여 확인해 보도록 하자.



도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         






중급 이상의 c언어 프로그래밍 개발자라면 파일 시스템의 활동 상태를 감시할수 있는 inotify 함수 응용에 대해서 알고 있을 것이다. 

본 포스팅은 리눅스에서 inotify를 응용한 C언어 코딩과 그 안의 시스템 함수를 응용 하여 쉘 컨트롤을 중첩 활용한 '디펜드 파일시스템 '를 설계하고 구현해 보고 '파일 시스템 방어 구축'에 관한 그 가능성을 짚어 보도록하는 데에 그 취지가 있다. 

우선 전체적인 원리는 단순하다.


글씨를 참 못쓴다. 누가 보면 초딩인줄 알겠다..... 참 나는 전자펜 으로 그리는 데에는 아직(?) 재주가 없다. 



중요한 것은 본 프로그래밍 가이드에 필요한 모듈에 필요한 함수가 의외로 많다는 것이고 특별한 헤더에는 "sys/inotify.h(파일 시스템 감독)" , "setjmp.h(지점 "sys/types.h (타입 파악)" 이 있다.

자 그렇다면 본격적인 프로그래밍을 해보도록 하자.

                 Source_File name : dfs.c             |             Type : C                  |                        |           


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define _Event_		( sizeof (struct inotify_event) )	/* Inotify 함수의 이벤트 처리를 위한 전처리 지정 */
#define Buffer_size	( 1024 * ( _Event_ + 64 ) )

jmp_buf point;	/* setjmp 모듈을 활용할 변수 지정 */

int main( int argc, char **argv ) {
	setjmp(point);	/* setjmp 함수 당 포인트를 셋팅 한다. */
	FILE *Write_file;	/* 로그 파일을 기록하기 위한 변수 선언 */

	char Fs_Path[4092]; /* 감시할 파일 경로를 입력받을 변수 */
	strcpy(Fs_Path, argv[1]);
	
	int ii;		/* 각 버퍼 사이즈 비교 대입 값을 위한 변수 */
	
	int Inotify_Buff; /* inotify 함수를 대입할 고정 버퍼값을 위한 변수 */
	
	char buffer[Buffer_size];	
	
	ii = inotify_init();	/* inotify 모듈을 초기화 로드 한다. */
	
int Back_Target() {
		char cpcon[2048] = "cp -rf ", bakpath[] = " /tmp/bak_path"; 	/* 파일 백업을 만들 변수 */
		system("rm -rf /tmp/bak_path");
		strcat(cpcon, Fs_Path);
		strcat(cpcon, bakpath);
		system(cpcon); /* 타겟 파일 백업을 만든다. */
	}
int syscon() {		/* 이벤트 발생시 해당 파일을 복원할 파일 시스템 제어 기초 함수 설계 */ 
		
		/* 시작 기존의 백업 파일을 삭제 */
		
		char Remove_Target[2048] = ("rm -rf ");		
		strcat(Remove_Target, Fs_Path);
		system(Remove_Target);
		
		/* 완료 기존의 백업 파일을 삭제 */
		
		/* 시작 변동시 복원을 위한 작업 */
		
		char Restore[2048] = "cp -rf /tmp/bak_path ";
		strcat(Restore, Fs_Path);
		system(Restore);
		
		/* 완료 변동시 복원을 위한 작업 */
		
		/* 시작 작업 내용 출력 및 시작 로그 기록 */ 
		
		Write_file = fopen("dfs.log", "a");
		fprintf(stderr,"\nTarget ' %s ' has restored.\n\n", Fs_Path);
		fprintf(Write_file, "Target ' %s ' has restored.\n\n", argv[1]);
		fclose(Write_file);
		
		/* 완료 작업 내용 출력 및 시작 로그 기록 */
	}


	if (ii < 0) {		/* 버퍼 비교에 의한 inotify 함수 초기화 */
		perror("inotify_init");
	}
	else
	
	system("date -R >> dfs.log; echo Defending_Start >> dfs.log");	/* 날짜 출력과 함께 로그 기록을 생성하고 시작 (존재 할시 이어서 기록한다. */
	
	if (argc < 2 ) { 	/* 외부 인자 값의 유.무를 파악 하여 작업 선언 */
		printf ("Do not start defend file system... Please running with insert Target path.\n\n BYE~!\n");
		exit (0);
	} else {
	
		if ( access(Fs_Path, F_OK) == -1 ) { /* 타겟 파일의 존재를 파악하여 없다면 종료 시킨다. */
			fprintf(stderr, "Target %s does not exist... to EXIT.", Fs_Path);
			exit (0);
		} 
	
		fprintf (stderr, "Defending start... \n File path = '%s' of systems\nIf you wnat exit to 'CTRL +C'.\n", argv[1]);

		Back_Target();	/* 타깃 파일을 백업 한다. */
	}
	
	Inotify_Buff = inotify_add_watch(ii, argv[1], IN_MODIFY | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO | IN_MOVE_SELF);	/* inotify 각 이벤트 발생에 따른 함수 실행을 위한 변수 지정 */
	
	while(1) {	/* 지정한  타겟 파일에 대한 반복 감시 시작 */ 
		int origin_size, i = 0;
		origin_size = read(ii, buffer, Buffer_size);
		if (origin_size < 0) {
			perror("read");
		}
		
		while ( i < origin_size ) {	/* 이벤트 발생을 위한 반복 수행 */
			struct inotify_event *event = (struct inotify_event *) &buffer[i];	

			fprintf(stderr, "\nVariance check = Wd : %d , Mask : %d , Cookie : %d , Length : %d , Type : %s\n\n", event->wd, event->mask, event->cookie, event->len, (event->mask & IN_ISDIR)?"Directory":"File");	/* 타깃 파일에 대한 변화를 감지 하여 변화된 실제 파일의 타입을 출력하고 로그를 기록한다. */
			
			system("date -R >> dfs.log");
			
			Write_file = fopen("dfs.log", "a");
			
			fprintf(Write_file, "\nVariance check = Wd : %d , Mask : %d , Cookie : %d , Length : %d , Type : %s\n\n", event->wd, event->mask, event->cookie, event->len, (event->mask & IN_ISDIR)?"Directory":"File");	/* 변화된 사항과 만일 타깃 디렉터레에 추가된 사항이면 그것이 어떤 타입인지 확인 */
			
			fclose(Write_file);

			if (event->mask & IN_CREATE) {	/* 타깃 디렉터리에서 파일이나 디렉토리가 생성 되었을 경우 이벤트 처리 */
			
				printf("\n %s was created. at Watching in Target Directory.\n\n", event->name);
				
				/* 시작 출력과 출력 로그를 기록한다. */
				
				Write_file = fopen("dfs.log", "a");
				fprintf(Write_file, "\n %s was created in Target Directory. \n\n", event->name);
				fclose(Write_file);
				syscon();
				}
				
				/* 완료 출력과 출력 로그를 기록한다. */
				
			else if (event->mask & IN_DELETE || IN_DELETE_SELF) {	/* 타깃에 삭제가 발생할 경우 이벤트 처리 */

				printf(" %s was deleted at Watching Target.\n", event->name);
						
				Write_file = fopen("dfs.log", "a");
				fprintf(Write_file, " %s was deleted at Watching Target. \n", event->name);
				fclose(Write_file);
				syscon(); 
				}
				
			else if (event->mask & IN_MODIFY ) {	/* 타깃에 변동이 발생 되었을 경우 이벤트 처리 */ 

				printf(" %s was modified at Watching Target.\n", event->name);
				Write_file = fopen("dfs.log", "a");
				fprintf(Write_file, "%s was created. at Watching Target of file system.\n", event->name);
				fclose(Write_file);
				syscon(); 
				}

			else if (event->mask & IN_MOVED_FROM || event->mask & IN_MOVED_TO || event->mask & IN_MOVE_SELF) {	/* 타깃에 대한 이동 발생시 이벤트 처리 */

				printf("%s was moved at Watching Target.\n", event->name);
				Write_file = fopen("dfs.log", "a");
				fprintf(Write_file, "%s was moved at Watching Target.\n", event->name);
				fclose(Write_file);
				syscon(); 
				}
			i = 0;
			longjmp(point, 1);	/* jmp 셋팅한 지점으로 다시 되돌아 간다. */
			}
		}
	return 0;
	}



코딩이 완료 되었으면 컴파일 하고 실행해 보자.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 해당 파일을 컴파일 한다.


user@user-test:~$ gcc -f dfs dfs.c


// 컴파일된 프로그램을 실행해 본다.


user@user-test:~$ gcc -f dfs dfs.c


Do not start defend file system... Please running with insert Target path.


-> 하지만 코딩 했던것 처럼 인자값이 입력 되지 않으면 종료 된다.



이제 본격적으로 방어 능력을 테스트해 보자.




-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 아무 파일을 만든다.


user@user-test:~$ echo 1 > /tmp/a

 

// 만든 파일을 실행과 함께 인자값으로 지정한다.


user@user-test:~$  ./dfs /tmp/a


Defending start... 
 File path = '/tmp/a' of systems
If you wnat exit to 'CTRL +C'.


-> 라는 문구와 함께 해당 파일에 대한 감시 및 방어를 시작한다.

// 다른 터미널을 열어 만든 파일을 변조해 공격해 보자.


user@user-test:~$ echo 2 > /tmp/a


Variance check = Wd : 1 , Mask : 2 , Cookie : 0 , Len : 0 , Type : File


Target ' /tmp/a ' has restored.

Defending start...
 File path = '/tmp/a' of systems
If you wnat exit to 'CTRL +C'.

->  변경된 속성과 타입 출력, 그리고 복원했다는 메시지가 나온다.


// 정말 복원 되었는지 확인해 보자.


user@user-test:~$ cat /tmp/a


1

-> 아까 입력한 대로 '1' 을 출력하였고 복원에 성공한 것을 확인했다.



그렇다면 이젠 디렉토리 복원을 테스트해 보자.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 먼저 폴더를 만들고 파일 하나도 같이 만들자.


user@user-test:~$ mkdir /tmp/1 ; echo 1 > /tmp/1/2


// dfs로 디렉토리 방어를 시작해 보자


user@user-test:~$ ./dfs /tmp/1

Defending start...
 File path = '/tmp/1' of systems
If you wnat exit to 'CTRL +C'.


// 터미널을 새로 열고 변조를 통해 공격을 시도해 보자.


user@user-test:~$ rm /tmp/1/2


Variance check = Wd : 1 , Mask : 512 , Cookie : 0 , Len : 16 , Type : File


 2 was deleted at Watching Target.

Target ' /tmp/1 ' has restored.

Defending start... 
 File path = '/tmp/1' of systems
If you wnat exit to 'CTRL +C'.


-> 파일 '2'가 삭제 되었고 복원 하였다는 메시지가 출력한다.


// 마찬가지 복원을 확인하자.

user@user-test:~$ cat /tmp/1/2

1


-> 복원 성공을 확인할 수 있다. 



// 이번에는 타겟 폴더에 폴더를 생성해 보자.


user@user-test:~$ mkdir /tmp/1/3

Variance check = Wd : 1 , Mask : 1073742080 , Cookie : 0 , Len : 16 , Type : Directory



 3 was created. at Watching in Target Directory.


Target ' /tmp/1 ' has restored.

Defending start...
 File path = '/tmp/1' of systems
If you wnat exit to 'CTRL +C'.


-> '3' 폴더가 만들어 졌지만 복구 했다는 메세지가 출력 된다.



// 정말 복원 되었는지 확인하자.


user@user-test:~$ cd /tmp/1/3


-bash: cd: /tmp/1/3: 그런 파일이나 디렉터리가 없습니다


-> 정말 만든 폴더가 복원, 방어 되어 존재 하지 않는 것을 확인 할 수 있다. 


이뿐만이 아니라 해당 프로그램은 코드에서 봤다 시피 'dfs.log' 파일에 시간과 함께 작업 모든 기록을 보관 하고 있다.


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 지금까지 작업한 로그 기록을 확인해 보자.


user@user-test:~$ cat dfs.log



이로써 C언어로 설계한 디펜드 파일 시스템이 정상적으로 성능을 발휘 할 수 있는 것을 확인 할 수 있지만 코드를 보아서 알다시피 전지전능한 프로그램은 아니기에 폴더 안의 폴더 안에 발생하는 이벤트를 처리 하지는 못한다. 이를 해결하려면 더 추가적인 코딩이 필요하다.

또 마찬가지 실행시 마다 백업 경로를 단일로 갈아 치우는 단순한 방법을 사용 하기 때문에 이 프로그램을 활용하여 여러 프로세스로 실행해 실제 파일 시스템의 여러 중요 파일들을 한번에 방어 하지 못한다. 마찬가지 실전용으로 만들려면 bash를 적극 활용한 이중 교환적을 요구하는 높은 난이도의 복잡한 추가적 코딩이 요구된다.

하지만 이러한 방식으로 말미앎아 파일 시스템을 직접적으로 방어 할 수 있는 새로운 방식의 보안 시스템을 구축 할 수 있다는 것을 선 보인 좋은 계기가 될 것이며 파일을 변조 및 암호화 하여 비트코인을 달라 하는 랜섬웨어 악성코드 발동도 결과적으로 방어 할 수 있는 이상적 시스템을 구상할 수가 있다.

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린점이 있는 것 같다면 꼭 댓글로 알려 주시면 감사 하겠습니다.



seuper 2세대 개발을 3월 12일 완료 하였습니다. 

seuper는 selinux를 enforcing 모드로 부팅부터 패키지 작업까지 안정화를 시켜주는 어드민용 유틸리티 프로그램 입니다. [설치 바로가기] 

이전 seuper 1세대 (0.1~)은 '/etc/sudoers'를 활용하여 부팅시 enforcing으로 동작하고 dpkg등 패키지 작업을 위한 방법 해결은 bash 코딩에서 while 코드를 활용한 프로세스 상시 감시로써 seliunx의 자동전환을 꾀하는 방식 이었습니다.

하지만 '/etc/sudoers' 사용에 대한 시스템 불안 및 보안 문제 bash-while 동작 방식에 의한 시스템 cpu 점유 문제에 의한 시스템 불안 문제 등이 있었습니다. 

하지만 이번 seuper 2세대는 완전히 다른 방식으로 부팅시의 rc.d 서비스 구동 모듈을 활용함과 동시에 C언어를 활용한 INOTIFY 함수 응용 기술로써 selinux를 기본 정책 프로그램 사용시 인공지능 형태로 모드를 자동전환 하는 방식을 활용 합니다. 

즉 결론적으로 우분투도 이제 페도라 리눅스 처럼 selinux를 안정성 있게 효과적으로 사용할수 있다는 얘기 입니다.

  구동 원리

부팅시 '/etc/rc.d/seuper' 서비스 모듈 구동 > C 언어 - INOTIFY 응용 기술 프로세스 'procon' 과 seuper를 점검하는 'chkfix'실행 > xdesktop 을 policys로 구동 > 패키지 관리툴 (dpkg, apt 등이 직접 전환 방식을 사용 



사용방법


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 활성화 하는 방법



user@user-test:~$ sudo seuper enable 


이 프로그램은 아직 개발단계 이기 때문에 잘못하면 시스템에 위험을 끼칠수 있습니다.


그렇기에 enable 하면 시스템에 위험을 초래 할 수 있기에 enable 허가시 그 뒤 따르는 모든 책임은 프로그램 사용자의 책임에 있음을 인정하십니까?  [Y/N]:


->  > 사용자 시스템 위험 가능성 인정 후 설치 진행


     > XDM이 'gdm' 이거나 'sddm'일 경우 설치 진행 안됨


     > seliunx가 설치 되어 있지 않을 경우 selinux 설치 자동 진행





-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 비활성화 하는 방법


user@user-test:~$ sudo seuper disable 



// seuepr의 상황 확인


user@user-test:~$ sudo seuper stat 



// 활성화 된 후 잠시 끄기 


user@user-test:~$ sudo seuper off


// 잠시 끄기 한 seuper 재 작동 


user@user-test:~$ sudo seuper on




도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린점이 있는 것 같다면 꼭 댓글로 알려 주시면 감사 하겠습니다.






[Name]    



seuper



[ Section ]   


admin


[ Version - 날짜]


0.2-4 ( Mon, 20 Mar 2017 23:23:39 +0900 )


[ 지원 아키텍쳐 ]   


x86_64(amd64)


[ 지원 운영체제 ]   


Linux_debian_ubuntu : xenial, wily, vivid, trusty, preceis, linux mint.....


[ 미 지원 ]


다음의 x-desktop을 지원하지 않습니다.


gdm, gdm3, sddm(kde) 


[ 빌드 & 컴파일러 ]


bash 

c - inotify


[ 의존 패키지 ]





[ 설명 ]   


본 프로그램은 우분투를 위한 selinux - patcher 입니다.


데스크탑 부팅시 selinux의 모드를 enforcing을 안정화 부팅 시키며 기본 정책 프로그램 가동시 자동 permissive로 전환 과 재전환으로 selinux를 더욱 인공지능 형태로써 강력하게 활용할수 있게 됩니다.


[ 특징 및 변경 사항 : Changes log ]   


  * Bug fix.


[ 개발자 ]


C O S M O S project.


site: http://cosmosproject2015.tistory.com


e-mail : cosmosproject15@gmail.com


[ 설치 방법 ]   


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>



root@test:~$ sudo apt-add-repository ppa:cosmosp2016/apps


root@test:~$ sudo apt-get update

root@test:~$ sudo apt-get install seuper 






[사용 방법]


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

root@test:~$ seuper --help






[ 소스 다운로드 ]   


없음



※ 자세한 사용 방법 포스팅은 조만간 할 예정 입니다.




도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린점이 있는 것 같다면 꼭 댓글로 알려 주시면 감사 하겠습니다.





[Name]   



seuper


[ Section ]   


Admin


[ Version - 날짜]


0.1-2( Tue, 17 Jan 2017 23:49:34 +0900 )


[ 지원 아키텍쳐 ]   


x86_64, i386, armhf, arm64


[ 지원 운영체제 ]   


Linux_debian_ubuntu : zesty, yakkety, xenial, vivid, trusty, preceis, linux mint....


[ 빌드 & 컴파일러 ]


bash


[ 라이센스 ]


GPL 3.0


[ 의존 패키지 ]


selinux, selinux-policy-ubuntu



[ 설명 ]   


This package is ubnutu patcher for selinux.
  Software will auto change setenforce currunt mode by boot & policys pkg for x-desktop.


(이 패키지는 selinux를 위한 우분투 패치입니다.


본 소프트웨어는 x-desktop 용 boot & 정책 패키지의 작동에 의해 자동으로 setenforce currunt 모드를 변경합니다.)


[ 특징 및 변경 사항 : Changes log ]   

 

* Fix developement.
  * Initial release.   


[ 개발자 ]


C O S M O S project.


site: http://cosmosproject2015.tistory.com


e-mail : cosmosproject15@gmail.com


[ 개발자의 말 ]


본 소프트웨어 seuper는 우분투를 위한 전용 patcher 입니다.


본 프로그램을 만들게 된 이유는 우분투에서 selinux의 currunt 모드를 enforcing으로 설정 후에는 x-desktop 로딩 문제와 더불어 각종 패키지 설치 문제까지 운영체제 활용이 까다로워 지는 것을 보완하기 위해서 이며


x-desktop으로 부팅시 자동으로 enforcing으로 안전하게 전환 되게 하겠끔 시스템을 재구성 합니다.


본 프로그램이 동작하는 방식은


/etc/seuper/policy 의 pkg들의 실제 프로세스 활동을 감시 구동 중인 프로세스의 PID를 분석하여 실제 프로세스 실행 경로가 맞는지를 확인 setenforce 0으로 자동 전환 구동 중인 프로세스의 활동이 종료되면 자동으로 setenforce 1으로 전환


하는 방식으로 selinux의 enforcing여부를 프로그램 스스로가 판단하여 바꿔 주는 방식 입니다.


사용자가 직접 정책 등록을 할 수 있을 뿐만이 아니라 정책 삭제도 가능 합니다.


뿐만 아니라 seuper가 enable로 동작하고 있는 상태에서 사용자의 xwindows-desktop이 lightdm이나 gdm일 경우 데스크탑 메니저를 restart 했을때에 다시 x-desktop으로 리턴을 가능하게 합니다. (리눅스민트 -mdm 이나 다른 x-desktop 서비스들은 향후 업데이트에서 정책을 기본을 추가할 계획)




[ 설치 방법 ]   


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>



root@test:~$ sudo apt-add-repository ppa:cosmosp2016/apps


root@test:~$ sudo apt-get update

root@test:~$ sudo apt install seuper




[실행]   


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>


root@test:~$ seuper







[사용 방법]


-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

root@test:~$ seuper


[ Selinux for ubuntu patcher. ]

Version : 0.1-2

Use :

  sudo seuper enable :

    seuper activation for selinux change mode for only enforcing and '/etc/sudoers' file changes for 'setenforce'.
    and if selinux pakcage not installed then auto install selinux and watching realtime policys pkg for auto enforcing changes for x-desktop.

  sudo seuper boot :
     
      seuepr will task selinux safty enforcing boot for x-desktop.

  sudo seuper disable :

    seuper inactive for selinux change mode for only permissive and '/etc/sudoers' file restore.

  sudo seuper add <pkg name> <pkg excute path> :

    pkg add to seuper policy list.

  sudo seuper remove <pkg name> :

      pkg delete from seuper policy list.

  sudo seuper status :

      Selinux status & seuper status & seuper policys print.

Homepage :http://cosmosproject2015.tistory.com




[ 소스 다운로드 ]  


없음


seuper 가이드로 바로가기


도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린점이 있는 것 같다면 꼭 댓글로 알려 주시면 감사 하겠습니다.


리눅스 우분투에서 selinux를 자동으로 모드를 체인지 해주는 'seuper' 개발 완료 예정 


리눅스 우분투에서는 페도라 리눅스와는 달리 패키징 작업을 할때 selinux 의 enforcing 상태를 변환해 주지 않는다.


정책을 바꿔주는 툴인 setsebool이 있긴 하지만 효과적으로 활용하기에는 상당히 까다롭다.


그리고 정작 중요한 작업들인 dpkg, apt, pip install 프로그램들의 정식 구동시 selinux의 currunt모드를 permissive로 정책을 변환 시켜주는 툴킷이 우분투 진영에 강력히 필요하다고 판단하여 개발에 곧바로 착수 했다.


뿐만 아니라 리눅스 서버 유저도 활용하는 프로그램이 구동 될 시 모드를 자동 변환해줄 수 있도록 소프트웨어 정책 등록이 가능 하도록 할 예정이다.


또 지정한 소프트웨어의 구동이 종료되면 자동으로 다시 정책을 'enforcing'으로 전환 하게 된다.


가장 중요한 점은 다른 악성코드적 소프트웨어가 apt, dpkg등 사용자가 주로 사용하는 소프트웨어로 프로세스 네임을 둔갑시켜 실행 시켜 selinux를 교란하는 것을 막기 위하여


seuper는 프로세스 구동을 감지 하게 되면 스스로 해당 프로세스의 PID를 확인하고 파일시스템의 '/proc/pid/exe' 를 확인 하여 실제 해당 소프트웨어의 구동인지를 검사하여 모드를 전환 하게 되는 방식을 구현할 계획이다.  


name : seuper (selinux for ubuntu patcher)


개발 완료 예정 : 2주 ~ 1달


개발 언어 : bash


예상 지원 아키텍쳐 : all


예상 지원 OS : 리눅스 우분투 모든 배포판


도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.





리눅스에서의 netstat 명령은 그 사용 용도는 같지만 기능과 명령이 조금 다릅니다.


그냥 netstat 명령을 치면 윈도우와는 다르게 외부 프로토콜을 포함하여 내부 프로세스 교류 현황까지 전부 뜨게 됩니다.


그렇다면 간편하게 외부 교류 프로토콜만 확인하려면


netstat -t


netstat -tunp


혹은 netstat -a | less 명령으로 모든 netstat 을 천천히 내려 보실수가 있습니다.


빠져나오려면 (ctrl + z)



+ Recent posts