본문 바로가기

Operating System Theme/Unix/Linux

CentOS Minimal Intallation으로부터 서버 구축 방법 #4 (Postgre SQL 설치 및 Perl 연동)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Postgre SQL 설치

 DB 설치를 한다. 여기에서는 Postgre SQL을 기준으로 한다. yum으로 postgresql 패키지와 확장 패키지들을 설치한다.

# yum --disablerepo=\* --enablerepo=c7-media install postgresql postgresql-server postgresql-contrib postgresql-devel

 /usr/bin 디렉터리에 가면 Postgre SQL 관련 파일들이 생성되어 있을 것이다. 이 중 postgresql-setup 파일을 실행하여 데이터베이스를 초기 설정한다.

# ./postgresql-setup initdb

 데몬을 실행시킨다. 재부팅 시 자동 실행되게 하려면 같은 명령을 /etc/rc.local 파일에 추가한다.

# systemctl start postgresql.service

설치 후 Postgre SQL은 서버의 보안을 위해 root 계정을 요구하지 않고 자신만의 별도의 계정을 서버에 추가시킨다. /etc/passwd 파일을 vi로 열면 postgres 라는 이름의 계정이 추가된 것을 확인할 수 있다.

이 계정에 대한 암호를 설정한다. 암호 설정은 passwd 명령으로 한다.

# passwd postgres_

 

 데이터베이스에 로그인 할 때 인증 방식을 수정한다.

vi/var/lib/pgsql/data/pg_hba.conf또는 이에 준하는 경로의 pg_hba.conf를 열고 host    all    all    127.0.0.1/32    ident이라고 된 것을 host    all    all    127.0.0.1/32    md5으로 고쳐준다. 하단의 IPv6 부분도 마찬가지로 ident으로 된 부분을 md5으로 고쳐준다. 이렇게 하지 않으면 perl에서 데이터베이스에 로그인 할 때 "FATAL: Ident authentication failed for user '...'" 류의 오류를 볼 수 있기 때문이다.

 

수정 후 저장했으면 Postgres SQL 데몬을 다시 시작한다.

# systemctl restart postgresql.service

Postgre SQL 사용자 조회/생성/삭제

 Postgre SQL을 사용하기 위해 root 계정을 로그아웃한다. ID는 postgres, 암호는 passwd에서 설정한 암호로 로그인하면 다른 형태의 shell이 뜨는 것을 확인할 수 있다.

 psql을 실행한다. SQL을 입력할 수 있는 또 다른 형태의 shell이 뜰 것이다.

$ psql_

먼저 \du 지시어를 사용해 데이터베이스 사용자를 조회해 본다. 기본 사용자로 모든 권한을 소유한 postgres가 있을 것이다. 여기에 testuser라는 사용자를 추가해 본다. 단, 명령의 끝에는 항상 세미콜론(;)이 붙어야 한다.

\du
CREATE USER testuser;
\du_

\password 지시어를 사용해 이 계정에 암호를 부여한다.

\password testuser

다음은 권한 부여이다. 이와 관련된 구문은 CREATE ROLE(https://www.postgresql.org/docs/8.1/static/sql-createrole.html), ALTER ROLE(https://www.postgresql.org/docs/8.1/static/sql-alterrole.html), DROP ROLE(https://www.postgresql.org/docs/8.1/static/sql-droprole.html)의 3가지이며, 이미 생성된 사용자의 권한을 변경하기 위해서는 ALTER ROLE을 사용한다.

 이 사용자에게 DB를 생성할 수 있는 권한을 부여하려면 다음과 같이 한다.

ALTER ROLE testuser CREATEDB;

\du 지시어로 다음과 같이 Create DB가 추가되었음을 확인할 수 있다.

사용자를 삭제하는 구문은 DROP USER이다.

DROP USER testuser;

참고로 Postgre SQL에서는 사용자 생성/수정/삭제와 권한 생성/수정/삭제가 동일하게 작동된다. 즉,

이다.

 

Postgre SQL 데이터베이스 조회/생성/삭제

 데이터베이스는 보통의 데이터 조작 언어와 똑같다. CREATE DATABASE, ALTER DATABASE, DROP DATABASE의 3가지가 있으며 각 레퍼런스는 다음과 같다.

여기에서는 DB 생성만 해 보겠다.

CREATE DATABASE testdb01;

 DB를 조회하는 방법은 다음과 같다.

SELECT * FROM pg_database;

 

Perl에 Postgre SQL 연동하기

인터페이스 설치

 CentOS에서 Perl-PostgreSQL간 인터페이스의 패키지명은 perl-DBD-Pg(대/소문자 주의)이다. yum으로 이를 설치한다.

# yum --disablerepo=\* --enablerepo=c7-media install perl-DBD-Pg

다음, Postgre SQL을 재시작한다.

# systemctl restart postgresql.service

Perl 실행

 이제 Perl 소스로 DB에 접근해 본다.

#!/usr/bin/perl

use DBI;
use strict;

my $driver = "Pg";
my $database = "testdb01";
my $host="127.0.0.1";
my $connstr = "DBI:$driver:dbname=$database;host=$host";
my $userid = "testuser";
my $userpw = "(testuser의 암호)";
my $dbconn = DBI->connect($constr, $userid, $userpw, { RaiseError => 1 }) or die $DBI::errstr;

print "Content-type: text/html\n\n";
print <<EOHTML;
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>DB Test</title>
    </head>
    <body>
        <p>Database Opened.</p>
        <p>HT = $host, DB = $database, ID = $userid</p>
    </body>
</html>
EOHTML

$dbconn->disconnect();

위 예시 코드를 /var/www/cgi-bin 디렉터리에 저장한다. 해당 파일에 chmod 명령으로 a+x 속성을 부여하고 lynx로 접속해본다. 아래와 같이 뜨면 정상이다.

# lynx http://127.0.0.1/cgi-bin/dbtest.cgi

그러나 거의 100% 오류가 뜰 것이다. HTTP 403 오류가 뜬다는 얘기다. 내부 서버 오류라고만 할 뿐, 다른 얘기는 나오지 않는다. 아파치에서는 작동중 발생하는 각종 메시지들에 대해 로그파일을 저장해 두고 있다. 특별히 설정을 건드린 것이 없다면, /var/log/httpd/error_log 파일에 저장되어 있다. 다음과 같이 Permission Denied 메시지가 뜰 것이다.

아파치가 DB 접속을 하지 못한다는 뜻이다. 이를 가능하게 하도록 터미널에서 다음 명령을 입력한다.

SELinux에서 아파치의 DB 접근 허용하기

# setsebool -P httpd_can_network_connect_db on
# systemctl restart httpd.service_

뭔가 잘 되지 않는다면 다음과 같이 해 본다.

# setenforce 0
# setsebool -P httpd_can_network_connect_db on
# systemctl restart httpd.service
# setenforce 1_

SELinux는 보안 정책을 관리하는 일종의 도구이다. 데몬들이 할 수 있는 일과 할 수 없는 일에 제한을 주는 것이 가능한데, httpd와 관련해서는 데이터베이스 접속 권한을 끄는 것이 기본값으로 설정되어 있다. 이를 명시적으로 켜 두는 과정이다. 윈도우의 사용자 계정 컨트롤(UAC)에 비교할 수 있지만 더욱 정교한 설정이 가능하다.

SELinux 관련 주요 명령어는 다음과 같다.

setenforce
SELinux의 작동 상태를 전환한다. SELinux의 작동 모드는 enforce(정상 작동), permissive(정책 위반해도 audit log만 남기고 계속 실행 가능), disable(비활성화)의 3가지가 있는데 0을 지정하면 permissive, 1을 지정하면 enforce가 된다. disable로 설정하고자 할 때는 /etc/sysconfig/selinux 파일을 열어서 SELINUX=enforcing이라 된 것을 SELINUX=disabled로 고친 뒤 재부팅하면 되지만 보안상 권장되지 않는다.
sestatus
SELinux의 현재 상태를 조회할 수 있다.
getsebool
데몬의 각 작동에 대해 허용 여부를 가져온다. 데몬이 가질 수 있는 작동에 대한 정의는 getsebool -a를 실행하면 알 수 있다.

setsebool
데몬의 각 작동에 대해 허용 여부를 설정한다. setsebool -P [daemon] on/off로서 켜기/끄기를 지정할 수 있으며 [daemon]에 들어갈 값의 목록은 getsebool -a를 통해 확인한다.

여기까지 해서 CentOS 7 minimum install로부터 Apache+Perl+Postgre SQL를 설치하고 연동시켜보았다. 다음에는 Apache-PHP-Maria DB를 구성해보겠다.