아파치 설치

① 사전 작업 패키지 설치

# 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 재시작

 

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

xclock 실행

원격 데스크탑 연결을 하기 전에 xclock처럼 x윈도우에서만 사용 가능한 명령어를 실행해본다.

x윈도우에서 # yum install xorg-x11-apps.x86_64 를 설치한다.

 

xclock 명령어를 입력하면 오른쪽과 같이 시계가 뜬다.

 

xclock는 x윈도우 프로그램이기 때문에 터미널에서는 실행이 되지 않는다.


원격 데스크 탑 연결

1) FTP 접속과 epel 다운로드
# yum install -y ftp
# ftp 192.168.10.11
ftp> cd data/down/security
ftp> get epel-release-7-11.noarch.rpm
ftp> quit


2) 프로그램 설치와 재부팅
# rpm -ivh epel-release-7-11.noarch.rpm
# yum install -y xrdp
# yum install -y xrdp tigervnc-server
# systemctl enable xrdp.service
# systemctl start xrdp.service

 

3) 원격 데스크탑 접속

[Windows 보조프로그램] – [원격 데스크톱 연결]에 들어간다.

ip주소와 사용자 이름을 입력한다.

 

디스플레이 구성을 설정하고 연결한다.

 

비밀번호를 치고 접속하면 접속이 완료된다.


Xming 서버 설정

Xming : 윈도우에서 바로 x윈도우 서버를 실행하는 방법

 

1) Xming-6.9.0.31-setup.exe 설치

 

2) 설치후 [시작]에서 xming 실행

아래와 같이 실행중이면 되는 것이다.

3) X11 관련 패키지 설치
# yum install -y xorg-x11-apps.x86_64
# yum install -y xorg-x11-xauth.x86_64
# yum install -y xorg-x11-server-Xorg.x86_64

 

4) /etc/ssh/sshd_config 파일 설정
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

위와 같이 되어있는지 확인

 

5) Putty 설정

사용할 리눅스 ip를 로드후 SSH > X11에서 Enable를 설정한다. 다시 세션으로 돌아가 저장을 눌러준다.

 

리부트한 후 xclock 명령을 설정하면 아래와 같이 시계가 나온다.

 

▷ 암호 개념

통신 당사자들끼리만 아는 비밀스러운 신호나 부호
암호화와 복호화하기 위한 원리, 수단, 방법 등을 취급하는 기술이나 과학

암호 시스템에서 기밀성, 무결성 확인

** plain text : 주고받는 메시지

- 암호 알고르즘, 복호 알고리즘은 같은 것을 사용한다. 

- 문제가 없는 알고리즘만 사용한다.

- 메시지를 보낼 때 평문으로 보내든 암호문으로 보내든 속도 저하가 없다.

 

평문을 암호화하기 위한 연산자의 유형

• 치환 (Substitution) : 평문의 각 원소를 다른 원소로 사상
• 전치 (Transpostion) : 평문의 각 원소를 재배열 (글자 재배열)
• 혼합 (Confusion) : 평문의 원소를 치환 선택(bit) (치환, 전치 혼합 사용)
• 확산 (Duffusion) : 평문의 원소를 확대(bit) (비트 수 확대)

 

사용된 키의 수

 대칭키 

: 송수신자가 같은 키를 사용

대칭키 : 암호키 = 복호키

키를 나눠가져야 해서 만나서 키를 나눠가져야 한다.

 

• 공개키 

: 송수신자가 다른 키를 사용

공개키 : 암호키 ≠ 복호키

공개키와 개인키가 있어야 암호화, 복호화를 할 수 있다.

송신자와 수신자가 각각 자신만의 공개키와 개인키를 만든다.

네트워크상에 공개키만 공개한다.

송신자는 수신자의 공개키를 가져와 암호화해 암호문을 수신자에게 보낸다. 

수신자는 수신된 암호문을 자신의 개인키로 복호화한다.

  * 단점은 너무 느림.

 

평문 처리 방법

• 블록 암호화 (Block cipher) : 연산을 블록단위로 처리
• 스트림 암호화 (Stream cipher) : 입력을 연속적으로 처리

 

 

▷ 암호 원리

단대단 암호 (End-to-End Encryption)

• OSI 참조모델에서 가장 높은 계층(7,6)에서 이루어진다.
• 네트워크에서 보안유지에 실패하더라도 데이터의 비밀성은 위협받지 않는다.
• 암호화는 송수신 프로세서가 담당한다.


링크 암호 (Link Encyption)

• OSI 참조모델에서 가장 낮은 계층(1,2)에서 암호화된다.
• 송수신 호스트나 중간 노드에서 노출된다.
• 신뢰적인 호스트 사이에 비신뢰적인 매체를 사용할 때 유리하다.
• 암호화는 송수신 호스트에서 담당한다.

• 유선 전화에서 음성을 암호화할 경우 사용한다.

 

** 단대단 암호와 링크 암호는 사용용도만 다르다.

 

관용 암호 ( = 대칭키 암호 )

• 암호/복호에 동일한 키 와 동일한 알고리즘 사용
• 수신자와 송신자는 키를 교환해야 함
• 공유한 키(비밀키)는 비밀로 유지
• 키 분배의 어려움
• 디지털 서명 불가능
• 속도가 빠름


공개키 암호

• 암호/복호에 각각 서로 다른 키 와 동일한 알고리즘 사용
• 수신자와 송신자는 연관된 키쌍 중 하나를 알아야 함
• 키 쌍중 하나(개인키)를 비밀로 유지
• 공개키를 공개
• 디지털 서명 가능
• 속도가 느림

 

 

고전적 암호 기술 (손으로 하는 암호 기법)

암호 방법
• 다양한 원문의 변환에 의해 외부인이 그 의미를 알지 못하도록 메시지를 변형
• 치환, 전치를 이용 원문을 숨김

 

1) Steganograhpy

: 메시지를 특정 메시지 위치에 숨기는 방법

특징

• 전송 내용을 숨기는 방법

• 메시지의 존재 자체를 은폐
• 원문 내의 단어나 문자를 적당히 배열 함으로써 실제 메시지를 나타냄

 

예제

• 문자 마킹 (Character marking)
  - 원문의 문자에 연필로 덧써서 표시를 해 빛을 적당한 각도로 비춰어야만 보임
• 보이지 않는 잉크 (Invisible ink)
  - 종이에 열이나 화학 처리를 해야만 보이는 잉크를 사용
• 핀 구멍 (Pin punctures)
  - 빛을 비춰야만 보이는 작은 구멍을 원문에 넣는 방법

 

Steganography의 장점

• 생성이 쉽다.


Steganography의 단점

• 상대적으로 적은 정보 비트를 은닉하는데 많은 오버헤드 요구
• 방법 노출 시 재사용 불가능
• 비밀통신에 대한 사실이 발견되면 타인에 의해 이용될 수 있다.

• 위치만 알고 있으면 확인 가능


최근 경향

• 동영상, 이미지 파일을 이용 원문을 숨기는 방법이 인터넷 등의 네트워크에서 이용됨
• 테러, 범죄에 이용되는 경우가 나타남

 

시스템이 사용자를 구별할때 uid로 구별한다.

 

유닉스는 uid를 지정할 수 있다.

윈도우는 uid를 지정할 수 없다.

똑같은 uid를 가진사람은 보안상 문제가 생긴다.

 

접속시 ssh로 접속 > 암호화되어 접속 > 보안상 좋음

 

실습

1. 사용자 생성

2. 그룹 생성

3. 파티션 분할

4. 그룹 및 사용자 권한 수정 및 테스트

- 사용자 : st01, st02, st03

- 그룹 : st

- 디렉토리 : st01 디렉토리 생성

- st01 디렉토리에서 그룹 권한 : 읽기만, st01 사용자만 모든 권한 

 

 

1. 사용자 생성

1) 사용자 생성 방법 1

제어판 – 사용자 계정 – 사용자 계정 – 계정 관리
제어판 – 계정 유형 변경

 

사용자 st01이 추가된 것을 확인할 수 있다.

 

 

2) 사용자 생성 방법 2

제어판 → 시스템 및 보안 → 관리 도구 → 컴퓨터 관리

컴퓨터 관리에 들어가 로컬 사용자 및 그룹에 사용자에 들어간다.

 

st02, st03을 생성한다.

 

st02, st03이 잘 생성된 것을 확인한다.

 

 

2. 그룹 추가

컴퓨터 관리에서 로컬 사용자 및 그룹에 들어가 그룹을 우클릭하고 st그룹을 생성한다. 

 

st그룹에 포함될 st01; st02; st03을 입력하고 이름확인을 누른 후 확인을 누른다.

 

 

st 그룹생성 완료

 

 

3. 파티션 분할 (D드라이브 생성)

컴퓨터관리에서 저장소 > 디스크 관리에서 볼륨 C 를 우클릭후 볼륨 축소를 누른다.

 

볼륨축소 공간을 임의로 입력한다.

 

축소되고 남아있는 곳에 우클릭하여 단순볼륨 추가를 누른다.

파티션 크기를 정한다.

 

드라이브 문자 할당 후 만든다.

 

E 드라이브가 생성된 것을 확인한다.

 

생성 완료

 

 

4. 그룹 및 사용자 권한 수정 및 테스트

E 드라이브에서 st01디렉토리를 생성한다.

생성 후 디렉토리를 우클릭하여 보안에 들어가 편집을 누른다.

 

그룹 st를 입력하고 확인한다.

 

st그룹의 사용권한을 위와 같이 읽기만 준다.

 

st01디렉토리에 사용자 st01을 추가한다.

 

st01은 모든 권한을 준다.

 

st01로 로그인 후 파일 생성이 가능한지 확인한다.

생성이 가능한 것을 확인한다.

 

st02로 로그인한다.

 

st01에서 생성한 파일을 수정하려고 하면 수정이 불가능하다.

 

Windows Server 2019 설치

Windows Server 1 : 192.168.10.137

Windows Server 2 : 192.168.10.138

위와 같이 Windows Server 2019로 설치한다.

 

설치할 운영체제 선택

 

사용자 지정으로 선택

 

컴퓨터 이름을 변경한다. 아래와 같이 들어간다. 설정변경에 들어가 st04_###로 설정한다.

 

스냅샷을 찍는다.

실습

< 실습 일지 >

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로 접속이 잘 되는 것을 확인할 수 있다.

 

 

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

 

▶ 배열

: 배열은 간단히 여러 개의 변수를 모아서 정의하는 것을 의미


1. 배열의 구조와 정의


▶ 1차원 배열

1차원 배열은 가장 기본적인 배열 구조로 선형으로 나열된 변수와 동일

$ar[1] = 'abc';

배열은 배열의 이름과 킷(Key)값(첨자) 그리고 값을 갖는다.

예를 들어 $ar[1]='abc' 에서 ar은 배열의 이름이고 대괄호([])안에 숫자 1은 배열의 킷값으로 첨자라고도 한다.

여기에 할당된 'abc'은 배열에 저장된 값이 된다.

$ar[1] = 'abc';
$ar[2] = 'def';
$ar[3] = 'ghi';

$ar과 같이 배열의 키값(첨자)이 정수인 배열을 스칼라 배열이라 한다. (배열의 킷값에 반드시 숫자만 이용X)

키값은 필요하다면 문자를 사용하는 것도 가능하다.

$row[sno] = 'S01009';
$row[sname] = '관우';
$row[syear] = 4;

$row 배열은 킷값이 sno, sname, syear이다. 이렇게 배열의 킷값이 문자인 것을 연관 배열이라고 한다.

 

$ar1 = array(1,2,3);
$ar2 = array(3 => "abc", 4 => "def", "ghi");
$ar3 = array("a" => "ab", "k" => "a2", 0 => 23);

array()는 배열을 생성하는 함수이다. 배열은 킷값을 가지므로 필요하다면 킷값을 지정할 수도 있고 지
정하지 않을 수도 있다. 생성된 $ar1, $ar2, $ar3의 구조는 다음과 같다.

 

<?
  $ar3 = array("a" => "ab", "k" => "a2", 23, "z" => 34, "bb");

  $a3 = count($ar3);

  print_r($ar3); echo("- count : $a3<br>");
?>

print_r 배열 출력하는 함수 (1차원 배열만 출력 가능)

 

$ar = array(1,2,3,4,5);
for($i = 0; $i < 5; $i++){
	$value = $ar[$i];
	echo("value : {$value}<br>");
}

 

배열내에 소수, 소수 개수, 소수의 합 출력

<?
$ar = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);

    $cn = count($ar);
    $sum = 0;
    $cnt = 0;
    for($i=0; $i<$cn; $i++){
        $value = $ar[$i];
        if($value > 1){
            for($j =2 ; $value % $j != 0; $j++){}
            if($value == $j){
            echo("$value &nbsp;&nbsp;");
            $sum = $sum + $value;
            $cnt = $cnt +1;
            }
        }
    }
    echo("<br>");
    echo("소수 개수: $cnt &nbsp;&nbsp;");
    echo("<br>");
    echo("소수 합: $sum &nbsp;&nbsp;");
    echo("<br><hr><br>");
    show_source(__FILE__);
?>

 

▶ 2차원 배열

2차원 배열은 엑셀과 같은 스프레드쉬트 프로그램에서 보는 것처럼 행과 열을 가진 배열을 의미한다. 2차원 배열은 이전에 사용한 1차원 배열과 달리 킷값이 두 개인 배열로 각각의 킷값은 행과 열을 의미한다.

$ar[행][열]

$ar[0][0] = "a"; $ar[0][1] = "b"; $ar[0][2] = "c";
$ar[1][0] = "d"; $ar[1][1] = "e"; $ar[1][2] = "f";
$ar[2][0] = "g"; $ar[2][1] = "h"; $ar[2][2] = "i";

2차원 배열의 킷값을 기술할 때는 [행번호][열번호]순으로 기술한다. 예를 들어 $ar[2][1]은 2행 1열의 데이터로 "h"값을 나타낸다.
2차원 이상인 배열을 다차원 배열이라 하는데 다차원 배열은 킷값의 개수를 늘려 3차원 배열이나 4차원 배열로 확장이 가능하다.

 

다음은 array() 함수를 이용 $ar 배열을 생성한 것이다.

$ar = array(array("a","b","c"), array("d","e","f"),array("g","h","i"))

2차원 배열을 array() 함수를 이용해서 생성할 때 array()를 중첩해서 다차원 배열을 생성한다. 이와 같
은 방법은 가독성이 높아 일반적으로 사용되는 배열 생성 방법이다.

 

$ar = array(array(학번 => "915301",이름 => "공융", 학과 => "화학"),
	array(학번 => "915302",이름 => "사마간", 학과 => "화학"),
	array(학번 => "925303",이름 => "단규", 학과 => "화학"))

 

2차원 배열은 킷값이 두 개로 배열의 요소가 두 개의 킷값에 의해 결정

1차원 배열과 같이 $ar[0]이 스칼라 변수와 같이 값을 저장하는 것이 아니다. $ar[0]는 이제 1차원 배열로 간주
즉, $ar[0]는 (학번 => 915301, 이름 => 공융, 학과 => 화학)인 연관 배열로 인식

 

2차원 배열의 각 행을 1차원 배열로 추출한 다음 추출된 1차원 배열을 출력한다.

$count = count($ar);
for($i = 0; $i < $count; $i++) {
	echo("row = $i : {$ar[$i]['학번']} - {$ar[$i]['이름']} - {$ar[$i]['학과']} <br>");
}

for문을 이용하는 방법은 먼저 2차원 배열의 행의 수를 확인한 다음 행을 순서대로 읽어서 출력하는 방법이다. 

가장 읽기 편리하지만 행 번호에 해당하는 킷값이 정수로 구성돼야 한다는 단점이 있다.
그러나 이 방법은 가장 가독성이 높아서 프로그래밍에서 많이 사용되는 방법이다.
Count( ) 함수는 1차원 배열에서는 배열 요소의 수를 반환하고 2차원 배열에서는 행수를 반환한다.
2차원 배열의 출력

 

테이블 태그에 넣어서 출력하기

 

HTML 1 - 태그 및 Table

HTML (HyperText Markup Language) : 웹페이지를 이루는 가장 기본적인 구성요소 하이퍼텍스트와 마크업으로 이루어진다. 태그 기본 태그 , : html 문서의 시작과 끝을 알림 , : html 문서 외형에는 영향이

lemonandgrapefruit.tistory.com

ar03.php

<?
  $ar = array(array("학번" =>"91501","이름" => "공융", "학과" => "화학"),
        array("학번" =>"91502","이름" => "사마간", "학과" => "화학"),
        array("학번" =>"91503","이름" => "단규", "학과" => "화학"),
        array("학번" =>"91504","이름" => "마초", "학과" => "화학"));

  $count = count($ar);
  echo("<table border=1>");
  for($i = 0; $i <= $count-1; $i++){
    echo("<tr><td>{$ar[$i]["학번"]}</td><td>{$ar[$i]["이름"]}</td><td>{$ar[$i]["학과"]}</td></tr>");
  }

  show_source(__FILE__);
?>

 

행, 열 숫자를 입력받아 테이블을 출력하는 프로그램

table.html

<html>
<head>
<title>TABLE 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
  <form method="post" action="table.php">
	행 : <input type="text" name="row"><br>
	열 : <input type="text" name="col"><br>
		    <input type="submit" name="확인" value="확인">
		    <input type="reset" name="취소" value="취소"><br>
  </form>
<hr>
<? show_source(__FILE__);?>
</html>

table.php

<?
   $row = $_POST["row"];
   $col = $_POST["col"];
   
   echo("<table border= 2>");
    for($i=1; $i<=$row; $i++){
        echo("<tr>");
        for($j=1; $j<=$col; $j++){
            echo("<td> $j </td>");
        }
        echo("</tr>");
    }
    echo("</table>");
    echo("<hr>");
    show_source(__FILE__);
?>

 

▶ 다음과 같이 채워진 2차원 배열을 생성하고 출력하는 프로그램을 작성

<?
  $k = 0;

  for($i = 0; $i < 5; $i++){
      for($j = 0; $j < 5; $j++){
        $k = $k+1;
        $ar[$i][$j] = $k;
      }
    }

    echo("<table border='1'>");
    for($i = 0; $i < 5; $i++){
      echo("<tr>");
      for($j = 0; $j < 5; $j++){
        echo("<td width='84' align='center'> {$ar[$i][$j]} </td>");
      }
      echo("</tr>");
    }
    echo("</table>");
?>

 

대각선으로 채워진 2차원 배열 출력한다. 

ar02

ar02

ar02.html

<html>
<head>
<title>ar02 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
  <form method="post" action="ar02.php">
	홀수만 입력 : <input type="text" name="num"><br>
		    <input type="submit" name="확인" value="확인">
		    <input type="reset" name="취소" value="취소"><br>
  </form>
<hr>
<? show_source(__FILE__);?>
</html>

ar02.php

<?
  $num = $_POST["num"];
  if($num%2 == 0) {
        echo("
             <script>
             window.alert('홀수만 입력하세요');
             history.go(-1);
             </script>
            ");
        exit;
     }

  $k = 0;
  for($i = 0; $i < $num; $i++){
      for($j = 0; $j < $num; $j++){
          $k = $k+1;
          $ar[$j][$i] = $k;
      }
    }

    echo("<table border='1'>");
    for($i = 0; $i < $num; $i++){
      echo("<tr>");
      for($j = 0; $j < $num; $j++){
        echo("<td width='84' align='center'> {$ar[$i][$j]} </td>");
      }
      echo("</tr>");
    }
    echo("</table>");
?>

 

ar03

ar03

ar03.html

<html>
<head>
<title>ar03 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
  <form method="post" action="ar03.php">
	홀수만 입력 : <input type="text" name="num"><br>
		    <input type="submit" name="확인" value="확인">
		    <input type="reset" name="취소" value="취소"><br>
  </form>
<hr>
<? show_source(__FILE__);?>
</html>
더보기

ar03.php -------------------수정하기-------------

<?
$num = $_POST["num"];
if($num%2 == 0) {
      echo("
           <script>
           window.alert('홀수만 입력하세요');
           history.go(-1);
           </script>
          ");
      exit;
   }

$k = 0;
 for($i = 0; $i < $num; $i++){
   for($j = 0; $j < $num; $j++){
      if($i>=$num-$j){
         $k = $k+1;
          $ar[$i][$j] = $k;
      }else{
         $ar[$i][$j] = "";
      }
    }
 }

echo("<table border='1'>");
for($i = 0; $i < $num; $i++){
   echo("<tr>");
   for($j = 0; $j < $num; $j++){
      echo("<td width='84' align='center'> {$ar[$i][$j]} </td>");
    }
   echo("</tr>");
}
echo("</table>");
?>
<?
  $num = $_POST["num"];
  if($num%2 == 0) {
        echo("
             <script>
             window.alert('홀수만 입력하세요');
             history.go(-1);
             </script>
            ");
        exit;
     }

  $k = 0;
  $t = 0;
  for($i = 0; $i <= $num; $i++){
      for($j = 0; $j <= $num; $j++){
          //$k = $k+1;
          if($i>=num-$j){
            $k = $k+1;
            $ar[$i][$j+$t] = $k;
          }
          else{
            $ar[$i][$j] = "";
          }
          //$ar[$i][$j+$t] = $k;
      }
    }

    echo("<table border='1'>");
    for($i = 0; $i < $num; $i++){
      echo("<tr>");
      for($j = 0; $j <= $num; $j++){
        echo("<td width='84' align='center'> {$ar[$i][$j]} </td>");
      }
      echo("</tr>");
    }
    echo("</table>");
?>

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 컴퓨터로 마운트해본다.

 

+ Recent posts