보안

2024.06.24.보안 day55

202401to07 2024. 6. 24. 10:19

오늘은 PAM , 셀리눅스 

 

PAM (장착형 인증모듈) :  중요 포인트  : pam_tally2 / 복잡성
pluggable authentication module


리눅스 상에 인증방법을 제공하는 인증모듈
정책에 따라서 정책에 맞는 인증 방식을 제공


구성파일
/etc/pam.d   => 적재된 서비스 pam 설정파일


/lib/security
/lib64/security => PAM에 의해 호출되는 라이브러리 파일 (.so) [모듈]


/etc/security => pam모듈 실행에 필요한 추가 설정 파일

 

 

  128  mkdir /backup
  129  cp -a /etc/pam.d/ /backup/
  130  cd /etc/pam.d/
  131  vi passwd

#password   substack    system-auth
password    required    pam_cracklib.so try_first_pass retry=3  type=SEVAS_LINUX

***위같은 경우는 비번을 변경해도 적용이 안됨***

[root@SEVAS210 pam.d]# cat passwd
#%PAM-1.0
password    required    pam_cracklib.so try_first_pass retry=3 type=SEVAS_LINUX
auth       include      system-auth
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so

** 위치를 바꿔준뒤에 주석을 풀어주면 적용이 됨****

 

passwd

passwd sevas

다시 10.10.10.10 에서 sevas로 로그인후  

passwd하면 sevas 비번과 SEVAS_LINUX의 비번을 묻는다 

 

테스트 후 vi passwd 원복하기 ~


 

[TYPE] PAM에  어떤 타입의 인증이 사용될것인지 선언
auth  :  사용자 인증에 대한 타입 
account  :   인증이후 계정관리 수행 (접속관리) 
                 서비스에 대한 접근 허가/제한
session :   서비스 시행전과 직후에 필요한 작업
                 (mount/로그인/로그아웃,로그기록등등....)
password :      인증토큰 갱신시 필요, 주로 auth 모듈과 연결되서 사용됨 
                       (패스워드 변경 모듈 결정)



[control] 모듈실행 결과 (성공/실패)에 대한 행동 지침
required 모듈 실패시 다른모듈 인증요청 수행하나 최종적으로 거부 / 

                일단 다 요구하는데 하나라도 실패면 결과는 무조건 실패가 나온다 , 보통 required를 많이 함 
(성공시에는 다음 모듈 호출)
모듈 실패 = 거부 모듈성공 = 다음모듈 호출
requisite 모듈 실패시 즉시 실패  (성공시에는 다음 모듈 호출)
optional   선택사항으로 모듈의 성공/실패가 불분명시 모듈의 결과에 따라 결정 (보통 안써)
sufficient 모듈 인증 성공시 즉시 인증
단 required의 실패 이후에 호출된 경우나 모듈 실패는 인증에 영향 X
include 다른 PAM설정을 불러올때 적용


[module PATH] 지정한 PAM 라이브러리를 호출 (/lib64/security)
env 환경변수 호출
unix.so 사용자에게 ID/Password 질의 응답내용 검증 (auth에서 사용)
permit.so 무조건 성공
deny.so 무조건 실패 (인증 마지막에 사용)
access.so access control table 사용 가능 
사용자 계정/호스트/도메인을 통해 시스템 접근 허용(account에 사용)
limits.so 자원제한 (쓰기 어려워 잘안씀)
listfile.so 파일 리스트 확인 후 허가/ 거부 (ftpusers)


[module_argument] = 모듈마다 다르다
debug 오류 발생시 syslog에 추가정보 제공
no_warn 응용프로그램 경고 메세지 X
use_first_pass 앞에 실행된 모듈로 PW정보를 받으나 틀린경우 재입력 요청  X (auth,password에서 사용)
try_first_pass 앞에 실행된 모듈로 PW정보를 받으나 틀린경우 재입력 요청  (auth,password 에서 사용)
추가적으로 try_first_pass  retry=3  식으로 쓰임
use_uid 인증하는 UID가 아닌 현재 사용중이 UID로 대응


PAM 실습  )

sevas , test 계정에 대해 ssh 접속 막기 (putty 안들어가짐)
/etc/pam.d/sshd 

 auth required pam_listfile.so  item=user sense=deny file=/login/sevas  onerr=succeed


  140  useradd test
  141  useradd sevas
  142  useradd sevas2
  143  passwd test
  144  passwd sevas
  145  passwd sevas2
  146  vi /login/sevas
  147  mkdir /login
  148  cat  > /login/sevas
sevas
test
^C

 

결과 : sevas, test 는 putty안들어가짐

sevas2는 들어가짐

 

본사 DMZ) 10.10.10.10 vm1 ->192.168.10.10 / 192.168.10.2 vm 8


2. /bin/bash가 아닌 쉘을 쓰는 사용자에 대해 ssh 접속불가 

[root@www pam.d]# chsh sevas2
Changing shell for sevas2.
New shell [/bin/bash]: /bin/csh
Shell changed.
[root@www pam.d]# tail -3 /etc/passwd |grep sevas
sevas2:x:1002:1002::/home/sevas2:/bin/csh

sevas2로 로그인 확인 
vi /etc/pam.d/sshd
#auth      required     pam_listfile.so  item=user sense=deny file=/login/sevas  onerr=succeed
auth       required     pam_listfile.so  item=shell sense=allow file=/login/sevas  onerr=succeed

vi /login/sevas
/bin/bash

sevas 로그인 확인 (접속가능)
sevas2 로그인 확인 (막힘) 


 vi /etc/pam.d/passwd

 

pam_permit.so   :  무조건 통과  :

auth       sufficient   pam_permit.so

 

pam_deny.so     : 무조건 거부  :

auth      requisite    pam_deny.so

 

pam_rootok.so  : root인 경우에만 성공

auth           sufficient      pam_rootok.so
#auth            sufficient      pam_wheel.so trust use_uid

 

pam_wheel.so         wheel 그룹 사용자 적용 

#auth           sufficient      pam_rootok.so
auth            sufficient      pam_wheel.so trust use_uid

usermod -G wheel sevas2

sevas2에서 su 를 쓰면 그룹에 가입되서 비번 (X) 통과 

 

pam_succeed_if.so     : 조건 식 

auth       required     pam_succeed_if.so  uid > 1000
auth       required     pam_sepermit.so

quiet_fail       결과에 따라 syslog에 알리지 않음
quiet_success 결과에 따라 syslog에 남김

 

pam_issue.so

auth       optional     pam_issue.so    issue=/etc/sevas_issue

auth type에서만 사용가능 / 주로 optional 로 설정이 됨.
사용자로그인전  issue파일 내용 출력

*** centos7로 오면서 디폴트 값으로 /etc/issue 바뀜 ****

 

 

pam_motd.so 

session    optional     pam_motd.so     motd=/etc/motd2

주로 session에서만 사용가능

인증할때 /etc/motd2  내용 출력 / 기본적으로 /etc/motd 를 쓰면 인증완료후 메세지를 띄움 

**issue 는 로그인전 타이틀 내용 출력을 하고   
motd 는 인증완료후 내용출력하는부분이 다름 **

 

 

pam_access.so 

auth  requied pam_access.so

모든 type에서 사용가능

+ - : 허가 거부

origins  터미널명(tty),컴퓨터이름,도메인,아이피,ALL,LOCAL

설정은 /etc/security/access.conf에서 설정

[ permission(+/-) : users : origins ]

ex) 

+ : ALL EXCEPT  sevas sevas2 : 100.100.100.  (sevas와 sevas2를 제외하고 다른사람은 100.100.100.0/24 에서만 접속을 허가한다) 
-  : ALL : ALL (모든 사용자는 어디에서든 접속을 허용하지 않는다)
*** 둘다 설정해줘야되용~ ***

 

 

pam_unix.so   

auth sufficent pam_unix.so nullok try_first_pass

사용자에게 ID/Password 를 질의하고 응답 받은 정보를 검증
nullok : null 사용 허용
try_first_pass : 이전 모듈에서 입력받은 패스워드로 먼저 인증을 시도하고 없으면 사용자에게 패스워드를 물어봄


 pam_tally2  (계정 잠금 정책)

 

system-auth 는 로컬
password-auth 는 원격

 

실습 ) 로컬계정 3번 실패시 접속불가 (root는 제외)

 

 vi system-auth

auth        required      pam_env.so
auth        required      pam_tally2.so deny=3 unlock   
auth        sufficient    pam_unix.so nullok try_first_pass

 

(임계값 1분 제한시에는 unlock 대신 unlock_time=60 )

 

 

결과  : sevas 비번 3회 이상 비번 틀리면 막힘 

 pam_tally2   로 확인 가능 

횟수 초기화 

 pam_tally2 -u sevas -r 


PW복잡성 설정

 pam_pwquality.so : 비밀번호 복잡성 모듈

 vi system-auth

#password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=SEVAS_PASSWORD minlen=10 dcredit=-1 ucredit=-1 ocredit=-1

*** 설정파일로 바꿀때는 /etc/security/pwquality.conf 를 바꿔줘도 됨 

etry  : 패스워드 입력 실패 시 재시도횟수             
difok  : 기존 패스워드와 비교. 기본값10 (50%)             
minlen :  크레디트를 더한 패스워드최소길이               
dcredit  : 정수 / 숫자에 주어지는 크레디트값. 기본 1             
udredit  : 영어대문자에 주어지는 크레디트값               
lcredit  : 영어 문자에 주어지는 크레디트값              
ocredit : 숫자, 영어대/소문자를 제외한 특수문자

-1 값을 주면 반드시 해당하는 문자를 포함

적용 결과 : 

 

 

 

정리 : PAM은 인증 방법 설정하는 인증 모듈이다 ~

 모듈 종류가 너무 많다~


SELINUX

리눅스 보안 

보안 약함 

 

그동안은 항상 셀리눅스 비활성화 하고 실습 했었다 

 cat /etc/selinux/config

#SELINUX=enforcing
SELINUX=disabled

 

getsebool -a

 

[root@localhost login]# ll / |head -3
합계 24
drwxr-xr-x    3 root root   19  6월 23 18:10 backup
lrwxrwxrwx.   1 root root    7  4월 24 17:01 bin -> usr/bin

                  ^ 이 점 : '.selinux' 표시 

 

SELINUX

enforcing - SELinux security policy is enforced. 강제적활성  <------------------- 기본값
permissive - SELinux prints warnings instead of enforcing. 로깅수행
disabled - No SELinux policy is loaded. 비활성화

 

SELINUXTYPE
targeted - Targeted processes are protected, 부분 프로세스 수행     <------------------- 기본값
mls - Multi Level Security protection. 레벨에 따른 안전 보호


실습을 위해 이제 se리눅스 키자 

vi /etc/selinux/config

SELINUX=enforcing
#SELINUX=disabled

 

init 6 

 

sestatus : 상태확인

setenforce 1 : enforcing        정책설정 
setenforce  0 : permissive      정책설정

getenforce : 정책확인 

**재부팅 시 유지는 되지 않음 **

 


selinux 콘솔 패키지

 

 

yum install setools-console

rpm -ql setools-console 

 

yum install policycoreutils-python

rpm -ql policycoreutils-python

 

cd /login
ls -Z        : 디렉토리 보안 설정을 봄

ps -efZ    : 해당 데몬 정책 확인할때 사용

 

[root@localhost login]# mkdir /samba
[root@localhost login]# ls -dZ /samba
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /samba

unconfined_u 사용자 seinfo -u , semanage login -l
object_r        시스템 자원을 통제

subject_r  사용자나 프로세스 통제

samba_share_t 타입
s0                  레벨

 

사용자 
selinux 사용자 ID
마지막에  _u로 표시

unconfined => 제한되지 않은

 

역활
객체와 주체의 역활
마지막에 _r로 표시
object_r   시스템 자원을 통제
subject_r  사용자나 프로세스 통제
RBAC접근 통제를 사용함
ps -Z

 

 

레벨 
MLS (다중레벨보안(레벨로 보안 지정)) / MCS (여러 카테고리 보안(카테고리로 보안 지정))
S0:S0-0  :  낮은 보안
s0-s0:c0.c1023   낮은보안 - 높은보안
s0:c0.c1023  : 높은 보안


ACCESS 접근제어

: DAC(계정으로 관리)/ MAC (권한으로 관리 )

DAC (Discretionary Access Control) => 개인 그룹 (계정/그룹) = 임의적 접근 통제  =setuid       / Ex) rootkit

관리자는 맘대로 일반은 제한적 
장 : 정보레벨을 손쉽게 제어
단 : 중앙집중적인 접근 제어가 불가능
     관리자의 권한에 의존 트로이목마,악성코드,서비스적 침투에 약함

MAC (MAC - Mandatory Access Control)=> 주체 오브젝트 권한 (보통 셀리눅스 / 서비스 및 시스템 범위 ) 

=강제접근 통제  (소유권허권으로 강제 통제)

소유권 허가권 주는것

장 : 중앙집중적인 관리

단 : 객체단위 세밀한 설정불가
     정책으로 인한 성능저하및 구현의 복잡성


정보 보안 모델

**계정이 아닌 문서 이야기이다

쓰기=보안등급변경

읽기=보안등급확인**

1. 벨라파둘라(기밀성(인가된사용자만접근허용) 접근통제 모델)   

단순보안 규칙 : 주체는 자신보다 높은 등급의 객체를 읽을 수 없음 /낮은 권한을 가진 주체가 높은 레벨의 객체에 접근 하는것을 통제           

==> 하이라키 Hierarchy 구조

 

상위레벨 읽기금지정책 : 낮은 보안레벨에서 높은 보안문서 읽기 금지
하위레벨 쓰기금지정책:  높은 보안모델에서 낮은 보안모델 쓰기 금지

 

낮은 권한이 높은거 못봐 / 위가 아래 감시 가능 

2. 비바(무결성(변조x위조x) 통제 모델)

무결성에 기반하여 주체는 자신보다 낮은 등급에 있는 객체를 읽을수 없음

 

하위레벨 읽기 금지정책 : 낮은 보안레벨에서 높은보안문서 읽기 가능 낮은 보안문서 읽기 불가
상위레벨 쓰기 금지정책 : 낮은 보안레벨의 문서에서 높은 보안문서로 높일수 없음
                                       낮은 보안문서로 낮출순 있음 (한번 내려감 못올라감)

 

한번 올라가면 낮은건 신경안쓰는거 / 내려갈수는있는데한번내려가면 못 올라감 

 

https://blog.naver.com/365blackstar/223332723434

 

접근 통제 모델

문제6) 아래의 접근 통제 보안 모델에 대하여 설명 하시오. 가. 벨 라파듈라(BLP) 모델 나. 비바(BIB...

blog.naver.com

ㄴ 여기 자세함 이거 보셈


 

 

yum install setools-console

 

[정책리스트보기]

seinfo -r  역활정책
seinfo -t  타입정책
seinfo -a  속성정책

 

[보안정책로그]

tail -4 /var/log/audit/audit.log

 

yum install setroubleshoot-server  (보안로그 분석툴)

 

[객체에 대한 정책 초기화]
restorecon -v [파일/디렉토리]

[복구시 자동 설정 정책(제안만해주고 바꾸지 않음)]
matchpathcon [파일/디렉토리]

[객체별 사전에 설정된 정책 조회]
semanage fcontext -l | grep /var/www


실습 ) 

정책은 상속된다 

디렉토리마다 정책 다르다 

 

ps -ZC httpd       : 프로세스 정책확인

http://192.168.10.10/setest.html

 

chcon -t admin_home_t  /var/www/html/setest.html    : 파일 타입 변경

http://192.168.10.10/setest.html    ===> forbidden 뜸

 

 restorecon -v setest.html     : 정책 초기화 (원복)

 

 

 chcon -t admin_home_t /var/www/html/setest.html

 matchpathcon  setest.html          : 제안만 해줌 바꾸지 않음

 

[ 객체별 사전에(원래) 설정된 정책 조회 ]

semanage fcontext -l | grep /var/www

 

tail -5 /var/log/messages

sealert -l 5c6203f6-49ad-4aac-907e-02f9702fa6dc     : 제안 자세히 보기 


포트 정책 바꾸기 

[ 특정포트 정책확인 ]
seinfo --portcon=80

 

[ 사용가능 포트 확인 ]

semanage port -l | grep http_port_t
semanage port -l | grep http

 

 

포트에 대한 허용정책 확인
sesearch  -A  -t  http_port_t  -s  httpd_t  -d          


sesearch  -A  -t  http_cache_port_t  -s  httpd_t  -d  

 

 

vi /etc/httpd/conf/httpd.conf 
     42 #Listen 80
     43 Listen 8888
service httpd restart ===> 에러가 나면서 permission denied 발생

 

이걸 해야돼

semanage  port  -a  -t  http_port_t  -p tcp  8888   :허용포트 추가

semanage  port  -l  |  grep  http_port_t  : 추가한것 확인

netstat -lntup |grep httpd                      : 추가한것 확인 

ㄴ 8888 되는것 확인 가능

 

귀찮고 복잡하지? 

그래서 처음부터 selinux를 disabled하고 시작하는거야 

 

셀리눅스 끝~

 


이제 도커랑 쿠버네티스 시작

 

도커설치 

도커 이미지 

도커허브 올리는거