2022-09-05

강아람·2022년 9월 5일
0

Kakao Cloud School

목록 보기
23/30
post-thumbnail

crontab으로 원하는 시간에 shellscript 파일 실행

[root@server1 bin]# crontab -e
crontab: installing new crontab
[root@server1 bin]# crontab -l

14 09 * * * /bin/bash /root/srvmon.sh

35 16 * * * /usr/bin/find / -type f \( -perm -04000 -o -perm -02000 \) 
			-exec ls -l {} \; | /bin/mail -s "SUID/SGID LIST" root
[root@server1 bin]# ps -ef | grep srvmon
root      4640  4638  0 09:14 ?        00:00:00 /bin/bash /root/srvmon.sh
root      5990  3989  0 09:16 pts/0    00:00:00 grep --color=auto srvmon

crontab으로 원하는 시간에 log 파일 생성

crontab 지정

[root@server1 bin]# crontab -e
crontab: installing new crontab

지정된 것 확인

[root@server1 bin]# crontab -l
17 09 * * * /root/bin/srvmon.sh > /root/LABs/srvmon_`date +\%Y\%m\%d.log`

crontab이 실행되는지 실시간 log 확인

[root@server1 bin]# tail -f /var/log/cron
Sep  5 09:14:28 server1 crontab[4915]: (root) BEGIN EDIT (root)
Sep  5 09:16:04 server1 crontab[4915]: (root) REPLACE (root)
Sep  5 09:16:04 server1 crontab[4915]: (root) END EDIT (root)
Sep  5 09:16:10 server1 crontab[5939]: (root) LIST (root)
dateSep  5 09:17:01 server1 crond[1097]: (root) RELOAD (/var/spool/cron/root)
Sep  5 09:17:01 server1 CROND[6426]: (root) CMD (/root/bin/srvmon.sh > 
				     /root/LABs/srvmon_`date +%Y%m%d.log`)
^C
You have new mail in /var/spool/mail/root

실행 결과 log 파일 생성

[root@server1 bin]# cd ../LABs/
[root@server1 LABs]# ls
d1             index.html      kubernetes.txt  linux.txt  srvmon_20220905.log
fw_disable.sh  kakao_1to5      link_dir        perm       time.sh
fw_enable.sh   kakao_services  linux1          services



CRON 연습 문제

ex) 매주 토요일 오후 1시 1분마다 /etc/init.d/rsyslog restart하는 작업을 스케줄링 하시오.

(※ 요일은 0~7로 설정 가능하며 일요일이 0, 7 사용)

01 13 * * 6 /etc/init.d/syslog restart

ex) 1월 ~ 10월까지 2개월마다 1일 12시에 'It's system check time.' 출력

0 12 1 1-10/2 * /usr/bin/echo 'It's system check time.'

ex) 매월 월, 수, 금 12시마다 /var/log/ 모든 파일을 지워라

0 12 * * 1,3,5 /usr/bin/rm -r /var/log/*

ex) 매일 오후 2시 20분에 시간 동기화를 수행한 후 곧바로 OS reboot를 해라

20 14 * * * /usr/sbin/clock -w && 20 14 * * * /usr/sbin/shutdown -r now

ex) 3일에서 5일까지 5,6,7시에 매 5분마다 time.sh 실행

*/01 5-7(5,6,7) 3-5(3,4,5) * * /bin/bash /root/LABs/time.sh

ex) 매주 금요일 오전 7시 15분에 time.sh 실행

15 7 * * 5 /bin/bash /root/LABs/time.sh




원하는 시간에 백업파일 생성하기

백업파일 생성하는 shellscript 생성

#!/bin/bash
set $(date)
fname="$6-$2-$3-backup"
tar -cvzf /BACKUP/$fname.tar.gz /var/log

참고 (변수를 이용한 파일이름 설정)
[root@server1 LABs]# date
Mon Sep 5 09:39:10 KST 2022
$1 $2 $3 $5 $6 $7

파일 권한 설정

[root@server1 LABs]# chmod 700 log_backup.sh
[root@server1 LABs]# ./log_backup.sh

백업 압축파일이 생성 확인

[root@server1 LABs]# cd /BACKUP/
[root@server1 BACKUP]# ls -l
total 756
-rw-r--r--. 1 root root 772897 Sep  5 09:41 2022-Sep-5-backup.tar.gz

시간과 실행 설정

[root@server1 BACKUP]# crontab -e
crontab: installing new crontab

실행 확인

[root@server1 BACKUP]# crontab -l
44 09 * * * /root/LABs/log_backup.sh
Sep  5 09:43:13 server1 crontab[21713]: (root) BEGIN EDIT (root)
Sep  5 09:43:24 server1 crontab[21713]: (root) REPLACE (root)
Sep  5 09:43:24 server1 crontab[21713]: (root) END EDIT (root)
Sep  5 09:43:29 server1 crontab[21870]: (root) LIST (root)
Sep  5 09:44:01 server1 crond[1097]: (root) RELOAD (/var/spool/cron/root)
Sep  5 09:44:01 server1 CROND[22184]: (root) CMD (/root/LABs/log_backup.sh)
^C
You have new mail in /var/spool/mail/root



백업파일을 주기적으로 생성하기 위해서는 비밀번호를 일일히 치지 않아도 실행되어야 한다.

Telnet

packet 전송 시 평문으로 전송

SSH

packet 전송 시 암호문으로 전송

  • RSA/DSA 알고리즘 : 소인수분해 개념을 이용한 암호화 ▶ SSH는 RSA와 DSA 알고리즘을 사용
  • 3DES: 난수(random) 알고리즘



SSH 무인증 처리 수행: SSH의 암호화 키 공유

[root@server1 ~]# ssh server2
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server2' (ECDSA) to the list of known hosts.
root@server2's password:
Last login: Fri Sep  2 02:07:34 2022 from 192.168.56.1
[root@server2 ~]#



시스템 Booting & shutdown

전원 ON

BIOS 단계: 메인보드 시스템을 읽어들일 수 있는 환경

  • 하드웨어 검사 (메모리)
  • 부팅 장치 선택
  • MBR 로드
  • 부트 로더 로드

부트 로더 단계

  • 여러 운영체제 중 부팅할 운영체제 선택 메뉴 제공
  • Linux kernel을 메모리에 로딩)

kernel 초기화 단계

  • 시스템에 연결된 메모리, 디스크, 키보드, 마우스 등의 장치 검사
  • fork 함수를 사용하지 않고 생성되는 프로세스와 스레드 생성

systemd(PID: 1) 서비스 단계

  • ~ centOS 5: init process
  • centOS 6 ~: systemd process

로그인 프롬프트 출력


kernel

kernel 버전 확인

[root@server1 ~]# uname -ar

Linux server1.kakao.com 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

[root@server1 ~]# sysctl -n kernel.osrelease

3.10.0-1160.71.1.el7.x86_64

[root@server1 ~]# cat /proc/version

Linux version 3.10.0-1160.71.1.el7.x86_64 s(mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Tue Jun 28 15:37:28 UTC 2022




시스템 runlevel

init 프로세스와 런레벨 (/etc/inittab)

  • 런 레벨: 시스템의 단계를 7개로 정의하여 구분하고, 각 단계에 따라 셸 스크립트를 실행하는데 이 단계를 런레벨이라고 한다.

runlevel 3: 다중 사용자 모드(NFS 포함) (권장)


  • 현재 runlevel 보기
[root@server2 ~]# systemctl get-default
graphical.target
  • 멀티유저(runlevel 3)로 변경
[root@server2 ~]# systemctl set-default multi-user.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
  • 그래피컬(runlevel 5)로 변경
[root@server2 ~]# systemctl set-default graphical.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
  • 현재 runlevel 보기
[root@server2 ~]# systemctl get-default
graphical.target

VNC(Virtual Network Computing) 구성

  • 원격 접속 도구: PuTTY, moba ▶ noGUI



사용자 계정 및 그룹 관리

사용자 계정 및 그룹과 연관된 파일 및 디렉터리

1) /etc/passwd: 계정 인증 파일
2) /etc/shadow: 계정 인증 파일, 암호화된 비밀번호
3) /etc/group: 그룹 관리 파일, 모든 사용자는 반드시 특정 그룹에 소속됨
4) /etc/default/useradd: 사용자 추가 시 적용되는 기본값
5) /etc/login.defs: UID/GID 생성 시 사용되는 기본값, 암호 만료 기간, 암호화

  • user가 생성되면 UID/GID가 자동 할당됨

6) /etc/skel: 사용자 home 디렉터리에 포함되는 기본 환경설정 파일 제공


사용자 계정 관련 파일

사용자 관리

  • Linux는 다중 사용자 시스템이므로 사용자를 구별하고 사용자에게 적절한 자원을 할당해주는 방법이 필요
  • 사용자 계정은 사용자가 시스템에 접근할 수 있는 유일한 방법
  • 시스템 관리자의 입장에서도 사용자의 접근 권한을 통제할 수 있는 중요한 수단

/etc/passwd 파일

사용자 계정 정보가 저장된 기본 파일

1) 로그인 ID: 사용자 계정의 이름
2) x: 초기 Unix 시스템에서 사용자 암호를 저장하던 항목
3) UID: 사용자 ID 번호로 시스템이 사용자를 구별하기 위해 사용하는 번호

  • 일반 사용자는 UID 1000번부터 할당
  • 0-999, 65534번: 시스템 사용자를 위한 UID로 예약

4) GID: 그룹 ID, 시스템에 등록된 그룹에 대한 정보는 /etc/group 파일에 저장
5) 설명: 사용자의 실명이나 부서명, 연락처 등 사용자에 대한 일반적인 정보 기록
6) 홈 디렉터리: 사용자 계정에 할당된 홈 디렉터리의 절대경로 기록
7) 로그인 셸: 사용자의 로그인 셸을 지정


/etc/passwd


/etc/shadow

사용자 암호에 관한 정보를 별도로 관리하는 파일

암호가 지정되지 않은 계정을 발견했을 경우

!! : 암호가 지정되지 않은 계정

1) 암호 설정

[root@server1 ~]# passwd kakao1
Changing password for user kakao1.
New password:
BAD PASSWORD: The password is shorter than 7 characters
Retype new password:
passwd: all authentication tokens updated successfully.

2) 제거


3) lock : 당장 계정이 서버에 접근할 수 없도록 하기 위해 사용

  • lock
[root@server1 ~]# usermod -L kakao1
[root@server1 ~]# passwd -l kakao1
Locking password for user kakao1.
passwd: Success

결과

login as: kakao1
kakao1@192.168.56.101's password:
Access denied
  • lock 해제
[root@server1 ~]# passwd -u kakao1
[root@server1 ~]# passwd -u kakao1
Unlocking password for user kakao1.
passwd: Success

결과

Unlocking password for user kakao1.
passwd: Success

💡 암호화 방식 변경




/etc/group

그룹에 대한 정보 저장

사용자 계정 생성하기

useradd

  • 기능: 사용자 계정 생성
  • 옵션
    • -u uid: UID 지정
    • -o: UID의 중복을 허용 (쓰지 마세요!)
    • -g gid: 기본 그룹의 GID 지정
    • -G gid: 2차 그룹의 GID 지정
    • -d 디렉터리명: 홈 디렉터리를 지정
    • -s 셸: 기본 셸 지정
    • -c 설명: 부가적인 설명 지정
    • -D: 기본 설정 값

/etc/skel

사용자 계정의 홈 디렉터리에 공통으로 배포해야 할 파일을 /etc/skel 디렉토리에 파일을 만들어 놓으면 사용자 계정 생성 시 자동으로 복사됨

skel 디렉터리 내에 README 생성

생성된 계정의 skel 디렉터리에 복사된 것 확인

.bash: 사용자 level의 전역 설정


정보 보안 감사

: 금일로부터 정직, 휴직, 해고 등의 사유로 출근하지 않는 자의 계정은 반드시 Lock 설정을 수행

  • root 사용 금지 이유
    1) superuser (Unix/Linux의 관리자는 root)
    2) 접근은 ID와 password로 가능 ▶ 로그 확인

pam(pluggable authentication module)


사용자 계정 정보 수정하기

usermod

  • 기능: 사용자 계정 정보를 수정한다.
UID 변경하기: -u 옵션
홈 디렉터리 변경하기: -d 옵션
로그인 ID 변경하기: -l 옵션

SSH 원격 접근 제어 구성

일반 사용자들의 su - root 접근 허용하지 말 것

  • authentication을 요청했을 때 wheel 그룹에 속한 사용자 계정만 접근 허용 ▶ wheel 그룹에 admin 계정을 추가
[root@server1 ~]# cd /etc/pam.d/
[root@server1 pam.d]# ls
atd                     gdm-pin           ppp                sudo
chfn                    gdm-smartcard     remote             sudo-i
chsh                    liveinst          runuser            su-l
config-util             login             runuser-l          system-auth
crond                   other             samba              system-auth-ac
cups                    passwd            setup              systemd-user
fingerprint-auth        password-auth     smartcard-auth     vlock
fingerprint-auth-ac     password-auth-ac  smartcard-auth-ac  vmtoolsd
gdm-autologin           pluto             smtp               xserver
gdm-fingerprint         polkit-1          smtp.postfix
gdm-launch-environment  postlogin         sshd
gdm-password            postlogin-ac      su
[root@server1 pam.d]# vi su
auth            required        pam_wheel.so use_uid

admin1 계정의 서브 그룹으로 wheel 지정

[root@server1 pam.d]# usermod -G wheel admin1

july는 root 계정에 접근 불가

july@192.168.56.101's password:
Last failed login: Mon Sep  5 14:48:50 KST 2022 from 192.168.56.1 on ssh:notty
There were 2 failed login attempts since the last successful login.
Last login: Thu Sep  1 17:35:26 2022 from 192.168.56.1
[july@server1 ~]$ id
uid=1001(july) gid=1001(july) groups=1001(july) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[july@server1 ~]$ su - root
Password:
su: Permission denied

wheel 그룹에 속한 admin1은 root 계정에 접근 가능

login as: admin1
admin1@192.168.56.101's password:
[admin1@server1 ~]$ su - root
Password:
Last login: Mon Sep  5 11:14:46 KST 2022 from 192.168.56.1 on pts/0
Last failed login: Mon Sep  5 14:49:38 KST 2022 on pts/1
There were 4 failed login attempts since the last successful login.
ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1662344086

사용자 계정 삭제하기

userdel

  • 기능: 사용자 계정을 삭제한다.
  • 옵션
    • -r: 홈 디렉터리 삭제
    • -f: 사용자가 로그인 중이어도 강제로 삭제

사용자 계정만 삭제하기

  • 존재하는 계정 확인
[root@server1 ~]# cd /home
[root@server1 home]# ls
atom  blue  cain  jeff  july  kakao1  kevin  oracle  scott  tom
  • blue 계정 삭제
[root@server1 home]# cd
[root@server1 ~]# userdel -r blue
  • 결과
[root@server1 home]# ls
atom  cain  jeff  july  kakao1  kevin  oracle  scott  tom

새 그룹 생성하기

groupadd

  • 기능: 그룹 생성하기

시나리오

devteam (3000): devuser1~3
opsteam (4000): opsuser1~3
devops1 (5100): devuser1, devuser2, opsuser1, opsuser2
devops2 (5200): devuser1, devuser2, opsuser1, opsuser2
adminteam (6000): opsuser1, opsuser3

그룹 생성

[root@server1 home]# groupadd -g 3000 devteam
[root@server1 home]# groupadd -g 4000 opsteam
[root@server1 home]# groupadd -g 5100 devops1
[root@server1 home]# groupadd -g 5200 devops2
[root@server1 home]# groupadd -g 6000 adminteam

팀원들의 그룹 설정

[root@server1 home]# useradd -g 3000 -G 5100 devuser1
[root@server1 home]# useradd -g 3000 -G 5100 devuser2
[root@server1 home]# useradd -g 3000 -G 5200 devuser3
[root@server1 home]# useradd -g 3000 -G 5200 devuser4
[root@server1 home]# useradd -g 4000 -G 5100,6000 opsuser1
[root@server1 home]# useradd -g 4000 -G 5100 opsuser2
[root@server1 home]# useradd -g 4000 -G 5200,6000 opsuser3
[root@server1 home]# useradd -g 4000 -G 5200 opsuser4

그룹과 그룹 멤버 확인

[root@server1 ~]# grep devteam /etc/group
devteam:x:3000:
[root@server1 ~]# grep devuser1 /etc/group
devops1:x:5100:devuser1,devuser2,opsuser1,opsuser2
[root@server1 ~]# grep opsuser1 /etc/group
devops1:x:5100:devuser1,devuser2,opsuser1,opsuser2
adminteam:x:6000:opsuser1,opsuser3

그룹 삭제하기

[root@server1 home]# groupdel adminteam
[root@server1 home]# groupdel devteam
groupdel: cannot remove the primary group of user 'devuser1'
[root@server1 home]# groupdel devops1
[root@server1 home]# groupdel devops2
[root@server1 home]# groupdel opsteam

기본 그룹원으로 설정된 멤버가 있기 때문에 삭제 불가

groupdel: cannot remove the primary group of user 'opsuser1'

멤버를 삭제한 후 그룹 삭제

[root@server1 home]# userdel -r devuser1
[root@server1 home]# userdel -r devuser2
[root@server1 home]# userdel -r devuser3
[root@server1 home]# userdel -r devuser4
[root@server1 home]# groupdel devteam
[root@server1 home]# userdel -r opsuser1
[root@server1 home]# userdel -r opsuser2
[root@server1 home]# userdel -r opsuser3
[root@server1 home]# userdel -r opsuser4
[root@server1 home]# groupdel opsteam

사용자 암호 Cracking

  • 암호 관리 방안: john the ripper
  • 암호 복잡성 관리 정책: 암호가 복잡할수록 cracking이 어려워지기 때문에 보안 강화

암호가 쉬운 경우

Press 'q' or Ctrl-C to abort, almost any other key for status
kakao1           (kakao1)
1g 0:00:00:10 

암호가 어려운 경우

Remaining 4 password hashes with 4 different salts
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:08:37

사용자 로그인 정보 확인하기

who

  • 기능: 현재 시스템을 사용하는 사용자의 정보 출력

w

  • 기능: 현재 시스템을 사용하는 사용자의 정보와 작업 정보 출력
  • who 명령에서 나온 출력 외의 활동에 대한 정보와 CPU 사용량, 시스템 로드 정보 등이 추가로 출력됨

last

  • 기능: 시스템에 로그인, 로그아웃한 정보를 출력
  • 해당 로그의 파일을 통해 데이터 제공

    last: 로그인 시도 기록
    lastb: 실패한 로그인 시도 기록
    lastlog: Never logged in인 system 계정을 통해 접근 시도한 기록(시간으로 출력됨)


사용자 정보 관리 명령

root 권한 사용하기

  • su (substitution user) 명령을 사용하여 root 계정으로 전환: 모든 권한 부여
  • sudo 명령 사용: 관리자가 지정하는 특정 작업만 수행할 수 있는 권한 부여

sudo 권한 설정하기

vi /etc/sudoers
line 101 kevin	All=(All)	All

sudo 명령 사용 시 주의 사항

1) 일반 사용자에게 모든 권한을 부여하는 것은 매우 위험 ▶ 업무적으로 필요한 권한만 부여 (최소 권한의 원칙)
2) 해당 사용자 계정의 암호가 유출되면 root 계정의 암호가 유출된 것이나 마찬가지
3_ sudo 명령을 사용할 수 있는 사용자의 선정과 명령 선택은 매우 신중하게 처리해야 함 ▶ 권력 남용

만약, jeff 유저에게 시스템을 끄고(shutdown), 재시작(reboot) 할 수 있는 권한이 요구된다.

일반유저 jeff

[jeff@server1 ~]$ shutdown
Must be root.
[jeff@server1 ~]$ systemctl reboot -i
==== AUTHENTICATING FOR org.freedesktop.login1.reboot-multiple-sessions ===

파일 및 디렉터리의 소유자와 소유 그룹 변경하기

  • 파일이나 디렉터리는 해당 파일이나 디렉터리를 생성한 사용자의 계정과 그룹이 소유자와 소유 그룹으로 설정
  • 파일이나 디렉터리의 소유자를 변경할 필요가 있을 때 chown과 chgrp 명령 사용

chown

  • 기능: 파일과 디렉터리의 소유자와 소유 그룹을 변경
[root@server1 ~]# cd LABs
[root@server1 LABs]# ls
d1             john-1.8.0          kubernetes.txt  log_backup.sh        time.sh
fw_disable.sh  john-1.8.0.tar.tar  link_dir        perm
fw_enable.sh   kakao_1to5          linux1          services
index.html     kakao_services      linux.txt       srvmon_20220905.log
[root@server1 LABs]# cp time.sh /home/jeff
[root@server1 LABs]# su - jeff
Last login: Mon Sep  5 16:32:09 KST 2022 from 192.168.56.1 on pts/1
[jeff@server1 ~]$ ./time.sh
-bash: ./time.sh: Permission denied
[jeff@server1 ~]$ exit
logout
[root@server1 LABs]# chown jeff.jeff /home/jeff/time.sh
[root@server1 LABs]# su - jeff
Last login: Mon Sep  5 16:49:35 KST 2022 on pts/1
[jeff@server1 ~]$ ll
total 4
-rwx------. 1 jeff jeff 50 Sep  5 16:49 time.sh
[jeff@server1 ~]$ ./time.sh
------------
Mon Sep  5 16:50:16 KST 2022
   September 2022
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
------------

0개의 댓글