상세 컨텐츠

본문 제목

[보안 공부] 1주 차 - 가상 머신 및 리눅스 사용 웹 서버 만들기

컴퓨터/보안 수업(Segfault)

by 디멘터 2024. 4. 24. 13:49

본문

※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다.
(Note: Security-related learning is allowed, but the individual is solely responsible for any legal consequences arising from the use of the acquired knowledge.)


※ 공부 기록용 포스트 이며, 여기서 사용하는 리눅스 이미지는 실습을하기 위한 기본적인 패키지 및 파일이 설치되어 있으므로, 따라하셔도 안되는 부분이 있습니다. ( 이미지 파일 제공하지 않음)

1. 개념

 

● 웹 서버(Web Server)

→ 단어 그대로 웹(web)을 제공하는 자. 주로 파일을 제공한다.

● 리눅스(linux)

→ 운영체제(OS)의 한 종류이다. 전세계적으로 많이 쓰는 이유는 기본적으로 무료이기 때문.

● SSH (Secure Shell)

→ 원격 접속을 위한 프로토콜이다. 기존의 telnet은 암호화가 되지 않아 보안에 취약하여 기본적으로 SSH를 사용한다.

→ SSH 프로그램으로는 PuTTY, MobaXterm, termius 등이 있다.

● 웹 페이지 (Web page)

인터넷 상의 웹 문서들을 총칭, 그림 등 파일 포함.

→ 웹서버 실행 위치가 Web root 경로가 된다. 중요한 개념이고 보안상으로도 중요하다.

● WAS(Web Application Server)

Server 단에서 Application을 동작 할 수 있다. 동적 웹페이지를 제공하기 위한 서버, 미들웨어.

● 동적 웹 페이지 (Dynamic Web page)

→ 일반 웹 페이지가 정해 놓은 문서들만 제공해 준다면, 동적 웹 페이지는 WAS에서 기능들을 실행하고 제공해 준다.

→ 왜 사용하는지 쉬운 예시를 들자면, 포털(네이버나, 다음 등)메인 페이지에서 로그인을하면 [ID]님 환영 합니다. 라고 뜰텐데, 정적 웹 페이지로 작성하려면 ID개수 만큼, ID 하나 하나 마다 웹 페이지를 만들어야 한다. 하지만 동적 웹페이지를 이용하면 해당 유저 ID를 불러와서 붙여넣으면 되므로 간단하다.

● URL의 구성

→ [Protocol] : // [Domain or IP Address] : [Port] / [File Path]

● Well known ports (0~1023번까지)

잘 알려진 포트로, 아래 몇 가지는 상식으로 알아두면 된다.

→ 20,21:FTP / 22:SSH / 23:Telnet / 25:SMTP / 53:DNS / 80:HTTP / 443:HTTPS

2. 준비

● 가상머신 ▶  VMware 17 무료버전

→ 다운로드 공식 홈페이지 : https://www.vmware.com/ 에서 Products - Desktop Hypervisor - Workstation Player 클릭 후 DOWNLOAD FOR FREE 클릭 - 버전 선택 후  우측 아래 GO TO DOWNLOADS 클릭 - 운영체제 선택 후 DOWNLOAD NOW

 그냥 여기로 한 번에 들어가시라..

https://customerconnect.vmware.com/en/downloads/details?downloadGroup=WKST-PLAYER-1751&productId=1377&rPId=117008

→ 만약, VirtualBox를 사용한다면 이미지 파일 확장자 변경이 필요한 듯 하다.

● 가상머신 이미지 ▶ 수업에서 제공된.ova 파일

→ ubuntu 22.04.3 LTS 버전이고 docker 등 실습에 필요한 일부 파일이 설치되어 있다.

● 텍스트 에디터 ▶ VScode

→ 사용하지 않아도 되나, 세팅해 놓으면 매우 편리하다.

● SSH ▶ termius 

구글 로그인이 필요한 듯 하다. https://termius.com/

→ 물론 다른 putty, mobaxterm 등 사용 가능

3. 실행 - 세팅

● 가상머신 만들기 

VMware에서 ova파일을 open으로 열고 머신 이름을 설정해준 뒤 import하면 가상 머신이 만들어 진다.

→ 실행된 리눅스에서 기본 설정된 ID와 password로 로그인 한 뒤,

→ $ ifconfig를 입력하여 로 자동으로 설정 된 내부 IP를 확인한다. (※윈도우의 명령어는 ipconfig이다.)

→ 중간 쯤에 보이는 IP를 찾으면 된다. 일반적으로 형식은 192.168.x.x 이다.

리눅스에서 ifconfig 명령어로 ip주소 확인

→ SSH를 사용하려면 VMware에 리눅스를 계속 켜두어야 한다.

 

● termius 실행하기

실행 전에 리눅스에서 22번 포트가 열려있어야 한다. 방화벽이 설정되어 있다면 해당 포트를 열어 놓자

NEW HOST를 클릭해서 새로운 연결을 만든다. ip주소 입력, Connect.

termius에서 연결 설정하기 1

 

→리눅스의 Username과 password를 요구한다. 입력해주면 된다.

termius에서 연결 설정하기 2

 

termius에서 연결 설정하기 3 연결완료

4. 실행 - 웹 서버 실행 및 만들기

※여기서 부터는 학습용 리눅스 이미지에 기존 설치된 파일들을 이용하므로, 따라하셔도 실행이 되지 않을 수 있습니다.

 

● 웹서버 실행

→ $ cd /home/student/webBasic

→ $ sudo python3 -m http.server 80

웹 서버 접속 확인

→ 이제 가상머신 밖 윈도우 브라우저에서 IP주소를 입력하면 접속이 된다.

 

● 도커 실행하기

실행 전 실행 중인 도커가 있는지 확인 한다.
→ $ sudo docker ps -a 

$ sudo docker ps - a 입력 화면 (실행 중인 docker가 없을 때)

위 화면 처럼 컬럼만 나오고 내용이 없으면 실행중인 것이 없다는 뜻.

$ sudo docker ps - a 입력 화면 (실행 중인 docker가 있을 때)

 이렇게 실행 중인 docker가 있으면

→ $ sudo docker rm -f [CONTAINER ID] 

[컨테이너 아이디]에 위에서 확인 된 e3cf6f59eebe를 입력해준다.

docker 종료 후 다시 확인

$ sudo docker ps - a 를 입력하여 다시 확인해준다.

$ cd /home/student/webDev 로 경로를 이동한다.

$ ./dockerCMD & 입력

무엇인가 열심히 실행 된다..

 

이제 웹 페이지에 띄울 화면을 작성하면 된다.

$ cd /home/student/webDev/webApp 여기에 index.html이나 index.php를 작성 후 업로드 하면 된다.

리눅스 안에서도 텍스트에디터 vi, vim, nano 등으로 html, php등을 작성할 수 있지만 편하게 윈도우에서 작성 후 업로드 하는 방식으로 하는 것을 추천 한다.

 

● FTP사용으로 리눅스에 업로드, 다운로드 및 웹 페이지 작성

윈도우에서 작성하고 리눅스에 파일을 전송하기 위해서 FTP(SFTP)기능을 사용해준다.

리눅스의 id와 pw가 입력되어 있을테니, 클릭 후 호스트를 선택하고 continue만 눌러도 접속이 된다.

 

좌측이 윈도우, 우측이 리눅스 /home/student/webDev/webApp 이제 드로그앤 드롭으로 파일을 옮길 수 있다.

 

VScode로 index.html 파일을 만들어 작성해준다.

 

index.html파일을 리눅스 /home/student/webDev 에 넣어준 뒤 웹으로 접속하면 뜬다.

 

login3.php, style.css, next_page.php 를 같은 폴더에 넣어주면 된다.

 

접속 화면 (단순 설정된 id admin, pw admin1234만 입력 후 로그인을 누르면 다음 페이지로 넘어가도록만 구현되어 있다.)

 

 

 

index.html
0.00MB

 

login3.php
0.00MB

 

next_page.php
0.00MB

 

style.css
0.00MB

 

 

 

사실, 현재 프론트 앤드를 잘 모르는 상황이고, 시간도 없어서 php작성은 ChatGPT를 활용 했다.
(당당하게 핑계를 대고 있는 것이다.)

 

코드_index.html

더보기
<!-- login.html -->
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>
<a href="./login.php"> 로그인페이지1로 접속하기</a><br>
<a href="./login2.php"> 로그인페이지2로 접속하기 </a><br>
<a href="./login3.php"> 로그인페이지3으로 접속하기</a>
 
</body>
</html>


 

코드_login3.php

더보기
<!-- login.php -->
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인 페이지</title>
    <link href="./style.css" rel="stylesheet" type="text/css" />
 
</head>
<body>
    <div class="login-container">
        <h2>Login</h2>
        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
            <label for="username">ID:</label>
            <input type="text" id="username" name="username" required><br><br>
            <label for="password">PW:</label>
            <input type="password" id="password" name="password" required><br><br>
            <button type="submit">로그인</button>
        </form>
        <div class="links">
        <a href="#"><p onclick="alert('해당 기능은 구현되지 않았습니다.')">아이디 찾기<p onclick="alert('해당 기능은 구현되지 않았습니다.')">비밀번호 찾기</a>
        </div>
        <div id="server-time"></div>
    </div>

    <?php
    // 로그인 처리
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        // 예상되는 사용자 이름과 비밀번호
        $expected_username = 'admin';
        $expected_password = 'admin1234';

        // 폼에서 제출된 사용자 이름과 비밀번호 가져오기
        $username = $_POST['username'];
        $password = $_POST['password'];

        // 제출된 사용자 이름과 비밀번호가 예상값과 일치하는지 확인
        if ($username === $expected_username && $password === $expected_password) {
            // 로그인 성공 시 다음 페이지로 리다이렉트
            header("Location: next_page.php");
            exit(); // 리다이렉트 후 추가 코드 실행 방지
        } else {
            // 로그인 실패 시 JavaScript 코드를 출력하여 alert 창을 띄웁니다.
            echo '<script>alert("로그인 실패! 사용자 이름 또는 비밀번호가 잘못되었습니다.");</script>';
        }
    }
    ?>

<script>
    // 실시간 서버 시간 표시
    setInterval(function() {
        var currentTime = new Date();
        var year = currentTime.getFullYear(); // 년도
        var month = currentTime.getMonth() + 1; // 월 (0부터 시작하기 때문에 +1)
        var day = currentTime.getDate(); // 일
        var hours = currentTime.getHours(); // 시
        var minutes = currentTime.getMinutes(); // 분
        var seconds = currentTime.getSeconds(); // 초

        // 년, 월, 일, 시, 분, 초를 두 자리로 만들기 위해 10 미만인 경우 앞에 0을 추가
        month = month < 10 ? '0' + month : month;
        day = day < 10 ? '0' + day : day;
        hours = hours < 10 ? '0' + hours : hours;
        minutes = minutes < 10 ? '0' + minutes : minutes;
        seconds = seconds < 10 ? '0' + seconds : seconds;

        var timeString = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
        document.getElementById("server-time").innerHTML = "현재 서버 시간: " + timeString;
    }, 200); // 200ms 마다 업데이트
</script>
</body>
</html>

코드_style.css

더보기
        /* CSS 스타일링 */
        .login-container {
            width: 300px;
            margin: 100px auto;
            padding: 20px;
            border: 1px solid #ccc;
            border-radius: 5px;
            text-align: center;
            background-color: #f9f9f9;
        }

        h2 {
            margin-bottom: 20px;
        }

        label {
            display: block;
            text-align: left;
        }

        input[type="text"],
        input[type="password"] {
            width: 100%;
            padding: 8px;
            margin-bottom: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
            box-sizing: border-box;
        }

        button {
            width: 100%;
            background-color: #4caf50;
            color: white;
            padding: 10px 0;
            margin-top: 10px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }

        button:hover {
            background-color: #45a049;
        }

        .links {
            margin-top: 20px;
            font-size: 14px;
        }

코드_next_page.php

더보기
<!-- next_page.php -->
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인 성공 다음 페이지</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <div class="container">
        <h2>로그인 성공 후 페이지 입니다.</h2>
        <ul class="links">
            <li><a href="https://www.naver.com">네이버 링크</a></li>
            <li><a href="https://www.daum.net/">다음 링크</a></li>
            <li><a href="https://www.weather.go.kr/w/index.do">기상청 링크</a></li>
        </ul>
    </div>
</body>
</html>

5. 개인 평가(부족한 부분, 잘 되는 부분)

● 부족 - 프론트 앤드

→ 현재 프론트 앤드 (html, css, js, php)를 잘 몰라서 웹을 작성하기가 어렵다.

● 잘 됨 - 리눅스, VMware

→ 그나마 조금 익숙한 부분이라 SSH 등 세팅은 수월 했다.

관련글 더보기