카테고리 보관물: study

RPM 패키지 만들기 실습

사전 작업

프로그램 작성

실습을 위해 world를 출력하는 hello 스크립트를 작성해보자.

mkdir hello-1.0.0
cat <<EOF > hello-1.0.0/hello
#!/bin/bash
echo world
EOF
sh hello-1.0.0/hello
[builduser@jmnote ~]$ mkdir hello-1.0.0
[builduser@jmnote ~]$ cat <<EOF > hello-1.0.0/hello
> #!/bin/bash
> echo world
> EOF
[builduser@jmnote ~]$ sh hello-1.0.0/hello
world

압축

[builduser@jmnote ~]$ tar czvf hello-1.0.0.tar.gz hello-1.0.0/
hello-1.0.0/
hello-1.0.0/hello

SPEC 파일 작성

 hello.spec 문서를 참고하십시오.

hello.spec 파일(새파일)을 열어서 hello.spec의 내용으로 채우고 저장.

[builduser@jmnote ~]$ vi hello.spec

rpm 빌드

[builduser@jmnote ~]$ rpmbuild hello.spec
error: File /home/builduser/rpmbuild/SOURCES/hello-1.0.0.tar.gz: No such file or directory
→ 빌드를 위한 폴더 구조를 만들기 위해 rpmbuild를 실행 (오류 발생하지만 무시)
[builduser@jmnote ~]$ cp hello-1.0.0.tar.gz rpmbuild/SOURCES/
[builduser@jmnote ~]$ cp hello.spec rpmbuild/SPECS/
[builduser@jmnote ~]$ cd rpmbuild/SPECS/
[builduser@jmnote SPECS]$ rpmbuild --sign -ba hello.spec
Enter pass phrase:
 rpm-build를 위한 GPG Key 생성에서 입력했던 Passphrase 값 입력
Pass phrase is good.
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.hUcv0F
+ umask 022
+ cd /home/builduser/rpmbuild/BUILD
+ cd /home/builduser/rpmbuild/BUILD
... (생략)
+ cd hello-1.0.0
+ rm -rf /home/builduser/rpmbuild/BUILDROOT/hello-1.0.0-1.el6.x86_64
+ exit 0
[builduser@jmnote SPECS]$ cd ../RPMS/x86_64/
[builduser@jmnote x86_64]$ ll
total 4
-rw-rw-r--. 1 builduser builduser 2546 May 17 02:24 hello-1.0.0-1.el6.x86_64.rpm
→ 그럴싸한 rpm 파일이 생성되었다.

rpm 설치 및 확인

  • root 계정에서 진행
[root@zetawiki ~]# rpm --import /home/builduser/RPM-GPG-KEY-builduser
[root@zetawiki ~]# cp /home/builduser/rpmbuild/RPMS/x86_64/hello-1.0.0-1.el6.x86_64.rpm ~
[root@zetawiki ~]# rpm -ivh hello-1.0.0-1.el6.x86_64.rpm
Preparing...                ########################################### [100%]
   1:hello                  ########################################### [100%]
[root@zetawiki ~]# rpm -qa hello
hello-1.0.0-1.el6.x86_64
[root@zetawiki ~]# which hello
/usr/local/bin/hello
[root@zetawiki ~]# rpm -qf /usr/local/bin/hello
hello-1.0.0-1.el6.x86_64
[root@zetawiki ~]# hello
world

같이 보기

YUM 저장소 만들기 실습

사전 작업

긴 실습 (rpm 만들기 포함)
짧은 실습 (rpm 만들기 미포함)[1]

저장소 생성

  • DOCUMENT_ROOT 아래에 /repo/Packages 폴더를 만든다.
[root@zetawiki ~]# mkdir -p /var/www/html/repo/Packages
[root@zetawiki ~]# cp hello-1.0.0-1.el6.x86_64.rpm /var/www/html/repo/Packages/
[root@zetawiki ~]# createrepo -v /var/www/html/repo/
Spawning worker 0 with 1 pkgs
Worker 0: reading Packages/hello-1.0.0-1.el6.x86_64.rpm
Workers Finished
Gathering worker results
 
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Starting other db creation: Sun Jun  8 14:39:05 2014
Ending other db creation: Sun Jun  8 14:39:05 2014
Starting filelists db creation: Sun Jun  8 14:39:05 2014
Ending filelists db creation: Sun Jun  8 14:39:05 2014
Starting primary db creation: Sun Jun  8 14:39:05 2014
Ending primary db creation: Sun Jun  8 14:39:05 2014
Sqlite DBs complete
[root@zetawiki ~]# cp /home/builduser/RPM-GPG-KEY-builduser /var/www/html/repo/
[root@zetawiki ~]# curl http://127.0.0.1/repo/RPM-GPG-KEY-builduser
-----BEGIN PGP PUBLIC KEY BLOCK-----
... (생략)
-----END PGP PUBLIC KEY BLOCK-----

다른 컴퓨터에서 테스트

접속 확인

[root@CentOS63 ~]# nc -z 135.79.246.80 80
Connection to 135.79.246.80 80 port [tcp/http] succeeded!
[root@CentOS63 ~]# curl http://135.79.246.80/repo/RPM-GPG-KEY-builduser
-----BEGIN PGP PUBLIC KEY BLOCK-----
... (생략)
-----END PGP PUBLIC KEY BLOCK-----

repo 등록

echo '[my-first-repo]
name=My First Repo
baseurl=http://서버주소/repo
gpgkey=http://서버주소/repo/RPM-GPG-KEY-builduser
enabled=1
gpgcheck=1' > /etc/yum.repos.d/my-first-repo.repo
yum repolist
[root@CentOS63 ~]# echo '[my-first-repo]
> name=My First Repo
> baseurl=http://135.79.246.80/repo
> gpgkey=http://135.79.246.80/repo/RPM-GPG-KEY-builduser
> enabled=1
> gpgcheck=1' > /etc/yum.repos.d/my-first-repo.repo
[root@CentOS63 ~]# yum repolist
... (생략)
repo id        repo name                                        status
base           CentOS-6 - Base                                   6,367
epel           Extra Packages for Enterprise Linux 6 - x86_64   10,899
extras         CentOS-6 - Extras                                    14
my-first-repo  My First Repo                                         1
updates        CentOS-6 - Updates                                1,009
repolist: 18,290
→ 패키지를 1개 가진 my-first-repo가 보인다.

hello 패키지 설치

======================================================================
 Package     Arch         Version           Repository           Size
======================================================================
Installing:
 hello       x86_64       1.0.0-1.el6       my-first-repo       2.5 k
 
Transaction Summary
======================================================================
Install       1 Package(s)
 
Total download size: 2.5 k
Installed size: 23  
Is this ok [y/N]: y
... (생략)
Installed:
  hello.x86_64 0:1.0.0-1.el6                                          
 
Complete!
[root@zetawiki ~]# rpm -qa hello
hello-1.0.0-1.el6.x86_64
[root@zetawiki ~]# hello
world

같이 보기

DNS named.conf 최적화

7.1 설정 최적화 검사

http://www.serverchk.com/

http://www.dnsreport.com/에서 검사

 

# named-checkconf /etc/named.conf

named.conf설정내용 사전오류검사 명령어임. 오류가 없을시 아무것도 나오지 않는다.

 

7.2Options 튜닝하기

 

Bind8이 보안상 취약하여 Bind8에서 사용하는 옵션이 대부분입니다.

Bind9버전에서는 일부분은 보안취약점이 개선되어 기본으로 적용되어 있어 오류로 표시되는 옵션이 있으므로,

messages파일보고 불필요하면 제거하도록 한다. (진한 부분은 공통으로 설정이 필요한부분이다.)

 

# vi/etc/ Named.conf

 

options {

directory “/var/named”;

named 데몬이 인식하는 기본 디렉토리를 지정함. 해당디렉토리에 zone File존재

// pid-file “/var/named/named.pid”;// named pid 파일을 남길 위치

// statistics-file “/var/named/named.stats”;// 통계정보를 남길 위치

memstatistics-file “/var/named/named.memstats”; // 메모리 통계정보 파일을 위치

dump-file “/var/adm/named.dump”; // 네임서버의 메모리 상태 정보 파일 위치

 

version “Unknown !!”;

#dig @203.231.124.14 txt chaos version.bind 로 원격에서 Bind버전 확인시후, 보안취약점을 이용해 공격할수 있음으로 보안상 사용 Bind버전을 안보이게함.

 

edns-udp-size 512 ;

EDNS등사용시 512k가 넘어 Pix-Firewall등에서 Drop되는 부분을 해결하는 부분

dns-udp사이즈를 512가 넘지 않도록 제한 설정하는것임.

DNS의 udp패킷사이즈가 512가 넘으면 tcp패킷으로 넘어감.

 

check-names master ignore ;// 필수 권장설정

check-names slave ignore ;// 권장설정

자신이 master인경우 존파일 이름 검사를 무시한다.

기본값 Fail임. RFC에 어긋나는 설정(언더바(_)등)이 있는 zone파일의 경우는 해당 도메인이 정상적으로 동작하지 않게 되므로, 반드시 ignore로 설정을 변경해야한다.

예전 4.9.4이전, 9.1.0이내의 Bind에서는 이름검사가 구현되지 않았다.

에러 형식:

May 11 08:55:46 ns1 named[28399]: owner name “chungju_s.s.co.kr” IN (primary) is invalid – rejecting
May 11 08:55:46 ns1 named[28399]: s.co.kr:200: owner name error

 

다음은 버전8의 기본값

check-names master fail; // 언더바가 들어가더라도 현재는 정상 응답한다

check-names slave warn; // 언더바가 들어가더라도 현재는 경고만 보내주고 응답한다

Check-names response ignore;// 언더바가 들어가더라도 현재는 정상 응답한다

오류에 대해 무시하고 질의에 대한 응답을 하도록 한다.

 

 

Check-names response ignore;

디폴트가 ignore이므로 설정을 하지 않아도 된다.

이름을 질의해왔을경우 응답이 RFC규약을 따르지 않는 응답이라도 무시하고 응답한다.

Check-names response fail; 이라면, 응답이 RFC규약에 어긋나면 응답거부하기 때문에 해당 네임서버에 언더바(_)가 들어간 사이트를 질의한경우 접속이 안된다.

> drop_b.yejin.pe.krcom

Server:ns.yejin.pe.krcom

Address:203.231.124.14

*** ns.yejin.pe.krcom can’t find drop_b.yejin.pe.krcom: Query refused

 

notify no;

Bind 8,9는 DNS notify yes가 기본임.

Zone transfer request 도스공격방지를 위한 보안설정임.

존 업데이트에 대한 notify 메시지를 사용하지 않음.

notify메시지 => Master서버가 영역정보가 바뀌었을때 Slave서버에게 알리는 메시지

단점: Slave가 업데이트하는데 TTL시간까지 기다려야함.

 

Allow-notify { 203.231.124.15; };

192.168.0.1이 notify메시지를 보낼수 있도록 허용함.

주 마스터네임서버가 아닌 다른네임서버로부터 오는 NOTIFY메시지를 수신허용.

 

multiple-cnames yes;

Cname을 여러개 사용가능하도록 설정함.

 

maintain-ixfr-base yes;

주 마스터네임서버는 시리얼 번호가 증가할때마다 슬레이브에 Notify를 알려준다.

슬레이브서버는 알림을 받을때마다, 마스터네임서버의 영역시리얼 번호를 확인해 상황에 따라 전체 영역전송한다. 동적 업데이트가 매우 빈번하게 발생하는 큰 영역을 운영하는경우는 문제가 되어 증진적 영역전송(IXFR) 이라는 개념이 나왔다.

Bind 8.2.3 , Bind 9 이상에서 동작하며, 변경된 정보만 영역전송를 진행한다.

동적업데이트를 이용해 영역데이터를 수정할 때만 문제없이 잘 동작한다.

 

transfer-format many-answers;

전형적인 영역전송은 각 dns 메시지에 하나의 리소스 레코드를 담고 있는데 이것은 공간 낭비이다. 이러한 문제를 해결 하기 위해 설정한다.

단점은 영역전송이 실제로 새로운 형식을 이용해 시간이 더 오래 걸릴수 있다.

대역폭이나 CPU사용량의 관점에서는 효율적이나 시간이 더 오래걸려 완료된다.

슬레이브의 대부분이 BIND8이나 9 또는 MS DNS서버를 운영하고 있다면 권장설정임.

 

serial-queries 100 ;

slave의 빠른 업데이트를 위해 soa 쿼리를 100까지 설정한다.

 

listen-on { 203.231.124/24; };

네임서버가 어떤 네트워크 인터페이스를 청취하면서 질의를 기다리 것인지를 명시

 

};

 

 

7.3 Bind버전확인하기

# dig txt chaos version.bind.

dig @200.1.1.1 txt chaos version.bind.

 

7.4 질의제한:

7.4.1 해당 DNS서버의 named.conf 에 질의를 허용할 IP블록을 등록한다.

# more/etc/named.conf

options {

directory “/var/named”;

allow-query { 203.231.124.14; 200.1.1.1/24; };//자체네임서버는 들어가야함.

};

 

7.5 개별도메인에 Notify허용법

named.conf 의 option부분에notify no; 라고 한경우 Master가 Slave에 정보변경시 바로 notify를 하지 않고, SOA레코더값이 지정되어 있는시간에 전송요청을 한다.

만약  option부분에는 no로 되어 있으나 특정도메인은 notify목록에 추가하려면zone구문에서 also-notify라는 서버구문을 이용한다.

 

zone “congress.go.kr” {

allow-update { none; };

allow-transfer { 127.0.0.1; 10.201.27.3; 10.201.14.45; };

allow-query { any; };

notify yes;

also-notify { 10.201.27.3; };//자신의 슬레이브에 변경을 알려주도록 설정.

allow-transfer { none; };

};

 

7.6IXFR – BIND 8.2.3이상, 다음은 BIND8에서의 IXFR설정법입니다.

동적 업데이트만 이용해 영역데이터를 수정할때만 문제없이 동작

options {

maintain-ixfr-base yes;

max-ixfr-log-size 1M;

};

server 200.1.1.110 {

support-ixfr yes;

};

 

 

7.7 포워더 설정.

options {

forwarders { 168.126.63.1; 203.255.112.34; };

};

도메인 질의에 대한 포워딩

1) 캐시 데이터베이스에 있다면 이 정보를 대답한다.

2) 캐시에 없으면, 네임서버는 질의를 포워더에 보내고 대답을 기다린다.

3) 응답이 오지 않으면, 정상적인 동작을 다시 개시해 원격서버에 접속하게 된다.

 

options {

forwarders { 168.126.63.1; };

forward only;

};

도메인 질의에 대한 포워딩

1) 캐시 데이터베이스에 있다면 이 정보를 대답한다.

2) 캐시에 없으면, 네임서버는 질의를 포워더에 보내고 대답을 기다린다.

3) 응답이 오지 않으면, 응답을 하지 못한다.

 

7.8 영역포워드 – (BIND 8.2부터, BIND 9.1.0부터)

7.8.1  귀하의 Cache DNs에서 yejin.pe.kr사이트만 정상적으로 레졸루션 되지 않을시 우선조치

해당 사이트 질의시 다른 네임서버에게 포워드하여 해당 네임서버가 응답하도록함.

zone ” yejin.pe.kr ” IN {
type forward ;
forwarders { 168.126.63.1; };};

 

7.8.2 Yahoo.com등 특정사이트가 접속이 안될때 -Name:www.yahoo.akadns.net

네임서버에서 yahoo의 네임서버인 akaff 찾을땐 특정 IP로 포워드 한다.

Forward하는법.

Zone “akadns.net” IN {
        type forward ;        forwarders { 65.203.234.27; 193.45.1.103; 63.209.170.136; 80.67.67.182; 63.241.73.214; 206.132.100.108; };
};

 

7.8.3 설정 파일 전체에 영향을 미치는 options구문속의 forwarder설정을 무력화시키기.

 

로컬에 있는 도메인을 forwarder인 외부에 질의하게 되는 부분을 해결.

options {

type forward ;forwarders { 203.255.112.34; 203.255.117.34; };

};

 

zone ” yejin.pe.kr ” IN {
type forward ;
forwarders { };
};

 

7.9 비재귀적 네임서버 (네임서버 전용인 경우 설정함)

options {

recursion no;

No: 자신이 호스팅하고 있는 도메인에 대한 DNS응답만 처리한다.
no로 하면 일반 질의에 대한 응답을 하지 않음. 설정에 주의해야한다.

네입서버 전용으로사용하는경우 설정됨. Cache DNS로는 사용못함.

OPEN DNS취약점 해결됨. 주의점:  resolve.conf에 외부 DNS를 지정해야함. 예;168.126.63.1

 

Yes : 일반적인 도메인서버로 사용하는것이다..

 

options {

fetch-glue no ;

질의에 대한 응답값으로 NS레코드는 있지만, 해당 네임서버의 A레코드가 없을경우 이IP를 다시 찾기위해 질의를 한다. 이경우 Cache poisoning될수 있는 여지가 있어 no로 설정하여 질의를 하지 않게 한다.  Bind8만 설정 필요, 9는 기본적으로 no로 동작함.

 

 

7.10 엉터리 네임서버 이용금지. – blackhole설정

이 목록에 있는 네임 서버에는 질의를 보내지도 않고 이들이 보내는 질의에도 응답하지 않는다.

목록에 있는 네임서버에는 질의를 보내지도 않고, 보내는 질의에도 응답하지 않는다

blackhole {

210.116.96.112/32;

};

또는

blackhole {

bogon;

};

acl “bogon” {

0.0.0.0/8;

10.0.0.0/8;

192.168.0.0/16;

};

bogon 네트워크 : IANA에 의해 테스트, 멀티케스트, 또는 실험목적을 위해 예약된 아이피

네트워크에 실제로 존재하지 않는 bogon ACL 대역에서 오는 query를 drop 시킴

 

 

7.11네임서버별 영역전송 개수 제한

transfers-per-ns 4;

네임서버가 하나의 원격네임서버로부터 얼마나 많은 영역을 요청 받는지 제한한다.

주로 bind8에서 사용, 사용하지 않아도됨.

 

7.12 영역 전송 시간 제한

max-transfer-time-in 180;

최대 영역전송(zone transfer)시간을 디폴트(120분)에서 180분으로 설정 아주 큰 Zone File을 가지고 올때 발생될수 있는 문제를 예방한다.

시간을 줄이면, named-xfer 프로세스가 불필요한 자원을 점유하는 것을 막을수도 있다.

주로 bind8에서 사용, 사용하지 않아도됨.

 

7.13 청소주기

cleaning-interval 120;

캐시속의 오래된 항목을 주기마다 능동적으로 뒤지면서 오래된 레코드를 삭제한다.

디폴트 60분, CPU많이 사용하면 120분으로 늘려준다.이 주기를 0으로 설정하면 캐쉬청소를 하지 않는다.

실행된 로그내용:

12-May-2005 13:44:29.123 maintenance: info: Cleaned cache of 123874 RRsets
// named 데몬에서 잡고 있는 메모리가 이 설정에 의해 줄거나 하지는 않으며 이미 잡혀 있는 메모리 자체에 있는 데이타를 날리고 제 사용하는 방식을 택하고 있는 것으로 보입니다.

 

7.14 인터페이스주기

interface-interval 0;

네트워크 인터페이스가 up/down 상태인지 체크하는시간.

불필요한 오버해드를 없애기위해 인터페이스체크 주기를 0으로 설정해 새로운인터페이스를 훓어보지 않게 할수 있다.

 

 

 

7.15 통계주기

statistics-interval120;

통계주기 네임서버 통계정보를 남길 시간을 120분으로 정함 (기본값 60분)

값을 0으로 설정하면 주기적인 통계덤프를 하지 않는다. 성능향상과는 무관한 옵션.

 

7.16 부정적 TTL시간

max-ncache-ttl 3600;

부정적 캐싱 ttl 시간을 3600초(1시간)으로 정함. 기본값은 10800초(3시간)

 

 

7.17 질의제한:

1) 해당 DNS서버의 named.conf 에 질의를 허용할 IP블록을 등록한다.

외부에서 사용못하도록함.

# more/etc/named.conf

options {

directory “/var/named”;

allow-query {203.231.124.14; 200.1.1.1/24; };//자체네임서버는 들어가야함.

 

or

options {

allow-query {

trusted;

};

 

acl “trusted” {

210.103.175.0/24;

127.0.0.1;

//any;

};일반적으로 any를 사용. 설정된 IP블록이외에서는 해당서버를 이용해 쿼리를 할수없음.

 

7.18리졸빙 네임서버를 더욱 안전하게 운영

options {

use-id-pool yes ;

안전한 서버운영을 위해 네임서버가 질의와 응답에 붙이는 메시지 id를 랜덤한 순서로

};

 

7.19 Zone Transfer 제어 – 인가 받지 않은 영역 전송금지

options {

allow-transfer {         xfer;    // Zone tranfers limited to members of the”xfer” ACL.
};

};

 

acl “xfer” {

200.1.1.34;

200.1.2.0/24;// 사용하는 네임서버 IP는 모두 등록해야한다.

// none;// Allow no transfers일 경우.

};

용도: 서버로부터 영역을 zone transfer할수 있는 사용자들은 영역의 모든 호스트를 보게됨으로서 보안상 설정을 함.(BIND8을 기준으로 작성됨.)

특정 IP블록에서만 Zone Transfer를 할수 있도록함.

Zone transfer는 일반적으로 slave에서 Master의 zone을 가져가므로 slave의 ip-address나 블록을 넣어준다.

 

설정법

#파일위치:/etc/named.conf,// 환경 설정파일은 options 안에 정의

options {

directory “/var/named”;/* zone 화일들의 위치 */

       allow-transfer { 127.0.0.1;200.1.1.0/24;200.1.2.0/24;};/* 허용ip */

};

Slave서버의 zone구문은zone-transfer가 일어나지 않으므로 다음과 같이 설정한다.

 

options {

directory”/var/named”;/* zone 화일들의 위치 */

allow-transfer{ none;};/* zone transfer를 허용하지 않는다 */

};

openssl 간단 사용법

 OpenSSL은 : SSL v2/v3와 TLS v1 프로토콜을 지원하는 범용 암호법 라이브러리이다.
대부분 리눅스 배포판에 기본 설치 되어 있음.

1. 개인키생성
1) 3DES 로 암호화(PassPhrase필요)
openssl genrsa -des3 -out 키이름.key 1024

 2) 암호화 하지 않음
openssl genrsa -out 파일이름.key 1024

 3) 기존 비밀키에 패스워드 추가
openssl rsa -in out 키이름.key -des3 -out 새로운키이름.key

 4) 기존 비밀키에 패스워드 제거
openssl rsa -in 키이름.key -out 새로운키이름.key

2. CSR생성 (인증서 서명 요청을 위해 필요)
openssl req -new -key 키이름.key -out csr이름.csr

3. 자체 서명 인증서 생성하기
openssl req -new -key 키이름.key -x509 -out 인증서이름.crt
openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt

4. 인증서 다루는 법
1) 인증서 확인(보기)
openssl x509 -noout -text -in 인증서파일.crt

  2) 비밀키 보기
openssl rsa -noout -text -in 키파일.key

※ 아파치가 설치되어 있고 SSL모듈이 있으면 개인키 및 CSR 코드만 생성하면 된다.

[Apache] httpd.conf – 주소창 디렉토리 직접 접근 설정

Description: 아파치가 접근할 수 있는 각 디렉토리에 대하여 어떤 서비스와 기능을 허용할 것인지 거부할 것인지 여부를 설정할 수 있다. 디렉토리에 대한 설정 내용은 그 하부 디렉토리에도 영향을 미친다.
Syntax: <Directory directory-path> … </Directory>

<Directory> tag에 의하여 각 directory마다 적절하게 permission을 걸수가 있다.

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

DocumentRoot 값으로 변경

<Directory “/home/httpd/html”>

지정할수 있는  옵션의 예이다. 
None
 어떤 옵션도 이용할 수 없다. 
All 지정한 directory에서 모든 명령을 이용할 수 있다. 
Indexes URL에 지정된 디렉토리에 (index.html 같은) 지정된 파일이 없을 경우 디렉토리의 파일 목록을 보여주는 옵션. 
Includes 서버측의 추가적인 정보를 제공할 수 있게 한다. 
IncludesNoExec 서버측의 추가적인 정보를 제공할 수 있게 하지만, 어떠한 실행 파일을 실행하는 것을 방지한다.  
FollowSymLinks  디렉토리상의 심볼릭 링크를 사용가능하게 한다. 
ExecCGI CGI 스크립트를 실행할 수 있게 한다. 
MultiViews  All 옵션이 설정되었을 때만 지정된 목록의 multiviews를 허용한다.

AllowOverride None
.htaccess파일은 서버의 각 디렉토리에 만들어서 각 디렉토리에 대한 접근을 제어하기 위한 것으로 디렉토리에 .htaccess파일이 있으면, 서버 전체에 작용하는 access.conf 보다 우선권을 가진다.

.htaccess파일에 대한 Override에 대한 옵션이다. 
None .htaccess파일을 읽을 수 없게 한다. 
All 모든 지정에 대해 가능하게 한다. 
Options 규정된 디렉토리 형식을 콘트롤하는 지정의 사용을 허락한다. 
FileInfo 문서형식을 콘트롤하는 지정의 사용을 허용한다. 
AuthConfig  사용자 인증 지정의 사용을 허용한다. 사용자 인증 변수를 사용한다. 
Limit 호스트 접근을 콘트롤하는 지정을 허용한다.

서버로부터 자료를 얻어갈 수 있는 위치를 제어한다.
Order allow,deny
Allow from all
Deny from env=no_access

Limit에 관련된 부분을 설정을 한다.

order : 서버가 access control을 수행하는 순서를 나타낸다. 여기서는 allow기능을 먼저 수행하고, deny기능을 수행하라는 것이다.

deny, allow – deny 지시자 부터 검사하고 allow 지시자를 검사 
allow, deny – allow 지시자 부터 검사하고 deny 지시자를 검사 
mutual-failure – allow목록에 없는 모든 host에게 접속을 거부

allow from : 나열되는 주소들에 대한 access control을 가능하게 한다.  
사용 가능한 주소는 도메인 네임, 호스트 이름 주소, 호스트 ip 주소, ip 주소의 앞부분 3바이트, 모든 주소에 해당하는 all이 있다.
deny from : allow from과 반대되는 개념이다.
</Directory>

ex1)

<Directory “/www/n”>
Options FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

ex2)

<Directory /a/service/html/>
Options FollowSymLinks MultiViews Includes
AllowOverride None

    Order allow,deny
Allow from all
</Directory>

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>



출처 : http://0thinktank.tistory.com/91

계정별 패스워드 잠금 정책 설정 (PAM)

각 계정별로 PAM 을 이용하여 패스워드가 틀릴 경우 계정 잠금 설정을 하는 법을 요청하여
긴 검색 노가다와 설정 노가다 끝에 방법을 발견했다.

특정 사용자에 대한 설정을 진행하고 해당 계정이 아닌 경우 전역 설정을 할 수 있도록 설정값을 추가해 준다.

# vi /etc/pam.d/system-auth
==================================================

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth    [success=ignore default=1] pam_succeed_if.so user in user1:user2
auth        required      pam_tally2.so deny=2 unlock_time=1200
auth    [success=ignore default=1] pam_succeed_if.so user in user3
auth        required      pam_tally2.so deny=5 unlock_time=1200
auth    [success=ignore default=1] pam_succeed_if.so user notin user1:user2:user3
auth        required      pam_tally2.so deny=10 unlock_time=1200
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so

account     required      pam_tally2.so
account     required      pam_unix.so
<하략>
==================================================
# vi /etc/pam.d/password-auth
==================================================
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth    [success=ignore default=1] pam_succeed_if.so user in user1:user2
auth        required      pam_tally2.so deny=2 unlock_time=1200
auth    [success=ignore default=1] pam_succeed_if.so user in user3
auth        required      pam_tally2.so deny=5 unlock_time=1200
auth    [success=ignore default=1] pam_succeed_if.so user notin user1:user2:user3
auth        required      pam_tally2.so deny=10 unlock_time=1200
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so
account     required      pam_tally2.so
account     required      pam_unix.so
==================================================

RHEL 7.X 버전의 네트워크 이름을 ethX 로 설정하기

RHEL 7.X 버전의 네트워크 이름을 종전처럼 ethX 로 사용해야 하는 경우가 있다.
보통 네트워크 장치명을 ethX 로 지정해서 개발된 프로그램이나 상용 모니터링 프로그램 등에서 ethX 를 참고하기 때문이다.

일반적으로 biosdevname 이라는 패키지가 ethX 가 아닌 하드웨어 단위의 이름을 할당하게 되므로 이 패키지를 지워 줘야 한다.

그리고 RHEL 6.X 버전에서 udev 에서 장치 이름을 70-persistent-net.rules 에서 선언해 주었기 때문에 해당 파일도 수정해 줘야 했다.
그런데 RHEL 7.X 버전에서는 해당 파일이 없었다. (ㅍ_ㅍ)헐~~~~

“predictable name” 에 대한 정보가 있는 경우, 별도의 설정이 없으면 무조건 이를 따라가도록 되어 있는 것으로 생각 된다.
자세한 정보는 아래와 같았다.
http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

RHEL 7.X 의 systemd 는 207 버전이다.
해결법으로
1. # ln -s /dev/null  /etc/udev/rules.d/80-net-name-slot.rules
2. /etc/udev/rules.d/70-my-net-names.rules 파일 생성하여 수동 설정
3. 기본값 복사이후 수동 설정 # cp /usr/lib/udev/rules.d/80-net-setup-link.rules /etc/udev/rules.d/80-net-setup-link.rules
4. 부트 파라미터로 net.ifnames=0 설정하기

# man systemd-udevd.service 을 통해서 net.ifnames=0 옵션에 대한 내용은 확인할 수 있다.

Linux I/O 스케줄러의 종류

I/O 스케줄러의 종류

1. The NOOP scheduler
– 리눅스 I/O 스케줄러의 가장 간단한 형태로 우선순위 없이 FIFO 으로 처리된다.
– 큰 캐싱 시스템을 가진 스토리지 환경에 적합, solid-state storage 에 적합하다.

2. The Deadline scheduler
– 들어오는 요청의 처리 완료 시간을 기준으로 우선적으로 처리한다.
– 리얼타임 어플리케이션, 데이타베이스, 디스크 집약 어플리케이션에 효과적이다.

3. The Anticipatory scheduler [2.6.33 Linux에서 제거 됨]
– 현재 작성하고 있는 블록의 인접한 블록을 우선적으로 처리한다.
– 싱글 IDE/SATA 디스크에서 웹서버, 파일 서버, 데스크탑에서 최고의 포퍼먼스를 보여줍니다.

4. The Completely Fair Queuing (CFQ) scheduler [2.6.18 부터 Linux 기본값으로 사용됨]
– 대부분의 읽기,읽기에 대해서 최악의 경우를 최소화하는 스케줄러로 대부분 사용합니다.
– 다중 사용자 환경으로 광범위한 어플리케이션에서 효과적이다.

* 스케줄링 확인 방법
# cat /sys/block/*DEV*/queue/scheduler

* 스케줄링 적용 방법
# echo SCHEDNAME > /sys/block/*DEV*/queue/scheduler

systemd unit 등록 관련 옵션 정리


– systemd 서비스 등록 샘플
[Unit]
Description=Sample Service
Requires=local-fs.target
After=local-fs.target


[Service]
Type=simple
PIDFile=/var/run/sample.pid
ExecStart=/usr/sbin/sampled -d
ExecStop=/usr/sbin/sampled -k


[Install]
WantedBy=multi-user.target

 

* 많이 사용하는 옵션 및 알아두면 편할것 같은(개인 의견 – -;;) 옵션만 추려서 정리….. (옵션이 너무 많아서… 자세한건 메뉴얼을 참고 합시다 = =;;;;), 잘못된 정보가 포함되었을 수 있음

 

=== [Unit] 섹션 ===

 

Description=
해당 유닛에 대한 상세한 설명을 포함한다.

 

Requires=
상위 의존성을 구성한다. 목록의 유닛이 정상적일 경우 유닛이 시작된다. (필요 조건)

 

RequiresOverridable=
“Requires=” 옵션과 유사하다. 하지만 이 경우 “사용자에 의해서” 서비스가 시작하는데 상위 의존성이 있는 유닛 구동에 실패 하더라도 이를 무시하고 유닛을 시작한다. (즉 상위 의존성을 무시한다.) 자동 시작의 경우 적용 되지 않는다.

 

Requisite=, RequisiteOverridable=
“Requires=” 와 “RequiresOverridable=” 와 유사하다. 상위 의존성 유닛이 시작되지 않은 경우 즉시 실패를 반환한다.

 

Wants=
“Requires=” 보다 다소 완화된 옵션이다. 상위 의존성의 유닛이 시작되지 않더라도 전체 수행과정에 영향을 끼치지 않는다. 이 옵션은 하나의 유닛을 다른 유닛과 연계할 경우 사용하게 된다. (충분 조건)

 

BindsTo=
“Requires=” 와 매우 유사하다. systemd 개입 없이 갑작기 서비스가 사라진 경우 (가령 NIC 가 물리적 장애가 난 경우) 해당 유닛도 같이 중지 하도록 설정하도록 한다.

 

PartOf=
“Requires=” 와 매우 유사하다. 상위 의존성의 유닛을 중지하거나 재시작하는 경우 해당 유닛 또한 중지나 재시작을 수행한다. 만일 오라클과 오라클 리스너의 경우에서 처럼 하나의 서비스 다른 하나의 종속성을 가지게 되는 경우 필요한 설정이다.

 

Conflicts=
역의 관계를 설정한다. 만일 유닛1′ 의 “Conflicts=” 설정이 ‘유닛2’ 로 되어 있다면 ‘유닛1’이 시작된 경우 ‘유닛2’가 중지되고, ‘유닛1’이 중지된 경우 ‘유닛2’가 시작한다. 이 옵션은 “After=” 와 “Before=” 옵션과는 독립적으로 작동한다. 각 서비스가 반대의 역활을 하거나 혹은 보조적인 서비스 역활을 수행한다면 서비스 실행 관리에 편리할 것 같다.

 

Before=, After=
유닛 시작의 전후 관계를 설정한다. 해당 설정은 “Requires=” 설정과는 독립적이다. “Before=” 에 나열된 유닛이 시작되기 전에 실행하고 “After=” 은 해당 유닛이 시작된 이후 나열된 유닛이 실행한다.
이 설정은 시스템이 종료(shutdown) 될때는 역으로 작동하게 된다.

 

OnFailure=
해당 유닛이 “실패” 상태가 되면 수행할 유닛 목록 (예 “/” 파일 시스템 마운트 실패시 복구 모드 수행)

 

PropagatesReloadTo=, ReloadPropagatedFrom=
리로드(reload) 명령을 다른 유닛에게 전달하거나 혹은 전달받아 해당 유닛도 리로드(reload)하게 된다.

 

RequiresMountsFor=
절대 경로로 지정하여 유닛을 구동하는데 필요한 마운트 목록을 자동으로 구성하여 “Requires=”, “After=” 을 수행한다. 즉 필요한 마운트 경로가 준비되어 있는지 점검하고 마운트를 미리 진행한다.

 

OnFailureIsolate=[yes|no]
“yes” 인 경우 “OnFailure=” 에 선언된 리스트와는 격리모드(isolation mode)로 작동한다. 즉 해당 유닛에 종속성이 없는 모든 유닛은 중지 되게 된다. “OnFailureIsolate=yes” 인 경우 “OnFailure=” 옵션에 오직 하나의 유닛만 설정 할 수 있다.

 

IgnoreOnIsolate=[yes|no]
“yes” 인 경우 다른 유닛과 격리(isolation)할때 중지 하지 않는다.

 

=== [Service] 섹션 ===

 

Type=[simple|forking|oneshot|notify|dbus]
유닛 타입을 선언한다.
“simple” (기본값) 유닛이 시작된 경우 즉시 systemd 는 유닛의 시작이 완료되었다고 판단한다. 다른 유닛과 통신하기 위해 소켓을 사용하는 경우 이러한 설정을 사용하면 안된다.
“forking” 자식 프로세스를 생성이 완료되는 단계까지를 systemd 가 시작이 완료되었다고 판단하게 된다. 부모 프로세스를 추적할 수 있도록 PIDFile= 필드에 PID 파일을 선언해 주어야 한다.
“oneshot” 은 “simple” 과 다소 유사하지만 단일 작업을 수행하는데 적합한 타입니다. 또한 실행 이후 해당 실행이 종료되더라도 RemainAfterExit=yes 옵션을 통해 유닛이 활성화 상태로 간주할 수 있다.
“notify” 은 “simple” 과 동일하다. 다만 유닛이 구동되면 systemd 에 시그널을 보낸다. 이때 시그널에 대한 내용은  libsystemd-daemon.so 에 선언 되어 있다.
“dbus” DBUS 에 지정된 BusName 이 준비될때까지 대기한다. 즉 DBUS 준비가 완료된 이후 유닛이 시작되었다고 간주한다.

 

RemainAfterExit=[yes|no]
유닛이 종료 이후에도 유닛이 활성화 상태로 판단한다.

 

GuessMainPID=[yes|no]
이 옵션는 Type=forking 가 설정되어 있고 PIDFile= 설정이 되어 있지 않은 경우에 작동한다.
systemd 가 유닛이 정상적으로 시작되었는지 판단이 명확하지 않는 경우 사용된다. 만일 여러개의 데몬으로 구성된 유닛의 경우 잘못된 PID 추측이 발생할 수 있다. 그로인해 오류 검출이나 자동 재시작 등의 작업이 불가능 할 수 있다. 이 옵션은 이러한 문제를 방지하는 기능을 한다.

 

PIDFile=
PID 파일을 지정한다. 만일 유닛 타입이 forking 이라면 해당 설정을 추가해 주어야 한다. (절대 경로 사용)

 

BusName=
D-Bus 의 버스 이름을 지정한다. Type=dbus 인 경우 필수 사항이다. 다른 Type 의 경우라도 D-Bus 버스 이름을 다르게 사용하는 경우 별도로 설정을 해주는 것이 좋다.

 

Environment=
해당 유닛 에서 사용할 환경 변수를 선언한다. 또한 반드시 “Exec*=” 옵션보다 상단에 위치해야 한다. 예제는 아래와 같다.
Environment=”ONE=one” ‘TWO=two two’

 

EnvironmentFile=
해당 유닛에서 사용할 환경 변수 파일을 선언한다. 환경 변수 파일에서 “#’ 와 “;” 로 시작되는 라인은 주석으로 처리된다. “Environment=” 와 같이 사용하는 경우 “Environment=” 옵션값이 먹게 된다. 또한 반드시 “Exec*=” 옵션보다 상단에 위치해야 한다.

 

ExecStart=
구동 명령어(스크립트)을 선언한다. 실행 명령어는 반드시 절대 경로 또는 변수(${STRINGS} 따위) 로 시작해야 한다. 다중 명령어를 지원한다. 예제는 아래와 같다.
ExecStart=”commnad 1; command 2; command 3” 또는
ExecStart=”commnad 1”
ExecStart=”command 2”

 

ExecStop=
중지 명령어(스크립트)를 선언한다. “ExecStart=” 동일하게 사용하면 된다. 중지 방식은 “KillMode=” 로 지정된다.

 

KillMode=[control-group|process|none]
중지 방법에 대해서 선언한다.
“control-group” 은 해당 유닛의 그룹까지 모두 중지 시킨다. 기본값이다.
“process” 은 해당 유닛 즉 메인 프로세스만 중지 시킨다.
“none” 은 아무런 액션을 하지 않는다.
* 그룹이란 유닛과 그 유닛에 종속성을 가지는 유닛의 묶음을 뜻한다.

 

ExecReload=
리로그(reload) 를 수행할 명령어를 선언한다.

 

ExecStartPre=, ExecStartPost=, ExecStopPre=, ExecStopPost=
유닛 시작, 중지 등의 엑션과 관련하여 수행할 추가 명령어를 선언한다. 사용법은 “ExecStart=” 동일하게 사용하면 된다.

 

RestartSec=
재시작 명령을 수행할때 중지 이후 다시 시작하는데 대기(sleep)하는 시간을 설정한다. 기본값은 “100ms” 이다. 각각 “min”, “s”, “ms” 단위로 설정한다. 해당 설정은 Restart= 옵션이 있는 경우에만 적용된다.

 

TimeoutStartSec=
유닛이 시작하는데 대기하는 시간을 설정한다. 기본값은 90초(90s)이다. 만일 Type=oneshot 인 경우 해당 설정이 해당 설정이 적용되지 않는다. 만일 시작 시간을 대기하지 않고 무한정 리턴값을 기다리게 설정할려면 “TimeoutStartSec=0” 으로 설정해 주면 된다.

 

TimeoutStopSec=
옵션을 중지하는데 대기하는 시간을 설정한다. 기본값은 90초(90s)로 위의 “TimeoutStartSec=” 옵션과 동일하게 “TimeoutStopSec=0” 으로 설정하면 무한정 리턴값을 기다리게 된다. “TimeoutStopSec” 옵션에 설정된 값 안에 종료되지 않으면 SIGKILL 시그널을 보내서 강제로 종료하게 된다.

 

TimeoutSec=
“TimeoutStartSec=” 와 “TimeoutStopSec=” 을 동시에 설정한다.

 

WatchdogSec=
유닛이 시작된 이후 유닛 상태 감시(keep-alive ping)할때의 상태 값을 리턴하는데 대기하는 시간을 설정한다.  “Restart=” 옵션이 “on-failure”, “always” 인 경우 유닛을 자동으로 재시작하게되고 이때 “WatchdogSec=” 설정을 해주어야 한다. 기본값은 “0” 으로 유닛 상태 감시를 사용하지 않는다.

 

Restart=[no|on-success|on-failure|on-watchdog|on-abort|always]
유닛이 죽었을때나 혹은 “WatchdogSec=” 만큼의 시간 동안 응답이 없는 경우 재시작한다. “ExecStartPre=”, “ExecStartPost=”, “ExecStopPre=”, “ExecStopPost=”, “ExecReload=” 에 설정된 유닛의 경우에는 포함되지 않는다. 즉 해당 유닛에만 해당된다.
“no” (기본값), 유닛을 다시 시작하지 않는다.
“on-success” 는 유닛이 정상적으로 종료되었을 때만 재시작한다. 종료시에 “0” 값을 리턴하여 종료되었거나 SIGHUP, SIGINT, SIGTERM, SIGPIPE 등과 같은 시그널 또는 “SuccessExitStatus=” 설정에서 지정된 리턴 코드 목록에 따른 시그널에 대해서 모두 성공으로 인식해 재시작을 하게 된다.
“on-failure” 유닛이 비정상적으로 종료되었을때 재시작한다. 리턴값이 “0” 이 아닌 경우, core dump 와 같이 비정상적인 시그널을 받고 종료된 경우, 타임 아웃값내 응답이 없는 경우 등일때 재시작 하게 된다.
“on-watchdog” “WatchdogSec=” 에 설정된 시간내 응답이 없는 경우에만 재시작 한다.
“on-abort” 지정되지 않은 리턴값을 받은 경우 재시작을 한다.
“always” 종료 상태 등과 무관하게 무조건 재시작한다. (사용자가 중지해도 시스템이 다시 띄우게 된다. 설정된 유닛 중지 시 주의가 필요하다.)

 

SuccessExitStatus=
성공으로 판단할 시그널을 설정해 준다. 문법은 아래와 같다.
“SuccessExitStatus=1 2 8 SIGKILL”

 

RestartPreventExitStatus=
재시작을 방지할 리턴 코드를 설정한다. 재시작을 하지 않을 리턴 코드를 설정하는데 유용하다. 문법은 아래와 같다.
“RestartPreventExitStatus=1 6 SIGABRT”

 

PermissionsStartOnly=[yes|no]
“User=”, “Group=” 옵션 등과 같이 권한 설정 옵션을 적용 하여 시작한다. 해당 설정은 “ExecStart=” 옵션에서만 적용 되며 “ExecStartPre=”, “ExecStartPost=”, “ExecReload=”, “ExecStop=”, “ExecStopPost=” 옵션에서는 적용되지 않는다.

 

User=, Group=
유닛의 프로세스를 수행할 사용자명, 그룹명 등을 지정한다.

 

RootDirectoryStartOnly=[yes|no]
“/” 디렉토리를 지정한다. chroot() 함수를 사용하여 구동한다. jail 구성의 일반적인 형태이다. 해당 설정은 “ExecStart=” 옵션에서만 적용 되며 “ExecStartPre=”, “ExecStartPost=”, “ExecReload=”, “ExecStop=”, “ExecStopPost=” 옵션에서는 적용되지 않는다.

 

RootDirectory=
chroot() 함수로 변경할 “/” 디렉토리를 지정한다.

 

WorkingDirectory=
프로세스의 작업 디렉토리를 지정한다. 별도의 지정이 없으면 유닛은 “/” 디렉토리를 작업 디렉토리로 사용한다. 특정 디렉토리에서 실행해야하는 프로세스에서 필요하다.

 

NonBlocking=[yes|no]
소켓 파일 디스크립션 (FD) 에 O_NONBLOCK 플래그를 선언한다. yes 일 경우 STDIN/STDOUT/STDERR 을 제외하고 모든 소켓에 O_NONBLOCK 플래그가 지정된다. 즉 non-blocking mode 로 작동하게 된다.

 

NotifyAccess=[none|main|all]
유닛 상태에 대해서 sd_notify() 함수를 사용하여 알림(notification) 소켓에 접근할 수 있도록 한다.
“none” 은 유닛 상태에 대한 모든 정보를 무시한다.
“main” 은 메인 프로세스에 대해서만 상태 정보 알림을 허용한다.
“all” 은 모든 유닛 즉 컨트롤 그룹의 유닛 상태 정보 알림을 허용한다.
“Type=notify” 또는 “WatchdogSec=” 가 설정된 경우 “NotifyAccess=” 을 접근 가능하게 (즉 main 이상) 설정해야 한다. “NotifyAccess=” 만 설정하고 값이 없는 경우 기본값은 “main” 이다.

 

Sockets=
유닛에서 사용하는 소켓의 이름을 지정한다. 기본으로 <유닛명>.socket 으로 생성되지만 지정된 이름으로 소켓을 사용하는 경우 별도의 설정이 가능하다. 또한 하나의 유닛에서 여러 소켓 목록을 일괄적으로 관리하는 경우 “Sockets=” 옵션이 여러번 사용 될 수도 있다. 만일 “Sockets=” 옵션이 아무런 설정값 없이 단독으로 사용되는 경우 소켓 목록이 리셋되게 된다.

 

StartLimitInterval=, StartLimitBurst=
위의 두 설정값을 이용하여 제한된 시간에 너무 많은 재시작 (“Restart=”) 이 발생되는 것을 방지해 준다. 기본값에 따르면 10초 간격으로 5번까지 서비스 시작을 허용하고 그 이상 더 재시작 이벤트가 발생하면 자동으로 재시작 하지 않도록 설정해 준다. (즉 1분내 5번 재시작 시도이후 복구 불가시 Fail 발생) 나중에 관리자가 수동으로 구동하여 복구 할 수 있도록 하여 무한대의 유닛 재시작 이벤트 발생을 방지한다.
“StartLimitInterval=” 옵션의 경우 기본값 10초(10s), “0” 으로 설정할 경우 비활성화한다.
“StartLimitBurst=” 옵션의 경우 기본값 5회

 

StartLimitAction=[none|reboot|reboot-force|reboot-immediate]
만일 복구 재시도가 제한된 설정 ( Service Recovery Limit > StartLimitInterval * StartLimitBurst ) 내에 마치지 못하면 다음 조치로 어떠한 방식의 작동을 할지 선언한다.
“none” (기본값), 아무런 액션도 하지 않습니다.
“reboot” 시스템을 재부팅 한다. (systemctl reboot 와 동일)
“reboot-force” 시스템을 강제 제부팅 한다. 단 데이타 유실을 없다. (systemctl reboot -f 와 동일)
“reboot-immediate” 시스템을 강제 재부팅 한다. 데이타의 유실이 있다. reboot() 함수를 사용하여 즉각적인 재부팅을 수행한다. sync 과정없이 진행

 

Nice=
해당 유닛의 프로세스의 nice 값을 지정한다. “-20” 부터 “19” 까지 정수형으로 등록한다.

 

OOMScoreAdjust=
OOM(Out Of Memory) killer 작동시 프로세스 조정값를 미리 지정할 수 있다. “-1000” 에서 “1000” 까지 정수형으로 등록한다.

 

UMask=
umask 값을 선언한다. 별도의 설정이 없으면 기본값은 “0022” 이다.

 

SyslogFacility=
로그 사설을 설정할 수 있다. “kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, local0, local1, local2, local3, local4, local5, local6, local7” 등의 값으로 설정 가능하다.

 

SyslogLevel=
로그 레벨을 설정할 수 있다. “emerg, alert, crit, err, warning, notice, info, debug” 등 설정이 가능하다.

 

TCPWrapName=
TCP 래퍼를 사용하기위한 설정이다.

 

PAMName=
PAM 보안 사설을 사용하기 위한 설정이다.


=== [Install] 섹션 ===

 

Alias=
유닛의 알리아스 이름을 지정한다. “systemctl enable” 명령어를 통해서 알리아스 이름으로 생성할 수 있다. 알리아스 이름은 유닛 파일 확장자(유닛 타입)를 가지고 있어야 한다.
(service, socket, mount, swap 등이 있다.  예: httpd.service 의 Alias=apache.service)

 

WantedBy=, RequiredBy=
“systemctl enable” 명령어로 유닛을 등록할때 등록에 필요한 유닛을 지정한다. 해당 유닛을 등록하기위한 종속성 검사 단계로 보면 된다. 따라서 해당 설정은 [Unit] 섹션의 “Wants=” 와 :Requires=” 옵션과 관계 있다.

 

Also=
“systemctl enable” 와 “systemctl disable” 로 유닛을 등록하거나 해제할때 다른 유닛 또한 같이 등록, 해제를 하도록 구성할 수 있다.

 

Targets table

SysV Runlevel
systemd Target
Notes
0
runlevel0.target, poweroff.target
Halt the system.
1, s, single
runlevel1.target, rescue.target
Single user mode.
2, 4
runlevel2.target, runlevel4.target, multi-user.target
User-defined/Site-specific runlevels. By default, identical to 3.
3
runlevel3.target, multi-user.target
Multi-user, non-graphical. Users can usually login via multiple consoles or via the network.
5
runlevel5.target, graphical.target
Multi-user, graphical. Usually has all the services of runlevel 3 plus a graphical login.
6
runlevel6.target, reboot.target
Reboot
emergency
emergency.target
Emergency shell

ssh 데몬설정 – /etc/ssh/sshd_config

1. Port xx

SSH 서비스 포트는 22로 규약되어 있지만 보안을 위해 임의의 포트로 변경 하는것도 가능하다.

원하는 포트번호로 변경하고 /etc/services 파일에서 ssh 포트값도 변경해 주면 된다.

포트번호는 1024 이상의 값들을 이용한다.

2. Protocol 2

SSH 프로토콜은 ver 1과 ver 2가 있는데 SSH1 클라이언트와 SSH2 클라이언트의 접속 요청에 대한 것이다. 보안상 Protocol 1은 사용하지 않고 Protocol 2 만을 사용한다.

(둘다 사용하기 위해서는 Protocol 2,1 을 적어주면 된다.)

3. ListenAddress 0.0.0.0

SSH 서버에서 Listen 할 로컬 호스트 주소를 설정하는 것이다. 여러개의 IP를 사용중일 때 특정 IP로 SSH 접속이 가능토록 설정하는 옵션으로 0.0.0.0은 모든 네트워크를 의미한다.

사용하고자 하는 특정 IP가 있다면 0.0.0.0 대신 적으면 된다.

4. #Hostkey ~

Protocol 1, 2(rsa, dsa) 의 호스트키 위치를 지정한다.

5. KeyRegenerationInterval 1h

자동으로 생성된 키의 유효시간을 지정한다. (기본 3600sec 이고 h를 붙이면 1 hour의 의미이다.)

 이 옵션은 호스트의 세션에 있는 키를 캡쳐해서 암호를 해독하거나 훔친 키를 재사용 하지 못하도록

하기 위함이다.

6. ServerKeyBits 768

서버 키의 비트 길이를 설정한다. 최소 512, 기본 768.

7. SyslogFacility AUTH

syslog 데몬에 의한 로그 facility를 지정한다. sub system 종류 및 내용은 syslog 관련 자료를 참조.

8. LogLevel INFO

로그 레벨(메시지 종류)를 지정한다.

9. LoginGraceTime 2m

지정한 시간내에 로그인 하지 않으면 자동으로 접속을 끊는다. 0값은 무제한.

10. PermitRootLogin no

공격자가 임의의 주소에 root 계정으로 접속이 가능한지 여부를 무한 스캐닝을 통해

알아 낼 수 있다. 따라서 위와 같이 root 계정의 접근을 막고 일반 유저로 접속한 다음

root 계정을 불러오는 것이 좋다.

11. StrictModes yes

로그인을 허용하기 앞서 파일 모드 및 사용자 홈 디렉토리 소유권과 원격 호스트의 파일들을

ssh 데몬이 체크 할 수 있도록 할 때 사용.

12. MaxAuthTries 6

접속당 최대 인증 시도 횟수. 기본값 6, 3회이상 인증 실패시 로그가 기록된다.

13. #RSAAuthentication yes

RSA 인증을 설정. Protocol 1 에서만 적용되는 옵션이므로 주석처리.

14. #PubkeyAuthentication yes

공개키 인증 설정. Protocol 2에 적용된다.

15. #AuthorizedKeysFile      .ssh/authorized_keys

인증키를 저장할 위치를 지정한다.

16. RhostsRSAAuthentication no

/etc/ssh/ssh_known_hosts 파일에 있는 호스트에 대한 인증을 허용할 것인지 설정한다.

17. HostbasedAuthentication no

호스트 기반의 인증 허용 여부를 결정한다.

18. IgnoreUserKnownHosts yes

RhostsRSAAuthentication, HostbasedAuthentication 인증시 ~/.ssh/knownhosts 파일의

호스트들을 제외할 것인지 설정한다. rhosts 파일을 허용하지 않았으므로 yes로 설정.

19. IgnoreRhosts yes

~/.rhosts와 ~/.shosts 파일 사용여부를 결정한다. 보안상 이유로 사용하지 않는다.

20. PasswordAuthentication yes

패스워드 인증을 허용한다. Protocol 1, 2 모두 적용된다.

21. PermitEmptyPasswords no

패스워드 인증시 비어있는 스트링을 인정할지 여부를 결정한다.

22. ChallengeResponseAuthentication no

Challenge-Response 인증을 허용할지 여부를 설정한다. UsePAM 옵션을 yes로 설정할 경우 이 옵션은 no로 설정해야 한다.

23. #UsePAM no

ChallengeResponseAuthentication을 이용한 PAM 인증을 허용하는 옵션이다. 이 옵션을 yes로 설정하는 경우 열쇠글 인증과 동일하게 적용되므로, 열쇠글 인증 또는 ChallengeResponseAuthentication 옵션을 꺼 놓아야 한다.

– Kerberos 및 GSSAPI 인증에 관한 내용은 필요에 따라 설정.

24. AllowTcpForwarding yes

TCP 포워딩을 가능토록 설정하는 옵션이다.

25. GatewayPorts no

클라이언트에 포워드된 포트로 원격 호스트 들이 접속할 수 있도록 설정하는 옵션이다.

26. X11Forwarding no

원격에서 X11 포워딩을 허용할지 여부를 설정하는 옵션이다.

27. #X11DisplayOffset 10

X11 포워딩이 될 때 디스플레이 offset을 설정. 허용하지 않았으므로 주석 처리.

28. PrintMotd yes

ssh 로그인시 /etc/motd 파일의 내용을 보여줄 것인지 여부결정.

ssh 로그인을 환영하는 메시지나 공지사항 등을 출력되도록 할 수 있음.

29. PrintLastLog yes

로그인시 지난번 로그인 기록을 보여줄 것인가를 설정.

30. TCPKeepAlive yes

클라이언트의 접속이 끊어졌는지를 체크하기 위해 서버가 일정시간 메시지를 전달한다.

31. PermitUserEnvironment no

~/.ssh/enviroment와 ~/.ssh/authorized_keys 파일의 environment = 옵션을 sshd 데몬에서 처리 되도록 할것 인가를 설정한다.

32. Compression delayed

압축 사용여부를 결정.

33. ClientAliveInterval 0

클라이언트로부터 sshd 데몬이 아무런 데이터를 받지 못하게 되면 암호화된 채널을 통해서 메시지를 클라이언트의 요청에 응답하여 보내는데 이 때의 시간 간격을 초단위로 설정한다. 0은 클라이언트에

메시지를 보내지 않는 것을 의미. Protocol 2에서 적용된다.

34. ClientAliveCountMax 3

서버에게 전달되는 클라이언트의 생존 메시지 회수를 지정한다. 이 옵션으로 지정한 값에

도달하게 되면 sshd 데몬은 클라이언트와의 연결을 끊어 버리고 세션을 종료시킨다.

35. UseDNS yes

클라이언트 호스트 주소를 DNS 해석.

36. PidFile /var/run/sshd.pid

sshd 데몬의 PID를 저장할 파일을 지정한다.

37. MaxStartups 5

로그인하고 있지 않는 최대 접속 수를 설정한다. 이 값을 초과하게 되고 인증이 성공적으로

이뤄지지 않으면 그 다음 접속이 불가능 하다.

38. Subsystem       sftp    /usr/libexec/openssh/sftp-server

sftp는 프로토콜 버전 2에서 사용되는 것으로서 ssh와 같이 ftp의 보안을

강화하기 위해 사용되는 보안 ftp 프로그램이다.

openssh를 설치하면 /usr/local/ssh/libexec/sftp-server파일이 설치된다.

이것은 sftp 서버용 프로그램으로 클라이언트 sftp프로그램은 설치되지 않는다.

따라서 서버로 가동시키고 원도용 ssh클라이언트 프로그램이나 SSH2를 설치하면

sftp를 사용이 가능하다.

39. UsePrivilegeSeparation yes

# 접속된 프로세스에 대해 상위 권한 없이 chroot로 고립된 형태로 작동