[ 구글 메일로 이메일 발송이 차단되었을 경우 해결 방범 ]

    

1. 반송된 메일 주소에 반송원인과 함께 표시된 구글 고객센터 URL로 접속한다.

<hg*****@gmail.com>: host gmail-smtp-in.l.google.com[108.177.97.27] said:
    550-5.7.1 [59.9.162.64      12] Our system has detected that this message
    is 550-5.7.1 likely unsolicited mail. To reduce the amount of spam sent to
    Gmail, 550-5.7.1 this message has been blocked. Please visit 550-5.7.1
    https://support.google.com/mail/?p=UnsolicitedMessageError 550 5.7.1  for
    more information. x64si3716152pfc.130 - gsmtp (in reply to end of DATA
    command)

 

2. 대부분 계정 해킹으로 인한 대량메일 발송으로 인해 차단되는 경우가 대부분이다.
   아래 안내 페이지의 "대량메일 발신자 가이드라인" 을 선택한다.

 

 

 

3.   우측에 바로가기 메뉴 중 "IP 주소 차단으로 인한 메일반송 문제 해결하기"  를  선택한다.

 

 

 

4. 

 

AB 사용법 - Apache Benchmarking

 

ab는 "Apache HTTP server Benchmarking tool"의 약어로서 아파치 서버의 응답속도를 측정하는 벤치마킹툴이다.

도메인이나 특정 페이지의 응답속도를 측정할 수 있다.

 

 

$./ab -V
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/


 

$./ab -h

Usage: ./ab 【options】 【http://hostname:port/path
Options are:
    -n requests  Number of requests to perform : 벤치마킹을 위한 요청수
    -c concurrency Number of multiple requests to make : 하나의 요청당 체크할 다중 요구수 (기본값 : 1)
    -t timelimit Seconds to max. wait for responses : 제한시간 
    -p postfile  File containg data to POST : POST 할 파일 지정 
    -T content-type Content-type header for POSTing
    -v verbosity    How much troubleshooting info to print : 자세한 헤더정보 출력 (유용함) 
    -w              Print out results in HTML tables : HTML 형태로 출력 (유용함) 
    -i              Use HEAD instead of GET
    -x attributes   String to insert as table attributes
    -y attributes   String to insert as tr attributes
    -z attributes   String to insert as td or th attributes
    -C attribute    Add cookie, eg. 'Apache=1234' (repeatable) : 쿠키 사용시 
    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: zop'
                       Inserted after all normal header lines. (repeatable)
    -A attribute    Add Basic WWW Authentication, the attributes
                       are a colon separated username and password. : 사용자 인증을 요하는 페이지 체크시 아이디:비밀번호
    -P attribute    Add Basic Proxy Authentication, the attributes
                       are a colon separated username and password.
    -X proxy:port   Proxyserver and port number to use
    -V              Print version number and exit
    -k              Use HTTP KeepAlive feature : 하나의 세션을 맺은 상태에서 여러개의 요구가 하나의 세션으로 인식 
    -d              Do not show percentiles served table.
    -S              Do not show confidence estimators and warnings.
    -g filename     Output collected data to gnuplot format file.
    -e filename     Output CSV file with percentages served
    -h              Display usage information (this message)

 

실행방법은  ./ab "http 주소"

* 주의 : 여기서 주의해야 할것은 위와같이 도메인명만 입력할때는 뒤에 "/"를 꼭 붙여야 한다.

 

그럼 실제로 네이버의 응답속도를 체크해자.

출력되는 내용은 아래와 같다.

 

【】# ab http://www.naver.com/
This is ApacheBench, Version 1.3d <$Revision: 1.69 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.naver.com (be patient).....done


; 아파치 버전

Server Software:        Apache                                            


; 도메인명

Server Hostname:        www.naver.com


; 웹서비스 사용 포트

Server Port:            80

 

; 초기문서가 위치하는 웹문서 root(서버내의 절대경로가 아님)

Document Path:          /


; 초기문서의 용량

Document Length:        72226 bytes

 

Concurrency Level:      1


; 응답속도(사실 이값만 확인하면 된다.)

Time taken for tests:   0.016 seconds


; 요구에 응답한 세션수

Complete requests:      1


; 요구에 응답실패한 세션수

Failed requests:        0


; 실패한 에러수

Broken pipe errors:     0


; 총 전송 바이트수

Total transferred:      72539 bytes


; 총 전송한 HTML 바이트수

HTML transferred:       72226 bytes


; 초당 응답요구수

Requests per second:    62.50 【#/sec】 (mean)


; 요구에 응답한 시간 (이값도 중요하다)

Time per request:       16.00 【ms】 (mean)


; 요구에 응답한 시간

Time per request:       16.00 【ms】 (mean, across all concurrent requests)

; 초당 전송 가능한 용량

Transfer rate:          4533.69 【Kbytes/sec】 received

 

=> 응용

1. 1회의 전송을 믿지 못하겠다는 분은 여러번 시도하여 그에대한 평균치를 얻을수 있다.

  ab -n 1 http://www.naver.com/

 

2. 다중세션으로 벤치마킹하여 더욱 신뢰높은 값을 얻는 방법

 ab -c 30 http://www.naver.com/

 

3. 응답속도를 KeepAlive 속성을 활성화하여 테스트하기

 ab -k http://www.naver.com/

 

4. 측정 결과를 HTML 파일로 저장하기

 ab -n 1 -w http://www.naver.com/ > naver.com_test.htm

 

ab 명령어를 이용해서 조금 억지스럽지만 결과값으로 서버의 부하까지도 추측이 가능할 것이다.

 

* ab 실행파일은 아파치를 설치한 디렉토리/bin 에 있습니다.

【root@edu ~】 ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 1024
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4084
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

 

 

 

(1) ulimit 설정상태 확인 
 # ulimit -a 
time(seconds) unlimited 
file(blocks) unlimited 
data(kbytes) 2097148 
stack(kbytes) 8192 
coredump(blocks) unlimited 
nofiles(descriptors) 64 
vmemory(kbytes) unlimited

 

(2) ulimit 설정 항목 변경 
# ulimit -s unlimited 
# ulimit -a 
time(seconds) unlimited 
file(blocks) unlimited 
data(kbytes) 2097148 
stack(kbytes) unlimited 
coredump(blocks) unlimited 
nofiles(descriptors) 64 
vmemory(kbytes) unlimited


(3) ulimit 명령어 Option 
-d maximum size of data segment or heap (in kbytes) 
-f maximum file size (in 512-byte blocks) 
-n maximum file descriptor plus 1 
-s maximum size of stack segment (in kbytes) 
-t maximum CPU time (in seconds) 
-v maximum size of virtual memory (in kbytes)

 

 

===========================================================================

 

#ulimit -a

time(second)
 --> the amount of time that process could use cpu
프로세스가 cpu를 사용할 수 있는 최대시간

file(block)
--> the maximum size of file that process could create it
해당 프로세스가 만들 수 있는 파일의 최대 크기

data 
--> the maximum amount of memory that process could occupy
해당 프로세스가 점유할 수 있는 data의 최대값

stack
--> the maximum amount of memory that process could occupy
해당 프로세스가 점유할 수 있는 stack의 최대값
memory
--> the maximum amount of real memory that process could occupy, and you can  verify this value with RSS column of glance .
해당프로세가 점유할 수 있는 최대 리얼메모리의 크기

 

 

==================================================================================

설정값 적용하기

 

 ulimit -a 값으로 봤을때 open files 기본값이 1024 인데 이값을 증가시키려합니다..

ulimit -n 65536 이런식으로 하면 현재쉘에서만 적용되고 모든 사용자들에게 적용되지 않는걸로 알고있습니다..

 

이럴 경우 요렇게 하면 됩니다. ^^

 

/etc/security/limit.conf 파일 하단에

* - nofile 65535 이런식으로 추가한후에 리부팅 한다

 

[root@pro root]# hdparm -c /dev/hda 

/dev/hda: 
IO_support = 1 (32-bit) 

3.1pro의 경우는 우선 위와 같이 32-bit모드로 되어 있으므로 입출력모드는 별다른 처리가 필요없습니다. 


[root@pro root]# hdparm -d 0 /dev/hda 

/dev/hda: 
setting using_dma to 0 (off) 
using_dma = 0 (off) 

[root@pro root]# hdparm -t /dev/hda 

/dev/hda: 
Timing buffered disk reads: 64 MB in 13.62 sec0nds = 4.70 MB/sec 
[root@pro root]# hdparm -d 1 /dev/hda 

/dev/hda: 
setting using_dma to 1 (on) 
using_dma = 1 (on) 
[root@pro root]# hdparm -t /dev/hda 

/dev/hda: 
Timing buffered disk reads: 64 MB in 3.63 sec0nds = 17.63 MB/sec 

위와 같이 DMA 기능을 사용하지 않는 경우와 사용하는 경우 확인해보았을때 
위와 같이 4배이상 차이가 납니다. 

기본적으로 
[root@pro root]# hdparm -d /dev/hda 

/dev/hda: 
using_dma = 1 (on) 
위와 같이 설정되어 있으므로 별다른 조치가 필요없습니다. 

질문의 답변에 해당하는 명령어는 
# hdparm -t /dev/hda 
입니다. 

지금까지 하드디스크의 IO모드 및 DMA사용여부의 체크 및 테스트 방법에 대하여 알아보았습니다

PAM (Pluggable Authentication Module)
- 사용자 인증을 모듈화 하고 관리자가 응용프로그램들의 사용자 인증 방법을 선택하고 설정할 수 있다.
즉, 사용자를 인증하고 사용자의 서비스에 대한 액세스를 제어하는 모듈이다.

/etc/pam.d - 어플리케이션별 pam설정 파일 위치 디렉토리
/lib/security pam 모듈 디렉토리

기본 형식
[module-type] [control-flag] [module-path] [module-arguments]

module-type : PAM 이 어떤 타입의 인증이 사용될 기성인가를 지정한다. 
- auth : 사용자인증에 사용하며 올바른 패스워드인지 문도 확인하는 절차를 가진다.
- account : 사용자의 접근 허가 여부를 확인하며, 계정만료, 특정 시간대에 접근이 허용되었는지 여부를 확인한다.
- password : 패스워드를 설정하고 확인한다.
- session : 사용자가 인증 받기 전후에 필요한 홈 디렉토리 마운트, 메일박스 생성 등의 유저섹션을 구성하기 위해 부가적인 작업을 수행한다.

control-flag : PAM에서 사용되는 모듈들이 결과에 따라 어떠한 동작을 취해야 하는지를 지시한다.
- required : 인증이 거부되기 전에 PAM이 이 서비스에 등록된 다른 모든 모듈들을 요규함에도 불고하고 실패할 경우 인증을 거부하도록 한다.
- requisite : 이 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부하도록 한다. 
- sufficient : 이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할 경우,  PAM은 인증을 승인한다.
- optional : 이 모듈이 성공 또는 실패하는지는 그 모듈이 서비스에 대한 형식에 유일한 모듈일 경우에 해당한다.(성공 여부는 상관없음)

module-path : PAM에게 어떤 모둘을 사용할 것인지 그리고 그것을 어디서 찾을 지를 알려준다. 대부분 구성은 로그인 구성 파일의 경우와 마찬가지로 모듈의 이름만 가지고 있다. 이와 같은 경우, PAM은 기본 PAM 모듈의 디렉토리에서 (/lib/security) 모듈을 찾는다.

module-arguments : 모듈에게 전달되는 인수를 나타낸다. 각각의 모듈들은 각각의 인수를 가지고 있다.

 

1. pam_nologin.so & pam_securetty.so
- /etc/nologin 파일이 존재하면 root 만 로그인이 가능하고 일반 사용자는 로그인이 거부된다.

 
[root@server3 pam.d]# vi /etc/pam.d/login 
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
- /etc/securetty 파일에 기록된 내용과 비교하여 root 사용자가 로그인 가능한 콘솔을 확인한다.

auth       include      system-auth
account    required     pam_nologin.so 
- 이 설정으로 인해 /etc/nologin 파일이 있으면 사용자들의 접근이 거부된다. 

account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    include      system-auth
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    optional     pam_keyinit.so force revoke


[root@server3 pam.d]# touch /etc/nologin 
- /etc/nologin 파일이 생성되면 root 사용자만 로그인이 가능하다. /etc/nologin 파일의 내용과는 상관없이 파일의 생성 유무만 판단한다.


[root@server3 pam.d]# ls -l /etc/nologin

-rw-r--r-- 1 root root 0  1월 29 11:47 /etc/nologin

 

2. pam_listfile.so
- 임의의 파일에 대해 서비스를 허가 하거나 거부하는 방법을 제공한다.

[root@server3 ~]# vi /etc/pam.d/vsftpd 
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      system-auth
account    include      system-auth
session    include      system-auth
session    required     pam_loginuid.so

참고
- item=user / tty / rhost / ruser / group / shell
아이템을 지정한다. 사용자, 터미널, 원격사용자, 그룹, 쉘 등을 사용할 수 있다.
- sense=deny / allow
센스를 지정한다. allow 또는 deny 값을 넣을 수 있다.
- file=/etc/vsftpd/ftpusers
아이템에 맞는 임의의 파일을 지정한다.
- onerr=succeed / fail
sense 값에 반대로 적어둔다.

 

3. ssh 접속 제한

 


root 계정에 ssh 로그인 금지하기
[root@server3 pam.d]# vi /etc/ssh/sshd_config 
36 # Authentication:
37 
38 #LoginGraceTime 2m
39 #PermitRootLogin yes
40 PermitRootLogin no - ssh 사용시 root로의 접속은 막고 일반 사용사의 접속은 가능하다.(#ssh 10.10.33.2 -l test2)
                                        하지만 접속을 막기 원하는 일반 사용자는 선택할수 없다.    
41 #StrictModes yes
42 #MaxAuthTries 6

-------------------------------------------------------------------

PAM을 사용한 루트 계정 로그인 금지하기

[root@server3 pam.d]# vi /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/sshusers onerr=succeed 
- 이부분을 추가해주고 /etc/ssh/sshusers를 생성해준다.(파일 경로나 이름은 마음대로 설정하면 된다.)

auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so

[root@server3 pam.d]# vi /etc/ssh/sshusers - 파일을 새로 만들어 준다.
test2 - ssh 접속을 제한할 사용자를 입력해준다. 이렇게 해주면 ssh 접속을 원하지 않는 일반 사용자의 접속을 선택해서 막을 수 있다.


 
root 계정에 ssh 로그인 금지하기
[root@server3 pam.d]# vi /etc/ssh/sshd_config 
36 # Authentication:
37 
38 #LoginGraceTime 2m
39 #PermitRootLogin yes
40 PermitRootLogin no - ssh 사용시 root로의 접속은 막고 일반 사용사의 접속은 가능하다.(#ssh 10.10.33.2 -l test2)
                                        하지만 접속을 막기 원하는 일반 사용자는 선택할수 없다.    
41 #StrictModes yes
42 #MaxAuthTries 6

-------------------------------------------------------------------

PAM을 사용한 루트 계정 로그인 금지하기

[root@server3 pam.d]# vi /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/sshusers onerr=succeed 
- 이부분을 추가해주고 /etc/ssh/sshusers를 생성해준다.(파일 경로나 이름은 마음대로 설정하면 된다.)

auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so

[root@server3 pam.d]# vi /etc/ssh/sshusers - 파일을 새로 만들어 준다.
test2 - ssh 접속을 제한할 사용자를 입력해준다. 이렇게 해주면 ssh 접속을 원하지 않는 일반 사용자의 접속을 선택해서 막을

4. pam_rootok.so
- root가 암호 입력없이 해당 서비스에 접근을 허용할 때 사용한다.

 

 

[root@server3 ~]# vi /etc/pam.d/su
#%PAM-1.0

auth            sufficient      pam_rootok.so - 이부분을주석처리하면 root도 su명령어 사용시 패스워드를 입력해야 한다.

# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid
auth            include         system-auth
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
account         include         system-auth
password        include         system-auth
session         include         system-auth
session         optional        pam_xauth.so

5. pam_time.so
- 특정 서비스에 대해 시간대 별로 접근 제어를 한다.


[root@server3 ~]# vi /etc/pam.d/login
#%PAM-1.0
account    required     pam_time.so  - /etc/pam.d/login 파일에 모듈 내용을 추가한다.
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    include      system-auth
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    optional     pam_keyinit.so force revoke

[root@server3 ~]# vi /etc/security/time.conf - pam_time.so 모듈 환경설정 파일이다.

#service;ttys;users;times - 형식에 맞게 추가해준다.
login;tty* & !ttyp*;!root;Al0900-1800 - root 사용자를 제외한 모든 사용자는 매일 09시 부터 18시 까지만 콘솔 로그인이 가능하다.


참고
service : 규칙이 적용될 서비스의 이름을 지정한다. login, sshd 등
tty  : 규칙을 적용할 터미널의 이름을 지정한다. tty*, ttyp*(pts:원격접속터미널)
users : 적용할 사용자 이름을 지정한다.
times : 언제 이 규칙을 적용할 것인가를 지정한다.
(Al : 매일, Mo : 월, Th : 화, We : 수, Th : 목, Fr : 금, Sa : 토, Su : 일, Wk : 주중, Wd : 주말)

!root : root를 제외한 모든 사용자
Al0900-1800 : Al : 매일, 0900-1800 : 09시 부터 18시까지의 시간


예) ssh 일반 사용자, 주중, 09-18 에만 접속가능하게...
[root@server3 ~]# vi /etc/pam.d/sshd
#%PAM-1.0
account    required     pam_time.so
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/sshusers onerr=succeed
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so

[root@server3 ~]# vi /etc/security/time.conf 
sshd;tty* & ttyp*;!root;Wk0900-1600


6. pam_limits.so
- 특정 서비스에 대해 자원을 제한 하거나 제어를 한다. 프로세스 수 및 메모리의 양을 제어하여 로콜에서의 컴파일이나 서비스 거부 공격등을 방지할 수 있다.
- 이 설정이 활성화 되어 있으면 가상 콘솔창에서 로그인 이 거부될 수 있다. 

[root@server3 ~]# vi /etc/pam.d/login
#%PAM-1.0
account    required     pam_limits.so - 모듈의 내용을 추가한다.
account    required     pam_time.so
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    include      system-auth
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    optional     pam_keyinit.so force revoke

[root@server3 ~]# vi /etc/security/limits.conf 
#Each line describes a limit for a user in the form:
#
#<domain>      <type>      <item>         <value> - 형식에 맞게 추가해준다.
test1            hard    maxlogins       3 - test1 사용자는 동시 접속을 3개로 제한한다. 


참고
domain : 사용자 명 또는 와일드카드 *, @group 등을 사용할 수 있다.
type : soft, hard 값을 사용하며, soft limit 는 일반 유저가 변경할 수 있지만, hard limit는 root 사용자만 변경할 수 있다.
item : 아이템을 사용하여 제한한다. (core : 코어파일, data : 데이터, fsize : 파일, rss : 메모리 사이즈, nproc : 프로세스 개수, maxlogins:  동시접속 개수)
value : 제한 값을 지정한다.

 


7. 기타

 
[root@server3 ~]# vi /etc/profile or .bash_profile 
TMOUT=3600
HISTSIZE=50

참고
TMOUT
 : 계정의 접속시간을 제한하는 경우에 추가해준다. 기본 단위는 초(sec)이다.
HISTSIZE : 히스토리 값에 대해서 보안을 강화하기 위하여 변경해준다.

-------------------------------------------------------------------

[root@server3 ~]# vi /etc/security
console
#vc/1
#vc/2 
- 접속을 허용할 터미널만 설정하고 나머지는 주석처리하여 root 사용자의 터미널 접속을 제한한다.

[root@server3 ~]# vi /etc/profile or .bash_profile 
TMOUT=3600
HISTSIZE=50

참고
TMOUT
 : 계정의 접속시간을 제한하는 경우에 추가해준다. 기본 단위는 초(sec)이다.
HISTSIZE : 히스토리 값에 대해서 보안을 강화하기 위하여 변경해준다.

-------------------------------------------------------------------

[root@server3 ~]# vi /etc/security
console
#vc/1
#vc/2 
- 접속을 허용할 터미널만 설정하고 나머지는 주석처리하여 root 사용자의 터미널 접속을 제한한다.



[ 서비스 관리]
CentOS 6이전 버전의 리눅스는 /etc/rc.d/init.d/ 디렉토리에 서비스 관리 스크립트가 존재했다.
하지만 CentOS 7부터는 서비스 관리 스크립트들은 몇몇 서비스를 제외하고 각 서비스 유닛(Unit)으로 변경되었다.
서비스 유닛은 .service 으로 끝나는 파일이며,  systemctl 에 의해 제어된다. 
예전 버전의 서비스를 제어하기 위한  service 명령어 와  systemctl 의 사용법을 비교하면 다음과 같다.





* systemctl은 <TAB>키를 사용한 자동완성 기능을 지능적으로 제공 한다. 예를 들면 systemctl start <TAB>키를 누르면 시작되지 않은 유닛들을 기준으로 자동완성 또는 유닛 리스트를 보여주고, systemctl stop <TAB>키를 누르면 시작된 유닛들을 기준으로 자동완성 또는 유닛 리스트를 보여준다.
* systemctl은 service와 달리 정해진 서비스 명령어외의 사용자 명령어는 제공하지 않는다. 예를 들면 Apache의 설정내역을 테스트하기 위한 configtest 등의 명령은 호환되지 않는다.
부팅 시 서비스 자동시작 여부를 설정하기 위해 사용하는 chkconfig와 systemctl의 명령을 비교해 보자.



[자동 시작 서비스 관리]------------------------------------------------------------------
시스템 부팅 시 자동 시작되는 서비스 리스트를 다음과 같이 확인해 보자.
  
~ ]# systemctl     list-unit-files    --type  service   |   grep enabled
abrt-ccpp.service                           enabled
abrt-oops.service                           enabled
abrt-vmcore.service                         enabled
abrt-xorg.service                           enabled
abrtd.service                               enabled
accounts-daemon.service                     enabled
atd.service                                 enabled
...
  
systemctl을 사용하여 서비스 유닛 중 활성화(enabled)된 서비스 유닛을 나열해 보았다. 각 서비스 유닛을 확인하여 비활성화(disable)로 변경하는 것이 보안 및 시스템 성능 면에서도 필요한 부분이다.
프린트 관련 서비스 cups를 시스템 부팅 시 비활성화 되도록 해보자.
 
 ~ ]# systemctl   disable   cups.service
rm '/etc/systemd/system/multi-user.target.wants/cups.path'
rm '/etc/systemd/system/sockets.target.wants/cups.socket'
rm '/etc/systemd/system/printer.target.wants/cups.service'
  
cups서비스를 비활성화 하면, 관련된 파일이 위와 같이 삭제된다.
다시 cups서비스를 활성화 시켜보자.
  
~ ]# systemctl   enable   cups.service
ln -s '/usr/lib/systemd/system/cups.service' '/etc/systemd/system/printer.target.wants/cups.service'
ln -s '/usr/lib/systemd/system/cups.socket' '/etc/systemd/system/sockets.target.wants/cups.socket'
ln -s '/usr/lib/systemd/system/cups.path' '/etc/systemd/system/multi-user.target.wants/cups.path'
  
cups서비스를 활성화 하면, 관련된 파일을 심볼릭 링크를 건다.


[서비스 시작/상태확인/재시작/종료] ---------------------------------------------------------
서비스를 시작, 재시작, 종료를 다음과 같이해 보도록 하자. 먼저 시작되지 않은 서비스를 조회해 보자.
  
~ ]# systemctl   list-units   --type   service   -a   |  grep   -w    inactive
abrt-vmcore.service           loaded inactive dead    Harvest vmcores for ABRT
alsa-restore.service          loaded inactive dead    Restore Sound Card State
alsa-store.service            loaded inactive dead    Store Sound Card State
...
  
systemctl을 사용하여 서비스 유닛 중 중지된 서비스를 나열해 보았다. 
정지된 서비스 중 파일 및 디렉토리 원격 동기화를 위해 사용하는 rsyncd 서비스를 시작시켜 보자.
 
 ~ ]# systemctl   start   rsyncd
 위와 같이 입력하면 rsyncd 서비스가 시작된 것이다.  서비스 상태를 확인해 보자.
  
]# systemctl status rsyncd
rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled)
   Active: active (running) since 일 2015-04-12 14:00:20 KST; 48s ago
 Main PID: 6379 (rsync)
   CGroup: /system.slice/rsyncd.service
           └─6379 /usr/bin/rsync --daemon --no-detach
 4월 12 14:00:20 localhost.localdomain systemd[1]: Starting fast remote file copy program .....
 ...
 
systemctl의 status명령을 사용하여 위와 같이 서비스 상태를 확인하였다. 서비스에 대한 간단한 설명, 시스템 부팅 시 자동시작 유무, 서비스 데몬 시작일, PID, CGroup, 최근 로그를 확인할 수 있다.
서비스 재시작은 다음과 같이 입력한다.
 
~ ]# systemctl   restart   rsyncd

그리고 서비스를 종료하는 방법은 다음과 같다.
 
~ ]# systemctl stop rsyncd


[ Target(런레벨) 관리] ---------------------------------------------------------------------
CentOS 6이전 버전은 시스템 초기화를 위해 사용하는 0부터 6까지 런 레벨(run level)이 존재했다. 예를 들면 런 레벨 0은 종료, 런 레벨 3은 Text 모드, 런 레벨 5은 Xwindows를 사용한 GUI환경, 런 레벨 6은 리부팅으로 사용되었다. 하지만, CentOS 7에서 사용하는 systemd는 이 런 레벨을 타겟(target) 유닛으로 변경하였다. 기존 버전의 런 레벨과 systemd의 타겟 유닛은 다음 표와 같이 대응된다.


런 레벨 2,3,4는 동일하게 TUI 멀티유저 환경이다. 
예전에 제공하던 runlevel명령어와 telinit 명령어는 호환을 가지며 다음과 같이 대응된다.


현재 런 레벨을 확인하기 위해 다음 명령어를 입력한다.
~ ]# runlevel
N 5
 
예전방식의 런 레벨 5를 확인할 수 있다. systemctl을 사용하여 확인해 보자.
~ ]# systemctl   get-default
graphical.target
 
앞에서 정리한 표와 같이 런 레벨 5와 graphical.target은 동일한 것으로 볼 수 있다.

시스템의 기본 타겟을 변경해 보자.

~ ]# systemctl   set-default   multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'
  
systemctl set-default를 사용하여 multi-user 타겟으로 변경하였다. multi-user 타겟은 예전의 런 레벨 3이다. multi-user 타겟으로 전환해 보자.
 
 ~ ]# systemctl   isolate   multi-user.target
 
 systemctl isolate를 이용하여 multi-user 타겟으로 전환하였다.
변경된 런 레벨을 확인하기 위해 다음 명령어를 입력한다.
 
 ~ ]# runlevel
5 3
  
런 레벨 5에서 3으로 변경된 것을 확인할 수 있다.
systemctl을 사용하여 확인해 보자.
  
~ ]# systemctl get-default
multi-user.target
  
multi-user 타겟으로 변경된 것을 확인할 수 있다.



[기타 마무리 ] ---------------------------------------------------------------------
1. initd 에서  systemd 로 변경.
    - runlevel 확인을 위해  기존 /etc/inittab 을 열어보거나 runlevel 명령을 사용했으나 이제는
      systemctl  get-default  명령으로  확인해야 한다.   기존의 runlevel 3에 해당하던   
      /etc/rc.d/rc3.d 에  해당하던  정보가  /etc/systemd/system 으로 변경되어 실행되는 데몬들의
      항목을 확인할 수 있다.
                  [root@colt357-server etc]# runlevel
                   N 3     
                  [root@colt357-server system]# systemctl  get-default
                   multi-user.target  
             (*  ps,  runlevel 5 는  graphical.target  참조. )

2. runlevel 변경하기 
    -  /etc/systemd/system  경로의  심볼릭 링크로 걸려있는  default.target 으로 결려있는 대상을 
       변경하고자하는  target 으로 변경한다.
drwxr-xr-x. 2 root root   56  1월 11 16:09 basic.target.wants
lrwxrwxrwx. 1 root root   41  1월 11 16:09 dbus-org.fedoraproject.FirewallD1.service -> /usr/lib/systemd/system/firewalld.service
lrwxrwxrwx. 1 root root   46  1월 11 16:09 dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root   57  1월 11 16:09 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   37  1월 11 16:12 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   87  1월 11 16:09 default.target.wants
drwxr-xr-x. 2 root root   38  1월 11 16:09 dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants
drwxr-xr-x. 2 root root   32  1월 11 16:09 getty.target.wants
drwxr-xr-x. 2 root root 4096  1월 11 16:12 multi-user.target.wants
drwxr-xr-x. 2 root root   31  1월 11 16:09 remote-fs.target.wants
drwxr-xr-x. 2 root root  115  1월 11 16:09 sockets.target.wants
drwxr-xr-x. 2 root root   26  1월 11 16:09 sssd.service.d
drwxr-xr-x. 2 root root  169  1월 11 16:09 sysinit.target.wants
drwxr-xr-x. 2 root root   44  1월 11 16:09 system-update.target.wants















CentOS 7부터는 Single 모드로 들어가면 비밀번호를 요구한다. 
그래서 다음과 같은 방법을 사용해야 한다. 커널 옵션 값을 single이 아닌 init=/bin/bash(또는 init=/bin/sh)를 넣어야 한다.
옵션 값에 single을 넣게되면 root 비밀번호를 입력해야 쉘 환경으로 진입할 수 있다.

응급복구모드로 부팅하게 되면 인증 없이 root 권한을 가진 쉘 환경으로 부팅되며, 쉘 환경에서
root 비밀번호를 변경하면 비밀번호를 잊어버렸을 때에도 쉽게 변경할 수 있다.
단, 컴퓨터를 리부팅(<Ctrl>+<Alt>+<Del> 키를 입력하여 리부팅 할 것을 권장)해야한다는 문제는 있다.
위 “2. 커널 옵션 값 입력”과정에서 옵션으로 다음 그림과 같이 입력한다.

 rhgb quiet LANG=ko_KR.UTF-8을 삭제하고 init=/bin/bash를 입력한다.
rhgb 및 quiet를 삭제하지 않으면 키보드 입력에 문제가 생길 것이다.
입력 후에는 <Ctrl> + x 키를 입력하여 부팅한다.

부팅이 완료되면  root권한의 쉘 환경으로 부팅될 것이다. 기본적으로 부팅되면서 파일시스템은 읽기전용으로 마운트된다. 
이 부분을 읽기/쓰기 가능하게 mount -o remount,rw / 명령을 사용하여 다시 마운트 한다.

다음으로 passwd명령어를 입력한다. 새로운 비밀번호(New password:)입력부분에 변경하고자하는 root 비밀번호를 입력하고, 비밀번호 재입력(Retype new password:) 부분에 다시 한번 변경하고자하는 비밀번호를 입력한다. 변경이 정상적으로 완료되었으면 passwd: all authentication tokens updated successfully. 메시지를 출력할 것이다. 

변경 완료되었다면 부팅시 파일의 SELinux 컨텍스트 변경을 확정하기 위해 touch /.autorelabel을 입력한다. 다음으로 exit 또는 exec /sbin/reboot 명령어를 사용하여 시스템을 리부팅한다.


(참고) 비밀번호 변경하고 touch /.autorelabel을 입력하지 않은 경우 부팅은 정상적으로 되지만 root 비밀번호는 변경되지 않았을 것이다.
(참고) SElinux 를   disabled 로 설정하고 진행하여야 한다.



'배워서 남주자 > System 관리' 카테고리의 다른 글

[사용자 보안] PAM  (0) 2018.03.23
[서비스 관리] systemclt  (1) 2018.03.23
[시간/날짜 설정] timedatectl  (0) 2018.03.23
[로케일 설정] Locale 설정  (0) 2018.03.23
[사용자 관리] 시스템 사용자 관리  (0) 2018.03.23

[ 시간 /  날짜  설정 ]
1. 날짜와 시간을  모두 설정하기
   [root@vm-colt357 ~]# timedatectl  set-time "2017-01-13  14:15:35"

2. 날짜만 설정하기
   [root@vm-colt357 ~]# timedatectl  set-time "2017-01-13"

3. 시간만 설정하기
   [root@vm-colt357 ~]# timedatectl  set-time "14:15:35"

[ 시간대(Time zone) 변경 ]
1. 지원하는 시간대 확인하기
    시간대 정보가 너무 많아 파이프(|)와  grep 명령으로 Asia 또는  Seoul 지역만을 걸러낸다.
   [root@vm-colt357 ~]# timedatectl  list-timezones | grep Seoul
   Asia/Seoul

2. 리스트 중 변경하고자 하는 시간대를 다음과 같이 입력한다.
   [root@vm-colt357 ~]# timedatectl  set-timezone Asia/Segoul

[ RTC(하드웨어 시계) 시간 설정 ]
1. 하드웨어 시계의 시간을 설정하기 위해서는 다음과 같은 과정을 거쳐서 설정한다.
   [root@vm-colt357 ~]# timedatectl  set-local-rtc  yes
   [root@vm-colt357 ~]# timedatectl  set-time  "2017-01-13  14:15:35"
   [root@vm-colt357 ~]# timedatectl  
set-local-rtc  no
 -> 먼저, 시스템에서 하드웨어 시계를 사용하게 설정하고, 날짜와 시간을 설정 한 다음, 시스템에서 
      하드웨어 시계를 사용하지 않게 하는 것이다.  물론 시간을 맞우는 과정에서 ntpdate,  rdate  명령
      을 사요하여 동기화할 수 있다.
 -> RTC 타임 세팅은, 개인적으로 기존의 centos6 방식이 더 편하다.
     * 시스템 시간을 하드웨어 시간으로 설정.
           [root@vm-colt357 ~]#  hwclock -w
     * 하드웨어 시간을 시스템 시간으로 설정.
          [root@vm-colt357 ~]# hwclock -s



로케일(locale)은 사용자의 언어, 구가, 숫자 형식, 날짜/시간 형식, 시간대,  통화형식을 설정하고 있는 변수 모임이다. 이로케일은  RFC 3066에 정의되어 있다.
로케일의 설정에 따란  동일한 명령어의 결과가 다른 언어로 표시되기도 한다.

[root@vm-colt357 ~]# locale --help 
사용법: locale[옵션...] <이름> 
  혹은:  locale[옵션...] [-a|-m] 
로캘 관련 정보를 읽습니다. 

 시스템 정보: 
  -a, --all-locales          사용 가능한 로캘의 이름을  표시합니다 
  -m, --charmaps         사용 가능한 문자맵의 이름들을  출력합니다 

 출력 형식 수정: 
  -c, --category-name        사용 가능한 범주의 이름을 표시합니다 
  -k, --keyword-name         선택한 키워드의 이름을 표시합니다 
  -v, --verbose              더 많은 정보를 표시합니다 

  -?, --help                 이 도움말 리스트를 표시함 
      --usage                간략한 사용법 메시지를 표시함 
  -V, --version              프로그램 버전 표시

한국, 한국어, UTF-8 사용을 위한 기본 설정은 "ko_KR.UTF-8"이다.

     [root@vm-colt357 ~]# LANG=ko_KR.UTF-8   --> 기존  centos 6 에서의 설정 방법


centos 7  에서의 설정 방법.

     [root@vm-colt357 ~]# localectl    
     \   System Locale: LANG=ko_KR.UTF-8 
            VC Keymap: kr 
            X11 Layout: kr

    --> 로케일 및 키보드 관련 부분에도 새로운 명령어인 localectl 을 제공한다. 로케일 설정은 /etc/clcale.conf 에 저장
          되고,  centos 6 이하 버전에서 사용하던 /etc/sysconfig/i18n은 더 이상 찾아볼 수 없다.
  
 로케일 설정.
     [root@vm-colt357 ~]# localectl  set-locale  "LANG=ko_KR.UTF-8"



Passwd 파일에서 사용자 계정만 확인하기
~] # cat /etc/passwd | awk -F: '{if($3>=1000 && $3<=60000)print $0}'
doly:x:1000:1000:doly:/home/doly:/bin/bash
colt357:x:1001:1001:홍길동:/home/colt357:/bin/bash

cat 명령어를 사용하여 /etc/passwd 파일을 표준 출력(stdout)으로 출력하고 파이프(|)를 통해 awk(라인 단위 패턴 스캐닝 및 처리 언어) 명령의 표준 입력(stdin)으로 보낸다. -F 옵션을 사용하여 구분자를 “:”으로 지정한다. “:”으로 구분했을 때 3번째 항목($3)이 1000보다 크고 60000보다 적을 경우 라인의 모든내용($0)을 출력하라는 것이다. 
CentOS7 부터는 기본적으로 UID를 1000에서 60000까지 사용하도록 /etc/login.defs에 설정되어 있다



사용자 추가시 홈 디렉토리에 생성되는 파일
사용자 추가시 생성되는 홈디렉토리에는 다음과 같은 파일들이 생성되어 있을 것이다. 다음은 wyjung
 사용자의 홈디렉토리를 확인해 본 것이다.


~] # ls -Al /home/colt357/
합계 12
-rw-r--r--. 1 colt357 colt357  18  6월 10 13:31 .bash_logout
-rw-r--r--. 1 colt357 colt357 193  6월 10 13:31 .bash_profile
-rw-r--r--. 1 colt357 colt357 231  6월 10 13:31 .bashrc
...
ls 명령어에 -Al옵션을 사용하여 colt357 사용자의 홈디렉토리(/home/colt357/)의 파일 및 디렉토리를 확인하였다. 다음 파일들이 있다.
.bash_logout : 로그아웃 할 때 실행되는 파일이다.
.bash_profile : 로그인시 실행되는 파일이다. 
.bashrc : .bash_profile에 의해 실행되며 주로 alias나 함수등을 설정한다.

위 3개의 파일은 사용자를 추가할 때마다 생성된다. 시스템에 따라 위 3개의 파일보다 더 많은 파일, 디렉토리가 생성될 수 도 있다. 이는 사용자 생성시 기본적으로 복사되는 파일 및 디렉토리이며, /etc/skel/ 디렉토리에 파일 및 디렉토리가 사용된다. 

~] # ls -Al /etc/skel/
합계 12
-rw-r--r--. 1 root root  18  6월 10 13:31 .bash_logout
-rw-r--r--. 1 root root 193  6월 10 13:31 .bash_profile
-rw-r--r--. 1 root root 231  6월 10 13:31 .bashrc
...

위 3개 또는 그 이상의 파일 및 디렉토리를 열어보면 사용자 홈디렉토리에 존재하는 파일과 내용일 동일한 것을 확인할 수 있다.
위 3개의 파일을 수정하면 사용자 생성시 수정된 파일을 복사해 사용하게 될것이다.


계정 정보 확인
~] # chage -l colt357
마지막으로 암호를 바꾼 날                                       : 7월 16, 2014
암호 만료                                       :안함
암호가 비활성화 기간                                    :안함
계정 만료                                               :안함
...
chage 명령어에 -l 옵션을 사용하여 계정 만료일 등을 알 수 있다.

- 계정이 기간 만기되도록 함(E)
~] # usermod 
colt357 -e 2014-09-10
위와 같이 설정하면 wyjung 계정은 2014년 9월 10일에 만료되도록 하는 것이다.
- 계정을 잠금 / 해제
~] # passwd -l 
colt357
colt357 사용자의 비밀 번호 잠금
passwd: 성공
~] # passwd -u 
colt357
colt357 사용자의 비밀 번호 잠금 해제 중
passwd: 성공

위와 같이 passwd 명령어를 사용하여 -l 옵션으로 colt357 사용자를 로그인 못하도록 잠금거나 -u 옵션을 사용하여 해제 할 수 있다.


[비밀번호 보안 정책]
많은 보안 권고사항을 보면 비밀번호는 적어도 3개월에 한번찍 변경하게 하고 있다. 여러 보안 점검에서 사용자 비밀번호를 3개월 마다 변경하게 강제하고 있고 모든 사용자에게 설정해야 한다. 앞에서 설명한 것은 사용자들 마다 비밀번호 강제 변경주기를 설정하였지만 다음과 같이 설정하여 기본적으로 적용할 수 있다.

/etc/login.defs 파일을 열어 다음과 같이 수정한다.

PASS_MAX_DAYS   90
PASS_MIN_DAYS   0
PASS_MIN_LEN    8
PASS_WARN_AGE   7

위 설정에 대한 의미는 다음과 같다.
PASS_MAX_DAYS : 암호를 변경하지 않고 사용할 수 있는 유효기간   기본 값은 99999일이며, 권장은 3개월(약 90일)이다. 
PASS_MIN_DAYS   : 암호를 변경할 수 있는 최소 기간이며   암호는 자주 변경해도 무관하니 제한이 없는 기본값 0으로 둔다.
PASS_MIN_LEN   : 암호 최소 길이이다.   암호 최소 길이는 기본 5자 이상이며, 권장은 8자 이상이다.
PASS_WARN_AGE   : 암호 유효기간이 끝나기 전에 경고 메시지를 보여줄  날수를 설정한다. 기본 7일이며 기본값을 유지한다.

그 밖에 /etc/login.defs 에는 메일관련(메일큐 디렉토리, 메일박스 디렉토리, 메일파일)설정과 사용자 UID범위, 시스템 사용자 UID범위, 그룹 GID범위, 시스템 그룹 GID범위, 사용자 삭제시 실행할 사용자 프로그램 지정, 사용자 생성시 사용자 홈디렉토리 생성 유무 및 UMASK등을 설정할 수 있다. 사용자 삭제시 사용자 그룹의 멤버가 없다면 그룹까지 삭제할지 유무도 여기서 설정한다. /etc/login.defs 파일을 열어보면 위 기능에 대해 상세히 설명되어 있다.

그룹(G) 탭을 확인해 보자.
시스템에 등록된 전체 그룹리스트가 나타나고 원하는 그룹을 선택하여 소속시킬 수 있다. 기본 그룹을 변경할 수 도 있다. 
위 설정을 명령어를 이용한다면 다음과 같이할 수 있다.

사용자가 속한 그룹 확인
다음 명령어로 특정 사용자가 속한 그룹을 확인할 수 있다.

~] # groups colt357
colt357 colt357 superuser

groups 명령어로 사용자가 속한 그룹을 확인하였다.

사용자가 속한 그룹 추가
다음 명령어로 사용자가 속한 그룹을 추가할 수 있다.

~] # usermod -a -G  master  colt357
~] # groups colt357
colt357 colt357 master  superuser

usermod의 -G 옵션을 사용하여 소속 그룹을 설정하였다. 만약 -G 옵션만 준다면 소속된 그룹이 “master"로 변경될 것이다. -a (추가) 옵션을 주어 기존 그룹은 유지하면서 "master"그룹에 추가하도록 한 것이다.


사용자가 속한 그룹 제거
사용자가 속한 그룹에서 특정 그룹만 제거하는 것은 아무리 찾아보아도 옵션을 제공하지 않았다. 다음과 같은 방법으로 제거할 수 있다.


~] # groups colt357
colt357 colt357 master superuser wheel
~] # usermod -G superuser,wheel colt357
~] # groups colt357
colt357 : colt357 superuser wheel

위 예는 groups 명령어를 이용하여 소속된 그룹을 확인하였고 usermod의 -G옵션을 이용하여 사용자의 소속그룹을 재설정한다. groups명령으로 확인한 소속그룹중 제거하고자 하는 그룹만을 빼고 “,”로 구분하여 모두 입력한다. 이러한 방법으로 소속 그룹을 제거할 수 밖에 없다. 

사용자의 기본(primary) 그룹 변경
사용자의 기본그룹은 다음과 같이 변경할 수 있다.

~] # groups colt357
colt357 : colt357 superuser
 ~] # usermod -g master colt357
 ~] # groups colt357
colt357 : master superuser

groups명령어 입력시 처음에 보여주는 것이 기본 그룹이다. 기본그룹을 바꾸기 위해 usermod의 -g 옵션을 사용하여 "master"로 변경하였다. 변경된 기본그룹을 groups 명령어로 확인하고 있다.



+ Recent posts