1. Windows Client - SSH

◾ 공개키는 서버

개인키로 공개키가 풀리면 허용해주는 시스템

개인키가 있으면 공개키를 계산 가능

 

◾ SSH – Windows Client(putty)

: 공개키를 미리 저장하고 공개키를 이용한 인증방식이다.


◾ 과정
 1) 클라이언트에서 키생성.
 2) 공개키를 서버로 이전
 3) 패스워드 없는 접속 테스트

 

◾ puttygen – 키 생성 관리 프로그램
• 시작 – PuTTY(64bit)


키 생성

key 아래 빈 부분을 마우스로 문지르면 빠르게 키 생성 가능

키 확인

개인키 저장

다음 경로에 저장한다.

 

리눅스에서 복사한 공개 키는 서버의 $HOME/.ssh/authorized_keys에 저장한다.

[root@CentOS7 ~]# su - st
마지막 로그인: 금 12월 10 13:45:04 KST 2021 192.168.10.130에서 시작 일시 pts/0
[st@CentOS7 ~]$ pwd
/home/st
[st@CentOS7 ~]$ ls
[st@CentOS7 ~]$ mkdir .ssh
[st@CentOS7 ~]$ ls
[st@CentOS7 ~]$ ls -a
.   .Xauthority    .bash_logout   .bashrc  .config   .ssh
..  .bash_history  .bash_profile  .cache   .mozilla  .viminfo
[st@CentOS7 ~]$ vi .ssh/authorized_keys

OR

[root@CentOS7 ~]# mkdir /home/st/.ssh
[root@CentOS7 ~]# vi /home/st/.ssh/authorized_keys

 

Windows Putty어서 개인키를 지정하고 Windows Putty 접속 계정 지정한다.

PuTTY에서 아래와 같이 설정해준다.

 

서버에 접속해서 패스워드 없이 접속 되는지 확인한다.

자동으로 접속된다.

Using username "st".
Authenticating with public key "rsa-key-20220203"
Last login: Thu Feb  3 15:03:19 2022
[st@CentOS7 ~]$

2. Linux Client - SSH

공개키를 미리 저장하고 공개키를 이용한 인증방식이다.


◾ 과정
 1) 클라이언트에서 키생성.
 2) 공개키를 서버로 이전
 3) 패스워드 없는 접속 테스트

 

◾ 클라이언트에서 키 생성
# ssh-keygen -t <type> -b <bits>
  -t : rsa, dsa
  -b : rsa(768~2048), dsa(1024)


키 생성

[root@CentOS7 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:veO458NL5gkPHsRAHumf+DV5X9Ffhj/IcuK4MEvlGpI root@CentOS7
The key's randomart image is:
+---[RSA 2048]----+
|      o.         |
|     o..         |
|     .o        ..|
|      .o .    ..+|
|       oSo... .o+|
|      o.= ++.+ .+|
|     E *++Bo+. ..|
|      o.B%++  .  |
|       o+=Oo     |
+----[SHA256]-----+

 

공개키 : /root/.ssh/id_rsa.pub

개인키 : /root/.ssh/id_rsa

 

공개키를 접속할 서버로 복사한다.

[root@CentOS7 ~]# ssh-copy-id st04@192.168.10.11
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.10.11 (192.168.10.11)' can't be established.
ECDSA key fingerprint is SHA256:vrnjESYRqUdWJx0S182N+RYSd9mPESDSuJhKCLIqtqY.
ECDSA key fingerprint is MD5:68:07:84:35:e6:90:4c:7f:14:15:17:92:ff:a9:e9:13.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': y
Please type 'yes' or 'no': yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
st04@192.168.10.11's password:1234

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'st04@192.168.10.11'"
and check to make sure that only the key(s) you wanted were added.

 

ssh로  로그인이 가능하다.

[root@CentOS7 ~]# ssh st04@192.168.10.11
Last login: Thu Feb  3 15:44:09 2022 from 192.168.10.130

 

윈도우에서 접속하기위해 다음과 같이 설정한다.

개인키를 윈도우로 전송하기위해 ftp서버를 사용한다.

[root@CentOS7 ~]# yum install -y vsftpd

[root@CentOS7 ~]# systemctl start vsftpd

 

생성된 개인키를 ftp에서 접속할 계정의 홈디렉토리로 옮기고 권한을 변경한다.

[root@CentOS7 ~]# cd /root/.ssh
[root@CentOS7 .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[root@CentOS7 .ssh]# cp id_rsa /home/st04/id_rsa
[root@CentOS7 .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[root@CentOS7 .ssh]# cd /home/st04/id_rsa
-bash: cd: /home/st04/id_rsa: 디렉터리가 아닙니다
[root@CentOS7 .ssh]# cd /home/st04
[root@CentOS7 st04]# ls
id_rsa
[root@CentOS7 st04]# ll
합계 4
-rw------- 1 root root 1675  2월  3 15:56 id_rsa
[root@CentOS7 st04]# chmod 666 id_rsa
[root@CentOS7 st04]# ll
합계 4
-rw-rw-rw- 1 root root 1675  2월  3 15:56 id_rsa

 

윈도우 cmd에서 ftp 접속을 통해 get명령어로 id_rsa 파일을 다운받는다.

C:\Users\st04>ftp 192.168.11.131
192.168.11.131에 연결되었습니다.
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
사용자(192.168.11.131:(none)): st04
331 Please specify the password.
암호:
230 Login successful.
ftp> get id_rsa
200 PORT command successful. Consider using PASV.
550 Failed to open file.
ftp> get id_rsa
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for id_rsa (1675 bytes).
226 Transfer complete.
ftp: 0.00초 1675000.00KB/초
ftp>

 

Load로 id_rsa를 로드하고 따로 개인키를 저장한다.

저장한 개인키로 접속 설정한다.

 

자동 접속을 확인할 수 있다.

Using username "st04".
Authenticating with public key "imported-openssh-key"
Last login: Thu Feb  3 15:46:54 2022 from 192.168.10.130
[st04@dal ~]$

웹 게시판 생성 실습

웹서버 오라클서버 연동하여 웹 게시판 생성 실습

이전 실습에서 이어서 진행한다.

 

오라클 서버 및 WEB 서버 설치

오라클을 설치하고 설치된 오라클에 web 서버가 연동이 되도록 설정 ◾ 조건 • 오라클 서버 구축후 새로운 계정은 생성하지 않는다.  - 연동 test는 예제 스키마인 HR을 이용한다.  - web 서버

lemonandgrapefruit.tistory.com

 

실습

1. 웹서버 오라클서버 연동 확인

 

2. 게시판 구현을 위한 데이터 요구

 1) 게시판 외부스키마

 2) 게시판 논리적 모델링

 3) 게시판 물리적모델링

 4) 게시판 테이블 생성

 

3. 게시판 구현

 1) board table space 생성 및 board user 생성

 2) 오라클 접속 및 board 테이블 생성

 3) 게시판 구현

 

4. 웹서버에 디렉토리 업로드

 

5. 보안 구현

 1) PW 저장된 해시값 다르게 설정한 사용자 인증 구현

 2) 로그인하지 않으면 파일 접근 불가능 구현

 3) SQL Injection 예방 구현

 4) 게시글 작성자만 게시글 삭제 가능 구현


1. 웹서버 오라클서버 연동 확인

오라클 서버: 192.168.11.136

웹서버: 192.168.11.137

 

웹서버와 오라클서버 연동을 확인한다.

/home/httpd/index.html 파일은 아래와 같다.

<html>
<head>
<title> st04 </title>
<meta charset="UTF-8">
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<p>&nbsp;</p>
<table border="1" align="center">
<tr>
<td width="100">
<p align="center">목록<br></p>
<p align="center"><a href="html">html</a><br></p>
</td>
</tr>
</table>
</html>
<?
$server = "ora";
$user_name = "hr";
$password = "hr";
$conn=@oci_connect($user_name,$password,$server) or die('not connect:');
echo("Oracle 19c \$conn : $conn<br>");
$st=oci_server_version($conn);
echo("$st<br>");
phpinfo();
?>

 

오라클이 연동된 것을 확인할 수 있다.

 

2. 게시판 구현을 위한 데이터 요구

1) 게시판 외부스키마

- view (게시판목록)

: id(사용자계정), pw(계정비밀번호), 게시물번호, 게시물제목, 별명, 게시물작성일시, 게시물조회수

 

- id (회원가입)

: id(사용자계정), pw(계정비밀번호), | (추가항목) 별명, 주민번호, 메일주소, 전화번호

 

- content (게시물 내용)

: 게시물제목, 별명, 게시물작성일시, 게시물내용

 

2) 게시판 논리적 모델링

- 사용자(id) Table

: id, pw, 별명(name), 주민번호(jumin), 메일주소(email), 전화(tel)

 

- 게시판(board) Table

: 게시물번호(bno), 게시물제목(subject), 게시물내용(content), 게시물작성일시(bdate),

게시물작성자(id.name), 조회수(hit)

3) 게시판 물리적모델링

주민번호 같은 민감한 개인정보는 해시값으로 저장한다.

 

4) 게시판 테이블 생성

물리적 모델링을 참조하여 게시판 생성 sql문을 작성한다.

createboard.sql

createboard.sql
0.00MB

DROP TABLE board;
DROP TABLE id;
PURGE RECYCLEBIN;


DROP sequence board_bno_seq;


CREATE TABLE id(
id VARCHAR2(15),
pw VARCHAR2(40),
name VARCHAR2(100) NOT NULL,
jumin VARCHAR2(48),
email VARCHAR2(100),
tel VARCHAR2(20)
);


CREATE TABLE board(
bno NUMBER,
id VARCHAR2(15),
subject VARCHAR2(200),
bdate DATE,
hit NUMBER,
content VARCHAR2(4000)
);




ALTER TABLE id
ADD CONSTRAINT id_pk_id PRIMARY KEY (id);
ALTER TABLE board
ADD CONSTRAINT board_pk_bno PRIMARY KEY (bno);


ALTER TABLE board
ADD CONSTRAINT board_fk_id FOREIGN KEY (id)
REFERENCES id (id);


CREATE SEQUENCE board_bno_seq;

 

 

3. 게시판 구현

1) board table space 생성 및 board user 생성

192.168.11.136 오라클 서버에서 진행한다.

 

board table space를 생성할 것이다.

분산저장하기 위해 /app/ora19c/oradata/disk1, /app/ora19c/oradata/disk2를 생성한다.

board table space를 생성한다.

SQL> !ls /app/ora19c/oradata/
DB19


SQL> !mkdir /app/ora19c/oradata/disk1


SQL> !mkdir /app/ora19c/oradata/disk2


SQL> !ls /app/ora19c/oradata/
DB19 disk1 disk2


SQL> CREATE TABLESPACE board
2 DATAFILE
3 '/app/ora19c/oradata/disk1/board01.dbf' SIZE 100M,
4 '/app/ora19c/oradata/disk2/board02.dbf' SIZE 100M;


Tablespace created.

 

게시판 연동에 사용되는 테이블등의 개체는 모두 board 스키마에 생성한다.

board 사용자를 생성하고 권한을 부여한다.

SQL> CREATE USER board
2 IDENTIFIED BY board
3 DEFAULT TABLESPACE board
4 QUOTA UNLIMITED ON board;


User created.


SQL> GRANT connect, resource TO board;


Grant succeeded.


SQL> GRANT execute on DBMS_CRYPTO TO resource;


Grant succeeded.

 

2) 오라클 접속 및 board 테이블 생성

데이터베이스에 board에 대한 테이블을 생성하기 전에 board 계정으로 오라클 접속할 것이다.

이미 리스너는 구동되어있는 상태이다.

192.168.10.130 윈도우 컴퓨터의 tnsnames.ora 파일을 확인한다.

tnsnames.ora 파일에 192.168.11.136 오라클 서버 ip 주소가 있는지 확인한다.

oracle =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.11.135)(port = 1521))
(CONNECT_DATA = (SID = DB19))
)


ora =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.11.136)(port = 1521))
(CONNECT_DATA = (SID = DB19))
)


dal =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.10.11)(port = 1521))
(CONNECT_DATA = (SID = DB19))
)

 

데이터베이스에 board에 대한 테이블을 생성하기 전에 192.168.10.130 컴퓨터에서 리스너 구동 확인과 board 테이블을 생성하는 sql 파일(createboard.sql)을 올릴 것이다.

접속 계정은 board이다.

createboard.sql이 잘 실행된 것을 확인할 수 있다.

C:\Users\st04>cd sql


C:\Users\st04\sql>sqlplus board/board@ora


SQL*Plus: Release 19.0.0.0.0 - Production on 금 1월 7 14:09:35 2022
Version 19.3.0.0.0


Copyright (c) 1982, 2019, Oracle. All rights reserved.


마지막 성공한 로그인 시간: 금 1월 07 2022 22:57:44 +09:00


다음에 접속됨:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0


SQL> @createboard


테이블이 삭제되었습니다.


테이블이 삭제되었습니다.


휴지통이 지워졌습니다.


시퀀스가 삭제되었습니다.


테이블이 생성되었습니다.


테이블이 생성되었습니다.


테이블이 변경되었습니다.


테이블이 변경되었습니다.


테이블이 변경되었습니다.


시퀀스가 생성되었습니다.

 

3) 게시판 구현

board로 오라클을 접속해 로그인한다.

게시판 연동에 사용되는 스키마는 board를 사용한다.

conn.php

<?
$oserver = "ora";
$oname = "board";
$opassword = "board";
$conn=@oci_connect($oname, $opassword, $oserver) or die('Could not connect:');
?>

 

게시판이 보여질 화면을 구성한다.

view.php

view.php
0.01MB

view.php 실행 화면이다.

 

로그인에 필요한 회원가입을 하는 화면 구성이다.

id.html

id.html
0.00MB

id.html 실행 화면이다.

id.php

id.php
0.00MB

 

게시물 작성을 위한 insert.html, insert.php 구성이다.

insert.html

insert.html
0.00MB

insert.php

insert.php
0.00MB

insert 실행 화면이다.

 

로그인하지 않은 상태에서 다른 파일에 접근하지 못하도록 파일에 접근했을 때 로그인을 확인한다.

로그인이 되어있지 않은 상태에서는 로그인이 필요하다는 문구가 나온다.

login.php

login.php
0.00MB

login.php 실행화면

 

게시물을 보여줄 화면을 생성한다.

content.php

content.php
0.00MB

content의 실행화면이다.

 

게시물 삭제를 위한 구현이다.

del.php

del.php
0.00MB

del.php 실행화면이다.

 

4. 웹서버에 디렉토리 업로드

업로드할 디렉토리는 일단 zip으로 압축한다.

먼저 업로드할 디렉토리가 있는 위치로 접속한다.

윈도우 192.168.10.130 컴퓨터에서 ftp 192.168.11.137 으로 접속한다.

업로드할 디렉토리를 put으로 올린다.

C:\Users\st04>cd C:\Users\st04\web


C:\Users\st04\web>ftp 192.168.11.137
192.168.11.137에 연결되었습니다.
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
사용자(192.168.11.137:(none)): web
331 Please specify the password.
암호: kitri03
230 Login successful.
ftp> put board.zip
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 0.00초 51995.00KB/초
ftp>

 

웹서버 192.168.11.137의 /home/web 디렉토리에 파일이 잘 업로드된 것을 확인할 수 있다.

업로드된 파일을 Document Root(/home/httpd) 로 옮기고 unzip으로 압축을 푼다.

[root@CentOS8-3 ~]# cd /home/web
[root@CentOS8-3 web]# ls
board.zip httpd
[root@CentOS8-3 web]# mv /home/web/board.zip /home/httpd/html
[root@CentOS8-3 web]# cd /home/httpd/html
[root@CentOS8-3 html]# ls
20211001 20211022 20211105 20211119 20211203 board school
20211008 20211029 20211112 20211126 20211210 board.zip
[root@CentOS8-3 html]# rm -rf board
[root@CentOS8-3 html]# ls
20211001 20211022 20211105 20211119 20211203 board.zip
20211008 20211029 20211112 20211126 20211210 school
[root@CentOS8-3 html]# unzip board.zip
Archive: board.zip
creating: board/
inflating: board/conn.php
inflating: board/content.php
inflating: board/createboard.sql
inflating: board/del.php
inflating: board/id.html
inflating: board/id.php
inflating: board/insert.html
inflating: board/insert.php
inflating: board/login.php
inflating: board/view.php
inflating: board/논리모델.PNG
inflating: board/물리모델.PNG
[root@CentOS8-3 html]# ls
20211001 20211022 20211105 20211119 20211203 board school
20211008 20211029 20211112 20211126 20211210 board.zip

 

board가 잘 생성된 것을 확인할 수 있다.

 

5. 보안 구현

1) PW 저장된 해시값 다르게 설정한 사용자 인증 구현

사용자의 패스워드가 같아도 저장된 해시값은 달라 패스워드 추측이 어렵게 사용자 인증을 구현한다.

DBMS_CRYPTO.Hash(to_clob(to_char('$pw')),2)

 

다음과 같이 id값에 따른 pw 해시값을 저장한다.

DBMS_CRYPTO.Hash(to_clob(to_char(:v_id||:v_pw)),2)

 

id가 12인 것과 id가 1212인 것의 pw는 12로 동일하다. 하지만 password에 저장된 값은 password가 같이도 id값에 따라 pw 해시값을 저장하도록 하였다.

SQL> SELECT id, pw, name FROM id;


ID PW NAME
-------------------- -------------------------------------------------- ----------
12 A01610228FE998F515A72DD730294D87 12별명
34 14C879F3F5D8ED93A09F6090D77C2CC3 34별명
1212 93279E3308BDBBEED946FC965017F67A 1212별명

 

2) 로그인하지 않으면 파일 접근 불가능 구현

login.php를 통해 로그인이 있어야만 접근 가능한 파일에 로그인을 확인하도록 처리한다.

다음과 같이 로그인을 확인하도록 한다.

require('login.php');

 

로그인하지 않으면 다른 파일에 접근이 불가능하다는 것을 확인할 수 있다.

로그인하지 않고 다른 파일에 접근하면 로그인이 필요하다고 뜬다.

 

로그인을 하지 않으면 게시물에 접근이 불가능하다.

 

로그인하면 게시물에 접근 가능하다.

 

3) SQL Injection 예방 구현

아래와 같은 형태의 변수는 SQL Injection 공격이 가능하다.

$sql="select id, pw from id where id = '$id' and pw = DBMS_CRYPTO.Hash(to_clob(to_char('$pw')),2)";

 

SQL Injection 공격을 막기 위해 아래와 같이 bind 변수를 사용한다.

$sql="select id, pw from id where id = :v_id
and pw = DBMS_CRYPTO.Hash(to_clob(to_char(:v_id||:v_pw)),2)";

 

4) 게시글 작성자만 게시글 삭제 가능 구현

다음과 같은 sql문을 통해 게시물 작성자만 게시물이 삭제 가능하다.

$sql="delete from board where bno=:v_bno and id=:v_id";

 

하지만 게시물 작성자가 아닌 다른 아이디로 로그인하면 삭제 불가능한 것을 확인할 수 있다.

 

* AP 서버 설치 환경

호스트명 : ap
IP : 192.168.10.19
아파치 서버 경로 : /app/apache
아파치 : 2.2.34 (httpd-2.2.34.tar.gz)
PHP : 5.6.39 (php-5.6.39.tar.gz)
오라클 인스턴스 클라이언트 : 19.5.0.0.0

 

$ORACLE_BASE : /app/ora19c
$ORACLE_HOME : /app/ora19c/19c


* 설치 과정

step 1. 오라클 인스턴스 클라이언트 설치
step 2. Apache 설치
step 3. PHP 설치
step 4. Apache, PHP 설정
step 5. 서버 실행 후 연동 확인

 

[root@CentOS7-3 ~]# vi /etc/rc.d/rc.local
[root@CentOS7-3 ~]# /app/apache/bin/apachectl stop
[root@CentOS7-3 ~]#


이미 설치된 아파치를 삭제하고 시작한다.

[root@CentOS7-3 ~]# cd /app/apache
[root@CentOS7-3 apache]# ls
bin    cgi-bin  error   icons    lib   man     modules
build  conf     htdocs  include  logs  manual
[root@CentOS7-3 apache]# cd
[root@CentOS7-3 ~]# rm -rf /app/apache
[root@CentOS7-3 ~]# cd /app/apache
-bash: cd: /app/apache: 그런 파일이나 디렉터리가 없습니다

 

step 1. 오라클 인스턴스 클라이언트 설치

① 설치할 오라클 인스턴스 클라이언트는 오라클 한국어 사이트인 https://www.oracle.com/kr/index.ht
ml 에서 oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm 와 oracle-instantclient19.5-devel-
19.5.0.0.0-1.x86_64.rpm 두 개의 파일을 다운 받는다.

ftp서버에 있으므로 ftp로 다운 받을 것이다.

[root@CentOS7-3 ~]# ls
anaconda-ks.cfg                                         공개      사진
initial-setup-ks.cfg                                    다운로드  서식
oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm  문서      음악
oracle-instantclient19.5-devel-19.5.0.0.0-1.x86_64.rpm  바탕화면
pcre-8.45.tar.gz                                        비디오

 

② /usr/lib/oracle/19.5을 ORACLE_BASE 디렉토리로 설치된다.

[root@CentOS7-3 ~]# rpm -Uvh oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm
준비 중...                         ################################# [100%]
Updating / installing...
   1:oracle-instantclient19.5-basic-19################################# [100%]
[root@CentOS7-3 ~]# rpm -Uvh oracle-instantclient19.5-devel-19.5.0.0.0-1.x86_64.rpm
준비 중...                         ################################# [100%]
Updating / installing...
   1:oracle-instantclient19.5-devel-19################################# [100%]

 

③ sqlnet.ora 파일과 tnsnames.ora 파일을 생성한다.

[root@CentOS7-3 ~]# mkdir -p /usr/lib/oracle/network/admin/
[root@CentOS7-3 ~]# vi /usr/lib/oracle/network/admin/sqlnet.ora
[root@CentOS7-3 ~]# cat /usr/lib/oracle/network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES)

 

tnsnames.ora 파일을 수정한다.

[root@CentOS7-3 ~]# vi /usr/lib/oracle/network/admin/tnsnames.ora
[root@CentOS7-3 ~]# cat /usr/lib/oracle/network/admin/tnsnames.ora
oracle =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.11.135)(port = 1521))
      (CONNECT_DATA = (SID = DB19))
    )

ora =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.10.138)(port = 1521))
      (CONNECT_DATA = (SID = DB19))
    )

dal =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.10.11)(port = 1521))
      (CONNECT_DATA = (SID = DB19))
    )

 

step 2. Apache 설치

① httpd-2.X 소스파일을 /usr/local/에 다운받고 압축을 해제한다.

[root@CentOS7-3 ~]# cd /usr/local/
[root@CentOS7-3 local]# ls
apache2                games                include    pcre-8.45.tar.gz   share
apr-1.6.5.tar.gz       httpd-2.2.34         lib        php                src
apr-util-1.6.1.tar.gz  httpd-2.2.34.tar.gz  lib64      php-7.4.26         var
bin                    httpd-2.4.51         libexec    php-7.4.26.tar.gz
etc                    httpd-2.4.51.tar.gz  pcre-8.45  sbin
[root@CentOS7-3 local]# cd ./httpd-2.2.34

 

② configure → make → make install 순으로 컴파일 설치한다. 그 뒤에 여기부터 하기

[root@CentOS7-3 httpd-2.2.34]# ./configure --prefix=/app/apache --enable-rewrite --enable-so
[root@CentOS7-3 httpd-2.2.34]# make
[root@CentOS7-3 httpd-2.2.34]# make install

 

③ 아파치 서버를 실행하고 브라우저를 이용해서 접속 테스트를 진행한다.

[root@CentOS7-3 httpd-2.2.34]# /app/apache/bin/apachectl start
httpd: Could not reliably determine the server's fully qualified domain name, using fe80::da2f:8c5b:1b46:2ceb for ServerName

 

이런 경고 메시지가 뜨면 아래와 같이 /app/apache/conf/httpd.conf에 ServerName localhost를 추가한다.

[root@CentOS7-3 httpd-2.2.34]# vi /app/apache/conf/httpd.conf
...
ServerName localhost
...

 

아파치 서버를 다시 죽였다 살린다.

[root@CentOS7-3 httpd-2.2.34]# /app/apache/bin/apachectl stop
[root@CentOS7-3 httpd-2.2.34]# /app/apache/bin/apachectl start
[root@CentOS7-3 httpd-2.2.34]#

 

잘 실행되는 것을 확인할 수 있다.

 

step 3. PHP 설치

① PHP 설치전 컴파일을 위해 libxml 패키지 설치를 확인 후 설치한다.

[root@CentOS7-3 ~]# yum install -y libxml2*

 

이미 설치 되어있으므로 넘어간다.

[root@CentOS7-3 ~]# yum list libxml2*
Loaded plugins: fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp.iij.ad.jp
Installed Packages
libxml2.x86_64                         2.9.1-6.el7_9.6                  @updates
libxml2-devel.x86_64                   2.9.1-6.el7_9.6                  @updates
libxml2-python.x86_64                  2.9.1-6.el7_9.6                  @updates
libxml2-static.x86_64                  2.9.1-6.el7_9.6                  @updates
Available Packages
libxml2.i686                           2.9.1-6.el7_9.6                  updates
libxml2-devel.i686                     2.9.1-6.el7_9.6                  updates
libxml2-static.i686                    2.9.1-6.el7_9.6                  updates

 

② TNS_ADMIN, LD_LIBRARY_PATH와 같이 오라클 관련 경로 설정에 정의된 내용이 시스템에 존재하
는지 반드시 확인한다.

[root@CentOS7-3 local]# cd /usr/local/
[root@CentOS7-3 local]# tar xvfz php-5.6.39.tar.gz
[root@CentOS7-3 local]# cd php-5.6.39/
[root@CentOS7-3 local]# ./configure --with-apxs2=/app/apache/bin/apxs --with-oci8=instantclient,/usr/lib/oracle/19.5/client64/lib --enable-sigchild
[root@CentOS7-3 local]# make
[root@CentOS7-3 local]# make install
[root@CentOS7-3 php-5.6.39]# cp php.ini-development /usr/local/lib/php.ini
cp: overwrite `/usr/local/lib/php.ini'? y

 

step 4. Apache, PHP 설정

① /app/apache/conf/httpd.conf 파일의 내용을 수정한다. APO 서버 설정과 동일하다.

ServerName localhost // 추가 내용
.............
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php .html .htm .inc // 추가 내용

 

② /usr/local/lib/php.ini 파일에 PHP 실행 환경을 설정한다. APO 서버 설정과 동일하다.

short_open_tag = On
default_charset = "UTF-8" (or "EUC-KR")
include_path=".:/usr/local/lib"
upload_tmp_dir = /tmp
date.timezone = Asia/Seoul
error_reporting = E_ALL & ~E_NOTICE

 

③ /app/apache/bin/apachectl를 열어서 다음의 내용을 추가한다.

[root@CentOS7-3 ~]# vi /app/apache/bin/apachectl
...
# oracle install
export TNS_ADMIN=/usr/lib/oracle/network/admin
export LD_LIBRARY_PATH=/usr/lib/oracle/19.5/client64/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

(또는 AMERICAN_AMERICA.KO16MSWIN949)

 

step 5. 서버 실행 후 연동 확인

① /app/apache/htdocs/index.html 파일을 다음과 같이 수정한다.

[root@CentOS7-3 ~]# vi /app/apache/htdocs/index.html
<?
 $server = "oracle";
 $user_name = "st";
 $password = "st";
 $conn=@oci_connect($user_name,$password,$server) or die('not connect:');
 echo("Oracle 19c \$conn : $conn<br>");
 $st=oci_server_version($conn);
 echo("$st<br>");
 phpinfo();
?>

 

웹페이지에서 확인한다.

 

Document Root 변경

/home/httpd/html/index.html

이때 vi /app/apache/conf/httpd.conf 에서 Document Root가 /home/httpd/html으로 되어있는지 확인한다.

 

vi /home/httpd/html/index.html

<html>
 <head>
   <title> st04 </title>
   <meta charset="UTF-8">
 </head>
 <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
 <p>&nbsp;</p>
 <table border="1" align="center">
   <tr>
         <td width="100">
                 <p align="center">목록<br></p>
                                <p align="center"><a href="html">html</a><br></p>
                                <p align="center"><a href="python">python</a><br></p>
         </td>
    </tr>
 </table>
</html>
<br>
<?
 $server = "oracle";
 $user_name = "st";
 $password = "st";
 $conn=@oci_connect($user_name,$password,$server) or die('not connect:');
 echo("Oracle 19c \$conn : $conn<br>");
 $st=oci_server_version($conn);
 echo("$st<br>");
 phpinfo();
?>

아파치 설치

① 사전 작업 패키지 설치

# yum install -y gcc gcc-c++ cmake apr apr-util zlib-devel wget net-tools expat-devel

 

PCRE(Perl Compatible Regular Expressions)를 설치한다.

파일은 아래 경로에서 다운 로드 한다.
https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz/download

 

/usr/local 디렉토리에 파일을 복사한다.

 

# tar xvfz pcre-8.45.tar.gz

 

아래 명령을 통해 실행한다.

# cd pcre-8.45/

# ./configure --prefix=/usr/local
# make
# make install

 

 

② Apache 2.4와 관련 소스파일을 /usr/local/에 다운받는다.

# wget https://downloads.apache.org/httpd/httpd-2.4.51.tar.gz

# wget http://apache.tt.co.kr/apr/apr-1.6.5.tar.gz

# wget http://apache.tt.co.kr/apr/apr-util-1.6.1.tar.gz

 

 

③ 소스파일 압축을 푼다.
# tar xvfz apr-1.6.5.tar.gz
# tar xvfz apr-util-1.6.1.tar.gz
# tar xvfz httpd-2.4.51.tar.gz


# mv apr-1.6.5 ./httpd-2.4.51/srclib/apr
# mv apr-util-1.6.1 ./httpd-2.4.51/srclib/apr-util


④ 아파치를 설치한다.
# cd httpd-2.4.51
# ./configure --prefix=/app/apache --enable-rewrite --enable-so
# ./configure --with-included-apr --with-pcre=/usr/local/bin/pcre-config
# make
# make install


⑤ /app/apache/conf/httpd.conf 파일 편집한다.
# vi /app/apache/conf/httpd.conf
#ServerName www.example.com:80
ServerName localhost

 

⑥ 아파치서버를 실행한다.
# /app/apache/bin/apachectl start

 


PHP 설치

① 관련 패키지를 설치한다.
# yum install -y sqlite-devel libxml2* libpng-devel, libjpeg-devel


② PHP 7.X 소스파일을 /usr/local/에 다운받는다.
# wget https://www.php.net/distributions/php-7.4.26.tar.gz

 

③ 소스파일 압축을 풀고 설치한다.
# tar xvfz php-7.4.26.tar.gz
# cd php-7.4.26
# ./configure --with-apxs2=/app/apache/bin/apxs --enable-sigchild
# make
# make install
# cp php.ini-development /usr/local/lib/php.ini


④ Apache와 PHP 설정
# vi /app/apache/conf/httpd.conf
.............
LoadModule php7_module modules/libphp7.so

AddType application/x-httpd-php .php .php3 .php4 .php5 .html .htm .inc


.............
# vi /usr/local/lib/php.ini
short_open_tag = On

include_path = ".:/usr/local/lib"

upload_tmp_dir = /tmp

error_reporting = E_ALL & ~E_NOTICE


⑤ test page를 생성하고 아파치서버를 재실행한다.

이때 vi /app/apache/conf/httpd.conf 에서 Document Root가 /home/httpd/html으로 되어있는지 확인한다.


# vi /home/httpd/html/index.html


# /app/apache/bin/apachectl stop
# /app/apache/bin/apachectl start

 

192.168.10.133 으로 접속하면 아래와 같이 php가 뜨는 것을 확인할 수 있다.


web 페이지에 디렉토리 업로드하기

 

# vi /home/httpd/html/index.html

<html>
 <head>
   <title> st04 </title>
   <meta charset="UTF-8">
 </head>
 <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
 <p>&nbsp;</p>
 <table border="1" align="center">
   <tr>
         <td width="100">
                 <p align="center">목록<br></p>
                 <p align="center"><a href="html">html</a><br></p>
                 <p align="center"><a href="python">python</a><br></p>
         </td>
    </tr>
 </table>
</html>
<br>
<?
phpinfo()
?>


재시작한다.
# /app/apache/bin/apachectl restart

 

디렉토리 업로드하기

업로드할 디렉토리는 일단 zip으로 압축한다.

먼저 업로드할 디렉토리가 있는 위치로 접속한다.

ftp 192.168.10.133 으로 접속한다.

업로드할 디렉토리를 put으로 올린다.

 

/home/webmaster에 파일이 업로드 된 것을 확인할 수 있다.

Document Root에 파일을 이동한다.

 

unzip을 통해 압축을 푼다.

 

압축이 풀린것을 확인한다.

 

192.168.10.133 에 접속하면 html이 있는 것을 확인할 수 있다.

 


samba 로 접속

 

samba 실습 2 - webmaster samba 실습

실습 < 실습 일지 > 1) 리눅스에 samba 설치 및 확인 2) webmaster 그룹 및 사용자 생성, samba 사용자 생성 3) 마운트 해제 및 링크디렉토리 연결 4) smb.conf 파일 수정 및 samba 서비스 실행 5) 링크 디렉토리.

lemonandgrapefruit.tistory.com

링크를 걸지 않고 진행할 것이다.

 

cat /etc/samba/smb.conf 에서 아래와 같이 추가

[st]
    comment = Test dir
    path = /home/httpd
    public = no
    writable = yes
    write list = st04
    create mask = 0777
    directory mask = 0777
    valid users = st04
    browseable = yes

 

그룹 소유자를 st04로 변경하고 그룹권한에 쓰기를 추가한다.

chgrp st04 /home/httpd

chmod g+w /home/httpd

 

 

 

samba 재시작

 

디렉토리 생성이 잘 되는 것을 확인할 수 있다.

실습

< 실습 일지 >

1) 리눅스에 samba 설치 및 확인

2) webmaster 그룹 및 사용자 생성, samba 사용자 생성

3) 마운트 해제 및 링크디렉토리 연결

4) smb.conf 파일 수정 및 samba 서비스 실행

5) 링크 디렉토리 접속 허용

6) 링크 디렉토리 연결 후 다시 접속

 

1) 리눅스에 samba 설치 및 확인

리눅스에 samba 가 설치되어있는지 yum list samba로 확인한다.

yum install -y samba 로 samba 를 설치한다.

 

samba 설치 완료

 

2) webmaster 그룹 및 사용자 생성, samba 사용자 생성

groupadd -g 1600 st 그룹 생성

 

webmaster 비밀번호 변경해준다.

 

samba 계정도 만들어준다.

 

3) 마운트 해제 및 링크파일 연결

다큐먼트 루트 DROOT 디렉토리 : /home/httpd/html

/home/httpd가 /home/webmaster/httpd에 마운트가 지정되어있을 경우 아래와 같이 마운트 된다.

 

vi /etc/rc.local 에 /home/httpd 가 /home/webmaster/html mount가 자동으로 설정되어 있으므로 우리는 링크파일로 연결해주기 위해 mount를 삭제하고 리부트한다.

 

마운트를 해제하면 아래와 같이 마운트가 해제되어있다.

 

링크디렉토리 연결

ln -s /home/httpd /home/webmaster/httpd

 

4) smb.conf 파일 수정 및 samba 서비스 실행

vi /etc/samba/smb.conf

smb.conf 파일에서 print문 삭제 (안 해줘도 되긴 하다.)

 

\\192.168.10.133\ 에 접속한후 /home/webmaster/httpd 로 접속하려는데 접근이 막혀있다.

 

 

5) 링크 디렉토리 접속 허용

이 부분은 vi /etc/samba/smb.conf 에서 수정한다.

[globla] 부분에 아래와 같이 추가해준다.

follow symlinks = yes
wide links = yes
unix extensions = no

 

수정 후 samba 서비스를 재시작

systemctl restart smb.service

 

6) 링크 디렉토리 연결 후 다시 접속

\\192.168.10.133\  으로 접속하고 /home/webmaster/httpd로 접속이 잘 되는 것을 확인할 수 있다.

 

 

쓰기가 잘 되는 것을 확인할 수 있다.

 

samba

• 네트워크를 통해 파티션을 공유하도록 제공하는 서비스
• 유닉스 시스템과 windows 시스템간 파일 시스템 공유
• 유닉스 계열의 거의 모든 시스템에서 제공
• 시스템의 리소스를 직접 제공하는 서비스이므로 보안에 주의한다.
  - 응용을 제공하는 것이 아니라 리소스를 제공하는 서비스이다.

 

samba 구성

 

Samba 서버 확인 및 설치
# yum list samba
# yum install -y samba


데몬
/usr/sbin/smbd
- 공유 기능을 담당하는 데몬 (139번 포트 이용)
/usr/lib/systemd/system/smb.service
- 데몬 실행 스크립트
/etc/samba/smb.conf
- Samba 설정파일


데몬 실행
# systemctl start smb.service

 

관련 파일
• 환경 설정 파일 : /etc/samba/smb.conf


관련 명령어
• 사용자 등록 및 password 변경 : /usr/bin/smbpasswd
   - smbpasswd [-a] 유저명
     -a : 유저 등록
     -x : 유저 삭제
     -d, -e : 사용중지, 재사용
• 삼바 계정 확인 :
   - pdbedit -w -L
• smb.conf 구문 검사 : /usr/bin/testparm
• NetBIOS명 검색 : /usr/bin/nmblookup

 

Samba – smb.conf [Global]

workgroup
 : NT 도메인 명 지정


netbios name
 : 네트워크 이름
  (기본값 : 호스트명)


hosts allow (allow 지정된 것만 접속 가능)
 : 허가 항목 지정(지정된 것만 접속 가능)
ex) host allow = 1.1.1. EXCEPT 1.1.1.11 1.1.1.12
= 1.1.1.0/255.255.255.0


hosts deny
 : 접속 거부 항목 지정 (형식은 hosts allow와 동일)


guest account
• 윈도우의 quest 사용자 매핑 계정 설정
• nobody 또는 유닉스 계정으로 매핑 가능
• 주석 처리하면 guest 접속 불가(권장)

 

security
• user, share, server(domain) 중 설정
- security = user
- passdb backend = tdbsam
• 일부 예전 버전의 경우 user 설정 시 추가 설정 필요
- encrypt passwords = yes
- smb passwd file = /etc/samba/smbpasswd

 

Link 디렉토리 접근
보안 설정으로 인해 Symlink 디렉토리에 대한 기본 접근이 불허된다.
이를 허용하기 위해서는 아래와 같이 추가한다.
follow symlinks = yes
wide links = yes
unix extensions = no

 

언어셋 지정 (반드시 test 후 설정한다.)
unix charset = utf-8
dos charset = cp949


유닉스 계열의 언어셋과 클라이언트인 윈도의즈 계열의 언어셋이 서로
다름으로 반드시 지정해야 한다.


Smb.conf 파일에 다음을 내용 추가
• server signing = auto
[auto | mandatory | disabled]
• mandatory는 smb2만 지원하므로 이전 버전의 windows에서는 접
속이 불가능 할 수도 있다.

 

윈도우 XP와 같은 Samba 접속이 거부되는 운영체제의 경우 다음
설정을 활성화 해준다.
lanman auth = yes
ntlm auth = yes

 

비활성화\ 된 경우 SPNEGO 지원의 클라이언트만 허용한다.즉 이는 NTLMv2
가 NTLMSSP 내에서만 지원됨을 의미한다.
• SPNEGO는 The Simple and Protected GSS-API Negotiation
Mechanism(IETF RFC 2478)에 정의된 표준 스펙.
• NTLM은 Windows 네트워크에서 NT LAN Manager는 Microsoft 보안 제품
군으로 사용자에게 인증, 무결성 및 기밀성을 제공하기위한 프로토콜로 이전
Microsoft 제품인 Microsoft LAN Manager의 인증 프로토콜의 후속 제품
입니다.

 

comment = 여기는 공유 경로입니다.
• 주석 처리
path = /home/data
• 공유 경로 지정
browseable = no
• 공유 정보를 제공할지 여부(yes/no)
• 권한이 없는 사용자에게는 보이지 않는다.
writable = yes
• 쓰기 권한 접근 허용여부(yes/no)
• Write list 설정과 무관하게 퍼미션이 있으면 쓰기 가능하다.
Public = no
• 누구에게나 접근을 허용 할지 여부(yes/no)
Read only = yes
• 읽기 전용 접근 여부(yes/no)

valid users = fred
• 접근 가능한 사용자
write list = +group user
• 공유 경로에서 쓰기 가능한 그룹이나 유저
(force) create mask = 644
(force) directory mask = 755
(force) group = 그룹명


[homes]는 기본 이름으로 사용됨
• 각 계정의 홈 디렉토리 사용
[homes]
comment = Home Directories
browseable = no
writable = yes

 

Samba – smb.conf [Share]

설정 예
[public]  // 누구나 접근 가능
comment = Public dir
path = /home/pub
public = yes
writable = no
write list = +te usr01  // te 그룹에 속한 사람 업로드 가능
[project]  //몇명만 사용 가능
comment = project  //이름 지정하는거라 아무거나 지정
valid users = usr01 usr02
path = /home/pro1
public = no
browseable = yes
writable = yes

 

samba 서버 확인

 


실습

실습 내용

192.168.10.131번 컴퓨터에서 실행

st01, st02, test 계정이 공동으로 사용할 st 를 구현한다.
• st01, st02는 자원에 대한 모든 권한이 있지만 test는 read only로 지정한다. (패스워드는 12로 설정)

 

작업일지

1) 리눅스에 samba 설치 및 확인

2) 그룹 및 사용자 생성, samba 계정 생성

3) samba로 test할 디렉토리 생성 ( /home/st ) 및 권한 변경

4) smb.conf 파일 수정 및 samba 서비스 실행

5) 윈도우에서 st01, st02, test 테스트

 

1) 리눅스에 samba 설치 및 확인

리눅스에 samba 가 설치되어있는지 yum list samba로 확인한다.

 

yum install -y samba 로 samba 를 설치한다.

 

2) 그룹 및 사용자 생성, samba 사용자 생성

groupadd -g 1600 st 그룹 생성

 

useradd -g 1600 -u 160# st## 유저 생성

 

패스워드는 모두 12 로 한다.

 

samba 계정도 만들어준다

 

3) samba로 test할 디렉토리 생성 및 권한 변경

/home/st 디렉토리 생성

 

권한을 777로 준다.

 

권한을 777로 주지 말고 아래와 같이 그룹소유자와 권한을 변경해 확인한다.

# chown st01.st st

# chmod 770 st

# ll

 

4) smb.conf 파일 수정 및 samba 서비스 실행

vi /etc/samba/smb.conf

[st]
    comment = Test dir
    path = /home/st
    public = no
    writable = no
    write list = st01 st02
    create mask = 0755
    directory mask = 0755
    valid users = st01 st02 test
    browseable = yes

 

systemctl start smb.service 시작한다.

 

 

5) 윈도우에서 st01, st02, test 테스트

st01

 

st01로 로그인한다.

st와 st01이 잘 보이는 것을 확인한다.

 

st01에서 txt 파일을 생성하면 읽기와 쓰기가 가능하므로 작업이 가능하다.

파일이 잘 생성되는 것을 확인할 수 있다.

 

st01에서 test_02를 읽으면 잘 읽힌다.

 

다른 계정으로 실행하기 위해 cmd 창에서 net use /delete \\192.168.10.131 을 입력해 연결을 해제한다.

이 방법이 안된다면 컴퓨터를 리부트하는 방법도 있다.

 

st02

st02로 로그인 한다.

 

읽기와 쓰기가 잘 된다.

 

 

test

test계정으로 쓰기하려면 쓰기가 안된다. read only 설정이라 저장 권한이 없다.

 

 

현재 사용하고 있는 계정을 알고 싶으면 net use 를 입력한다.

 

실습 내용

1. NFS 서버 : 192.168.10.131
   NFS 클라이언트 : 192.168.10.133

2. 서버와 클라이언트에 각각 아래와 같은 사용자와 그룹 생성한다.
 - 서버
group : nfstest(1400)
user : nfstest1, nfstest2
nfstest1 gid# : 1400, uid# : 1401
nfstest2 gid# : 1400, uid# : 1402

 - 클라이언트
group : nfstest(1400)
user : nfstest1, nfstest2
nfstest1 gid# : 1400, uid# : 1401
nfstest2 gid# : 1400, uid# : 1403

3. 파일 생성 및 테스트
TEST1 : /nfstest/a1 192.168.10.133(rw, no_root_squash)
TEST2 : /nfstest/a2 192.168.10.133(rw, all_squash)
TEST3 : /nfstest/a3 192.168.10.133(rw, no_all_squash)
TEST4 : /nfstest/a4 192.168.10.133(rw, all_squash,root_squash)
TEST5 : /nfstest/a5 192.168.10.133(rw, all_squash,no_root_squash)
TEST6 : /nfstest/a6 192.168.10.133(rw, no_all_squash,root_squash)
TEST7 : /nfstest/a7 192.168.10.133(rw, no_all_squash,no_root_squash)
TEST8 : /nfstest/a8 192.168.10.133(rw, anonuid=1401,anongid=1400)


1. /etc/exports 설정파일 수정 및 사용자 생성

1) 서버에서 /etc/exports 설정파일 수정 및 권한 부여

vi /etc/exports 환경설정파일에 디렉토리 권한 부여

/home/a1 192.168.10.133(rw,no_root_squash)
/home/a2 192.168.10.133(rw,all_squash)
/home/a3 192.168.10.133(rw,no_all_squash)
/home/a4 192.168.10.133(rw,all_squash,root_squash)
/home/a5 192.168.10.133(rw,all_squash,no_root_squash)
/home/a6 192.168.10.133(rw,no_all_squash,root_squash)
/home/a7 192.168.10.133(rw,no_all_squash,no_root_squash)
/home/a8 192.168.10.133(rw,anonuid=1401,anongid=1400)

 

2) 사용자 생성

서버에서 사용자 생성

 

클라이언트에서 사용자 생성

 

2. 서버, 클라이언트에 디렉토리 생성 및 마운트

1) 서버 디렉토리 생성

ls -al /home

 

서버에서 쓰기 권한을 주기 위해 모든 디렉토리 권한을  777로 변경한다.

 

2) 클라이언트 디렉토리 생성

ls -al /home

 

쓰기 권한을 주기 위해 모든 디렉토리 권한을  777로 변경

 

nfs.service 재시작

 

3) 마운트하기

df로 마운트 확인

 

3. 클라이언트 각 계정으로 파일 생성 후 서버에서 확인

1) 클라이언트 각 계정에서 파일 생성

root - /home/a*/root.txt
nfstest1 - /home/a*/test1.txt
nfstest2 - /home/a*/test2.txt

root

nfstest1

nfstest2

 

2) 서버 확인

TEST1 : /home/a1 192.168.10.133(rw, no_root_squash)

클라이언트의 root 서버의 root와 일치시켜 서버측에서 소유자가 root라 나온다.

일반 유저는 디폴트값 no_all_squash 이므로 서버 사용자와 클라이언트 사용자를 일치시킨다.

nfstest1의 uid는 서버와 클라이언트에 둘다 생성되어있는 1401 uid이므로 nfstest1으로 나오지만

클라이언트의 nfstest2의 uid는 1403으로 서버에 없는 uid이므로 숫자로 나오게 된다.


TEST2 : /home/a2 192.168.10.133(rw, all_squash)

all_squash는 모든 일반 유저인 nfstest1과 nfstest2 모두 nobody를 뜻하는 nfsnobody로 소유권이 변경되었다.

디폴트값 root_squash로 인해 클라이언트 root가 생성한 root.txt 또한 nobody로 매핑되었다.


TEST3 : /home/a3 192.168.10.133(rw, no_all_squash)

no_all_squash라 하여 서버와 클라이언트의 사용자를 일치시켜 nfstest1과 nfstest2(1403)가 나오게 되었다.

nfstest2는 uid/gid가 다르므로 클라이언트에서 생성한 소유권으로 나오게 된다.

디폴트값 root_squash로 인해 클라이언트 root가 생성한 root.txt 또한 nobody로 매핑되었다.


TEST4 : /home/a4 192.168.10.133(rw, all_squash,root_squash)

일반 유저를 all_squash로 하여 nfstest1과 nfstest2가 생성한 파일을 nobody로 매핑 시킨다.

디폴트값 root_squash로 인해 root 또한 nobody로 매핑 시킨다.


TEST5 : /home/a5 192.168.10.133(rw, all_squash,no_root_squash)

no_root_squash로 클라이언트의 root와 서버의 root를 일치시켜 소유권이 root로 나오게 된다.

하지만 root.txt 파일을 all_squash로 인해 모든 사용자가 nobody로 매핑된다.

root.txt , test1.txt , test2.txt 모두 nobody로 매핑된다.


TEST6 : /home/a6 192.168.10.133(rw, no_all_squash,root_squash)

no_all_squash라 하여 서버와 클라이언트의 사용자를 일치시켜 nfstest1과 nfstest2가 나온다.

nfstest2는 uid/gid가 다르므로 클라이언트에서 생성한 소유권으로 나오게 된다.

root_squash로 인해 클라이언트의 root를 nobody로 매핑한다.


TEST7 : /home/a7 192.168.10.133(rw, no_all_squash,no_root_squash)

 

no_all_squash라 하여 서버와 클라이언트의 사용자를 일치시켜 nfstest1과 nfstest2가 나오게 되었다.

nfstest2는 uid/gid가 다르므로 클라이언트에서 생성한 소유권으로 나오게 된다.

클라이언트의 root와 서버의 root를 일치시켜 소유권이 root로 나오게 된다.

 

TEST8 : /home/a8 192.168.10.133(rw, anonuid=1401,anongid=1400)

디폴트 값 no_all_squash를 통해 서버와 클라이언트의 사용자를 일치시켜 nfstest1과 nfstest2가 나오게 되었다.

nfstest2는 uid/gid가 다르므로 클라이언트에서 생성한 소유권으로 나오게 된다.

다른 디폴트 값 root_squash로 인해 클라이언트의 root를 nobody로 매핑해야 하지만

anonuid=1401, anongid=1400 은 서버 측과 클라이언트 측 모두 nfstest1의 uid와 gid가 동일한 것이므로

nobody가 아닌 nfstest1의 소유권으로 나오게 된다.

 

결과

  all_squash no_all_squash
root_squash root 포함 모든 사용자 nobody 매핑 root만 nobody 매핑
서버, 클라이언트 사용자 일치
no_root_squash root 포함 모든 사용자 nobody 매핑 root 와 사용자 모두 일치

 

NFS 서비스 구성

NFS 서버 : 192.168.10.131

NFS 클라이언트 : 192.168.10.133

 

다른 사람과 테스트

클라이언트 192.168.10.123 에서 192.168.10.131로 접근 허용

클라이언트에서 192.168.10.133 에서 192.168.10.141로 접근

 

직접 테스트는 클라이언트에서 서버로 마운트한다.

 

1. NFS 서버에서 nfs가 설치 확인

보통 설치되어 있다.

 

2. 서버에서 마운트할 디렉토리 /home/pub를 생성

 

확인하기위해 /home/pub에 a.txt를 생성한다.

 

3. /home/pub 디렉토리에 other 에 권한 rw를 준다.

 

4. vi /etc/exports에 /home/pub를 read only로 설정한다.

 

nfs.service를 재시작한다.

 

 

5. 클라이언트 192.168.10.133 컴퓨터에서 192.168.10.131 컴퓨터로 마운트해본다.

 

NFS

• 네트워크를 통해 파티션을 공유하도록 제공하는 서비스
• Sun사에서 개발되어 대부분의 유닉스에서 사용
• 유닉스 계열의 거의 모든 시스템에서 공유 가능
• 시스템의 리소스를 직접 제공하는 서비스이므로 보안에 주의한다.
  - 응용을 제공하는 것이 아니라 리소스를 제공하는 서비스이다.

 

 

 

 

 

NFS 설치

이미 설치되어 있다.

NFS 서버 설치 확인
# rpm -qa | grep nfs-utils
nfs-utils-1.2.3-64.el6.x86_64
nfs-utils-lib-1.1.5-11.el6.x86_64
# rpm -qa | grep rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64


관련 파일

• 데몬 : /usr/sbin/exportfs
/usr/sbin/rpcbind
• 관리 스크립트 : /usr/lib/systemd/system/nfs.service  //ntsysv 에서 nfs.service 선택하기
/usr/lib/systemd/system/rpcbind.service
• 환경 설정 파일 : /etc/exports
이전 버전은 portmap을 이용한다. (rpcbind 대신에)

 

NFS 서버 실행

# systemctl start nfs.service
• 관련 패키지인 nfs-server.service는 자동으로 실행된다.

 

NFS 서버 - exports

NFS로 제공될 자원과 권한 설정
형식
[export 할 디렉토리] [허가할 클라이언트][(옵션)]
• 허가할 클라이언트 지정
 - 주소/넷마스크의 표현 형식으로 사용가능
  ex. 203.228.182.0/24 --> 203.228.182네트워크의 모든 주소
 - 하나의 IP 및 호스트의 주소로 적을 수 있다.
  *, ?등의 와일드카드를 이용 여러 서버를 나타낼 수 있다.
  ex. *.msmc.or.kr --> msmc 도메인에 있는 모든 서버

 

NFS 서버 – exports 옵션

- ro : 읽기 전용, rw : 읽기 쓰기 허용
- root_squash : 클라이언트의 root를 nobody로 매핑
- no_root_squash : 클라이언트의 root와 서버의 root를 일치시킨다.
- all_squash : 모든 사용자를 nobody로 매핑
- no_all_squash : 서버의 사용자와 클라이언트의 사용자를 일치시킨다.
- All_squash와 no_all_squash 설정에서 root는 어떻게 매칭되는지 확인한다.

  일반 유저 root
Default no_all_squash root_squash
설정 all_squash no_root_squash

- anonuid=uid, anongid=gid : nobody로 매핑 될경우 지정된 계정이나
그룹으로 대상을 변경한다.
- sync : 파일 쓰기 후에 디스크 동기화
- insecure : 인증되지 않은 접속도 허용
※ 서버-클라이언트간 계정 매핑은 UID를 기준으로 한다.

 

NFS 클라이언트 - mount

• 명령
mount –t nfs NFS서버IP:/공유디렉토리 /마운트할디렉토리
ex) mount 192.168.10.31:/home/pub /home/pub
 - 일반 mount와 동일하다.
 - 재귀적인 mount는 불허된다.

• fstab에 등록
 - 부팅시에 자동으로 마운트 된다.

 

NFS – ex 예

# cat /etc/exports
/                                   master(rw) trusty(rw,no_root_squash)
/home/down          192.168.3.10(rw) 192.168.3.11(ro)
/home/joe                pc001(rw,all_squash,anonuid=150,anongid=100)
/pub                            (ro,all_squash)

 

 

NFS 실습

 

 

특정 ip의 도메인 확인한다.

같은 ip지만 다른 도메인에서 서로 다른 웹페이지 열리도록 설정할 것이다.

 

도메인 이름 기반 호스트

conf/extra/httpd-vhosts.conf 파일 설정

 

NameVirtualHost *:80 ← * 대신 IP 지정이 가능하다.


<VirtualHost *:80>
ServerAdmin [메일 주소]
DocumentRoot "[Web 홈 디렉토리]"
ServerName [접속 도메인명]
ServerAlias [별명]
ErrorLog "logs/[에러 로그 파일명]"
CustomLog "logs/[접속 로그 파일명]" common
</VirtualHost>

 

httpd.conf 에서 extra/httpd-vhosts.conf 파일에 대한 include 설정이 필요하다.

 

주의 사항
• 호스팅 디렉토리에 대한 접근 설정이 유효  //해당 디렉토리 퍼미션 있어야함
• conf/extra/httpd-vhosts.conf를 참고 
• apache 설정보다 name server설정이 우선
• 호스팅 중인 호스트명이 name 서버에서 확인
• 시스템의 호스트명과 /etc/hosts에 기록된 이름이나 IP를 동일하게 설정

 

 

실습

실습내용

웹서버 아파치에 가상 호스트 설정

ip 하나에 2개 도메인 설정

DNS 서버 : 192.168.10.131

Apache 서버 : 192.168.10.133

클라이언트 192.168.10.139

 

실습 과정

1) DNS 서버에 두개 도메인 설정하기

   192.168.10.131 컴퓨터에 ip주소 192.168.10.133 www.st04.sec , www.st04.itc 설정

2) Apache 서버에 /app/apache/conf/extra 설정하기

3) 클라이언트 (192.168.10.139)에서 확인

 

 

1) DNS 서버에 두개 도메인 설정하기

   192.168.10.131 컴퓨터에 ip주소 192.168.10.133 www.st04.sec , www.st04.itc 설정

 

DNS 서버에서 /etc/named.conf 파일 확인

# vi /etc/named.conf

 

zone 파일 확인

st04.zone

 

st04_itc.zone 

 

권한 변경

# /var/named/* 모두 그룹 소유자를 named로 변경한다.

 

named.service를 재시작한다.

 

host 를 잘 받아오는 것을 확인한다.

 

 

2) Apache 서버에 /app/apache/conf/extra 설정하기

 

ip주소기반으로 ip를 두개 설정해 줬었던 ens32:0을 삭제해줄 것이다.

 

/etc/sysconfig/network-scripts/ifcfg-ens32:0를 삭제한다.

네트워크를 재시작한다.

 

ipconfig를 통해 ens32:0이 삭제된 것을 확인할 수 있다.

 

/app/apache/conf/httpd.conf 파일 수정

# vi /app/apache/conf/httpd.conf 여기서 ip 주소 기반으로 지정해줬던 Virtual hosts 는 삭제해준다.

 

conf/extra/httpd-vhosts.conf 를 사용할 것이므로 주석은 제거한다.

 

/app/apache/conf/extra/httpd-vhosts.conf 파일 수정

# vi /app/apache/conf/extra/httpd-vhosts.conf 파일에 VirtualHost를 추가해 수정한다. 

NameVirtualHost 192.168.10.133:80

<VirtualHost 192.168.10.133:80>
        DocumentRoot "/home/httpd/html/sec"
        ServerName www.st04.sec
        ServerAlias st04.sec
        ErrorLog "logs/sec01_error_log"
        CustomLog "logs/sec01_log" common
        <Directory "/home/httpd/html/sec">
        Options Indexes FollowSymlinks
        Order allow,deny
        Allow from All
        </Directory>
</VirtualHost>

<VirtualHost 192.168.10.133:80>
        DocumentRoot "/home/httpd/html/itc"
        ServerName www.st04.itc
        ServerAlias st04.itc
        ErrorLog "logs/itc01_error_log"
        CustomLog "logs/itc01_log" common
        <Directory "/home/httpd/html/itc">
        Options Indexes FollowSymlinks
        Order allow,deny
        Allow from All
        </Directory>
</VirtualHost>

 

도메인별 다큐멘트 루트 디렉토리 생성

/home/httpd/html/sec, /home/httpd/html/itc 디렉토리를 생성한다.

 

각 디렉토리에 index.html 파일을 생성해준다.

 

도메인별로 접속해서 확인하기 위해index.html 파일에 테스트 문구를 넣어준다.

 

아파치 서비스를 재시작해준다.

# /app/apache/bin/apachectl restart

 

 

3) 클라이언트에서 확인

192.168.10.139 컴퓨터에서 DNS 주소를 192.168.10.131로 변경하고 테스트를 진행한다.

 

 www.st04.sec/ , www.st04.itc/ 를 접속해본다.

접속이 잘 되는 것을 확인할 수 있다.

+ Recent posts