open(/var/dcc/map): Permission denied --- maillog에러 메세지 드디어 해결!!

by 햇빛소년 posted Jun 09, 2012 Views 32273 Likes 0 Replies 0
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

국산 통나무 수공예 남원제기, 남원목기

자료가 도움이 되셨다면
혼수용품제수용품 필요시
남원제기 공식 홈페이지 http://남원제기.kr
남원목기 공식 홈페이지 http://otchil.kr
에서 구매 해 주세요
정성껏 모시겠습니다.
 

spamassin + pyzor + razor2 + clamav + DCC 를 구축하여 스팸메일을 줄여 보겠다는 목적이 있었다.

위의 모든 것들을 업그레이드 하고 필요한 것은 설치 하였다.

 

여기서 설치 하는 방법은 생략하기로 한다.

 

설치는 보란듯이 깨끗하게 보기좋게 깔끔하게 설치하였는데  DCC 에서 자꾸 튕겨 나가는 에러가 발생하였다.

바로, 아래와 같은 에러 메세지 였다.

dccproc[6885]: open(/usr/local/dcc/map): Permission denied
dccproc[6885]: lock_open(/usr/local/dcc/whiteclnt.dccx): Permission denied; file not writeable for locking
ns dccproc[6885]: whiteclnt still broken
dccproc[6887]: open(/usr/local/dcc/map): Permission denied
dccproc[6887]: lock_open(/usr/local/dcc/whiteclnt.dccx): Permission denied; file not writeable for locking
dccproc[6887]: whiteclnt still broken

 

◆※ 필자는 당연히 Permission 에러이므로 chmod, chown, Install Drectory에 문제가 있으리라 생각하고

      정말 두달(2달) 동안 가능한 할 수 있는 삽질은 다 해 보았지만, 이 징그러운 DCC에러는 해결 되지 않았다.

      포기하고 DCC는 사용하지 않겠노라고 삭제한 것이 수십번이다. 그럴 때마다 한 두 시간 지나거나 하루를 지새고 나면

      이 놈의 곤조가 미련이 남는 것이야. 이렇게, 저렇게 해 보면 금방 될 것 같은데 또, 해 보면 좃나게 안 되는거야....

 

◆※ DCC 관련 문서는 네이버, 다음 사이트에는 문서가 거의 존재하지 않더군. 할 수 없이 영어도 못하는 필자가 구글에 가서

      번역기 돌려가며  open(/usr/local/dcc/map): Permission denied 로  검색하여 거의 모든 문서는 다 훑어 보았어.

      그 심정 여러분은 모를거야.  나이 50넘어 English reading 자유자재로 할 수 있는 사람 몇이나 될까... 그래도 많이

      배운 사람은 할 수 있게지만 뭐!..쩝쩝... 그래도 하도 눈독을 하니 이해는 못 하더라도 대충 어떤 내용인지 감은 잡겠

      더라구. 정 모르겠으면 구글번역기에 의존 하세요. 완전한 것은 아니지만, 대충 감으로 때려 잡으면 되요.

 

◆※ 외국웹에 검색결과 처방전은 거의 모든 내용이 set-UID만 강조하고 있습니다.

    DCC파일은 아래 링크 누르면 다운 받으실 수 있습니다.

    http://www.dcc-servers.net/dcc/source/dcc.tar.Z

    

    sunshine># cd /usr/local/src

    src># wget http://www.dcc-servers.net/dcc/source/dcc.tar.Z

    

    다운 받은 파일을 압축 해제 합니다.

    src># tar xvzf dcc.tar.Z   압축 푼다음 이렉토리 이동.

    dcc-1.3.142># ./configure --help        명령으로 설치 옵션 확인 해 보세요.  습관들이는게 좋을듯.

    Configuration:
  --help                   print this message
  --no-create              do not create output files
  --quiet                  do not print "checking..." messages
  --homedir=HOMEDIR        DCC home directory [/var/dcc]
  --bindir=DIR             user executables [/usr/local/bin]
  --libexecdir=DIR         program executables [HOMEDIR/libexec]
  --mandir=DIR             documentation [/usr/local/man]
  --with-updatedcc_pfile=FILE of updatedcc parameters [HOMEDIR/.updatedcc_pfile]
  --with-installroot=DIR   prefix DIR to directory paths
  --with-configsuffix=STR  append STR to installed configuration file names
  --enable-64-bits         compile for 64-bits on Solaris and Linux PowerPC
  --with-make-cmd=path     to make or gmake
  --with-fetch-cmd=path    to wget, fetch, curl, or ftp
  --with-fetch-cmd-addr=IP local address for wget, fetch, or curl
  --with-DCC-MD5           use MD5 code in the DCC source
  --with-uid=UID           set-UID for cdcc, dccproc, & dccsight [root]
  --disable-sys-inst       install in private directories and without set-UID
  --disable-server         do not build DCC server, dccd
  --disable-dccifd         do not build DCC program interface, dccifd
  --disable-dccm           do not build DCC sendmail interface, dccm
  --with-sendmail=X        build dccm with sendmail milter interface in X
  --with-cgi-bin=DIR       for whitelist CGI scripts [HOMEDIR/cgi-bin]
  --with-rundir=DIR        for PID files and milter socket [/var/run/dcc]
  --with-db-memory=MB      minimum server database buffer; 32-49152 MBytes
  --with-max-db-mem=MB     maximum server database buffer; 32-49152 MBytes
  --with-max-log-size=KB   maximum log file size; 0=no limit; [32]
  --with-rl-max=X          server rate limit state [auto]
  --disable-IPv6           no IPv6 support
  --with-kludge=FILE       include local header FILE
  --with-socks[=lib]       build DCC clients with SOCKS support
  --enable-lang-Dutch      checksum Dutch

       

◆※ 보통 기본 설치는

./configure

make install

이렇게 기본으로 설치를 하면 UID=root로 설정됩니다.

 

필자는 퍼미션 에러 때문에 다양한 옵션으로 시도를 해 보았으나 역부족으로 실패를 거듭하였다.

 

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

 

여기서 부터 성공기 들어갑니다.

 

희미한 기억속에 과거에도 이와 유사한 경험이 있었던 거 같다.

바로, SELinux.......

보안 강화를 위해 레드햇 계열 리눅스는 selinux 정책을 기본적으로 사용하고 있다는 것이다.

여기서 selinux에 관한 자세한 설명은 하지 않기로 한다.  각자 알아서 문서를 찾아 보기 바란다.

 

보편적으로 우리가 소유자나 퍼미션 바꿀 때 chown, chmod 명령을 사용하는데 

selinux  변경은 chcon 명령으로 설정한다. 하지만, 이것도 한계가 있어 파일의 정확한 소유자가 아니면

permission denaed  에러가 발생하여 변경이 불가항력이 된다.

 

SELinux 관련 디렉토리는 /etc/selinux 이며, selinux 설정 정책이 이곳에서 이루어 진다.

 

sunshin># cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.      <---  정책설정
#       permissive - SELinux prints warnings instead of enforcing.   <--- 주의모드
#       disabled - SELinux is fully disabled.  <----- 사용안함
SELINUX=enforcing   현재는 selinux 사용미며, 위의 세가지중 원하는 방법 택하면 된다.
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted

하지만, DCC 좀 사용하겠다고 selinux를 해제하므로써 보안강화를 약화시키고 서버를 무방비로 만들고 싶지는 않았다.

필자가 원하는 것은 selinux 정책을 사용하면서도 DCC를 사용하고 싶은 바램이 간절하다.

 

현재 상태에서만 보안 설정에 대한 활성화 및 비활성화를 설정 할 수 있다. 시스템 재부팅 후 원래 상태로 돌아 온다. (휘발성)

           

    #  setenforce 0     (비활성화 disabled)

    #  setenforce 1     (활성화 enforcing


 SELinux 상태 상태 확인

[root@selinux proc]# sestatus -v

 

SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

 

Process contexts:
Current context:                root:system_r:unconfined_t:s0-s0:c0.c1023
Init context:                   system_u:system_r:init_t:s0
/sbin/mingetty                  system_u:system_r:getty_t:s0
/usr/sbin/sshd                  root:system_r:unconfined_t:s0-s0:c0.c1023

 

File contexts:
Controlling term:               root:object_r:devpts_t:s0
/etc/passwd                     system_u:object_r:etc_t:s0
/etc/shadow                     system_u:object_r:shadow_t:s0
/bin/bash                       system_u:object_r:shell_exec_t:s0
/bin/login                      system_u:object_r:login_exec_t:s0
/bin/sh                         system_u:object_r:bin_t:s0 -> system_u:object_r:shell_exec_t:s0
/sbin/agetty                    system_u:object_r:getty_exec_t:s0
/sbin/init                      system_u:object_r:init_exec_t:s0
/sbin/mingetty                  system_u:object_r:getty_exec_t:s0
/usr/sbin/sshd                  system_u:object_r:sshd_exec_t:s0
/lib/libc.so.6                  system_u:object_r:lib_t:s0 -> system_u:object_r:lib_t:s0
/lib/ld-linux.so.2              system_u:object_r:lib_t:s0 -> system_u:object_r:ld_so_t:s0

 

※   _u : 신분(identify)필드 , _r : 역할(role)필드 , _t :유형(type) 필드 

 

위와 같이 selinux의 신분 역할 유형을 확인하려면

sunshine># ll -Z   또는  ls -lZ 명령으로 확인 할 수 있다.

 

해당 파일에 대한 selinux의 신분 역할 유형의 문맥 변경은 다음과 같은 명령으로 할 수 있다.

 

sunshine># chcon --help    <-----옵션 도움말

  -c, --changes          like verbose but report only when a change is made
  -h, --no-dereference   affect symbolic links instead of any referenced file
                         (available only on systems with lchown system call)
  -f, --silent, --quiet  suppress most error messages
      --reference=RFILE  use RFILE's context instead of using a CONTEXT value
  -u, --user=USER        set user USER in the target security context
  -r, --role=ROLE        set role ROLE in the target security context
  -t, --type=TYPE        set type TYPE in the target security context
  -l, --range=RANGE      set range RANGE in the target security context
  -R, --recursive        change files and directories recursively
  -v, --verbose          output a diagnostic for every file processed
      --help             display this help and exit
      --version          output version information and exit

 

sunshine># chcon -t  usr_t 12345.php  <----- -t (type)유형

sunshine># chcon -r object_r 12345.php <------ -r (role)역할

sunshine># chcon -u huney 12345.php  <--------u (user)사용자 selinux 문맥으로 바꾼다.

 

이상으로 selinux 관련 명령을 간단하게 맛 보았다.

차츰 중요한 부분으로 옮겨 가는데 SELinux의 에러 파일이 /var/log/audit/audit.log 란 것을 의외로 모르시는 분들이 많다.

하기사, 나도 몰랐으니까. 뿐만 아니라 selinux의 존재 자체도 모르시는 분들이 상당수 계신다. 그렇기 때문에 본 필자와 같이

또라이 처럼 멍청하게 삽질하고 시간낭비 쏟아 붇는 사람도 있으니 말이다. 이 글이 조금이나마 도움이 되었으면 합니다.

 

sunshine># ps -ef|grep auditd     <----데몬확인  실행이 되어 있어야 로그를 남긴다.

sunshine># service auditd start     <------  만약 없다면 실행 시킨다.

sunshine># cat /var/log/audit/audit.log        <------  로그내용 확인.

 

로그내용이 주르륵 복잡하게 보일 것이다. 아래 내용을 참고 하셔서 로그 분석하는데 도움되길 바란다.

 

        audit(timestamp) : SELinux 검사 메세지이며 타임 스탬프 형식으로 기록한다.
           avc : SELinux 벡터 캐시 액세스를 나타나며 거의모든 기록은 이 캐시이다.

           denied | accepted : 해당 액션이 허가되었는지 거부되었는지를 나타낸다.
           { read | write | unlink | .....} 이 필드는 파일을 읽기,쓰기, unlink 등 정책을 로딩등의 액션 종류을 출력'
           for pid=<PID> : 접근하는 액션의 프로세스 ID를 나타낸다.
           exe=<executable> : 실행되는 프로세스의 경로를 나타낸다.
           name=<name> : 액션을 시도하는 타켓의 이름을 나타낸다.
           dev=<device> : 타켓 파일이 위치한 디바이스를 나타낸다.
           ino=<inode-number> : 액션 타켓의 inode를 나타낸다.
           scontext=<security context> : 프로세스의 보안상태(문맥)을 나타낸다. 사용자,규칙,타입을 가지고 있다.
           tcontext=<target context> : 액션 타켓(파일이나 디렉토리등에 사용되는)의 보안상태(문맥)을 나타낸다.
           tclass=<target class> : 타켓 오브젝트(디렉토리,파일,디바이스,노드같은)의 클래스를 나타낸다.

 

sunshine>#  yum update selinux*   <--------   최신버전으로 업데이트 시킨다.

 

SELinux 관리 프로금램

Semanage

setsebool

audit2allow    <----  이 놈이 아주 유용하게 필요한 놈이다.

 

 

clinic (진단학습) 시작

 

먼저 DCC 설치를 위한 user(사용자 계정)를 만듭니다. 

 

sunshine>#  useradd -d /user/local/share/dcc -s /sbin/nologin -Z user_u eclean

                                     -d 홈디렉토리    -s 쉘     -Z selinux사용자 신분 추가   ( 이 부분은 필자가 해 본 것임.)

sunshine>#  cat /etc/passwd    < ---- 추가 여부 확인

sunshine>#  ll /usr/local/share/dcc  < ----- 홈 디렉토리 생성여부 확인.

sunshine>#  rm -rf *     <-----   DCC 설치할 디렉토리 이므로 모두 삭제

sunshine>#  ll -Z /usr/local/share/dcc    <------  Selinux 문맥정책 확인

 

이제 앞에서 압축 해제한 DCC 소스 디렉토리로 이동한다.

★ 참고로 설치 홈디렉토리는 원하는 디렉토리로 해도 무방함.   예) /var/dcc

sunshine>#  cd /usr/local/src/dcc-1.3.142    <--------  이동한 후 다시 한번 ./configure --help 확인 해 본다.

sunshine>#  ./configure --homedir=/usr/local/share/dcc --with-uid=eclean  <-- (앞서 만들었던 DCC 사용자계정)

sunshine>#   make install       <----------  위의 컴파일이 끝나면 /usr/local/share/dcc 에 설치를 한다.

sunshine>#  ll -Z /usr/local/share/dcc  <------  설치 디렉토리 및 파일의 Selinux 문맥구조를 확인한다.

 

앞에서 배웠던 chcon 명령으로 문맥정책을 바꾼다. 필자는 type(유형)을 usr_t로 변경하였 음.

 

sunshine># cd /usr/local/share   상위디렉토리로 이동

sunshine># chcon -R -t usr_t dcc   <--- dcc 디렉토리 밑에 모든 것을 usr_t로 변경

sunshine># chcon -R -r object_r dcc  <---- dcc 디렉토리 밑에 모든 ROLE 을 object_r로 변경. 되어 있으면 변경 불필요.

                    혹시 신분(identify)필드가 root로 되어 있다면 한꺼번에 변경할 수도 있다.

sunshine># chcon -R user_u:object_r:usr_t dcc   <-- 여기서 user_u로 변경한 것은 계정생성시 -Z user_t 로 추가함.

 

 

 

 

 

 

 

 

 

   

Articles

1 2 3 4 5 6 7 8 9 10