반응형

오늘은 MySQL에 대한 개념 글에 이어서

아직 mysql에 대해 모르시거나

이 글 전에 읽어보시지 못하셨다면

아래 링크를 한번 보고 오시길 추천드립니다.

(작성 중)

Mysql을 배우고 나서 아래 실습을 통해

간단한 명령어를 직접 연습해 보고

sql이 어떤 식으로 운용될 수 있는지

직접 알아보도록 하겠습니다.

주의

Sql 구문은 하나의 명령이 종료가 되면 

세미콜론(;)을 붙여주어야 합니다.

만약 세미콜론이 생략되면

2차 프롬프트(->)가 시작됩니다.

무조건 끝에 세미콜론을 붙이신다고 

생각해 주세요

MySQL 접속
bee@bee-box:~$ 
bee@bee-box:~$cd /var/www/bWAPP
bee@bee-box:/var/www/bWAPP$

root@bee-box:/var/www/bWAPP# mysql -u root -p

Enter password: bug
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.96-0ubuntu3 (Ubuntu)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| bWAPP              | 
| drupageddon        | 
| mysql              | 
+--------------------+
4 rows in set (0.00 sec)

cd /var/www/bWAPP를 이용하여

bWAPP 디렉터리로 이동합니다.

mysql -u root -p 명령어와 패스워드 

bug를 이용하여 Mysql 로컬 접속을 실시합니다.

show databases를 이용하여 

데이터베이스를 확인합니다.

가장 위에 있는 Information_schema 

Mysql에서 운영되는 데이터베이스, 

테이블, 칼럼의 모든 정보를 관리하는 DB입니다.

아래 보이는 bWAPP과 drupageddon 

bWAPP 시나리오에 사용하는 DB이며

맨 아래 mysql은 Mysql 운영과 관련된 

정보가 저장된 DB입니다.

 

DataBase 생성 및 삭제
mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> show databases; 
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| bWAPP              | 
| drupageddon        | 
| test               | 
| mysql              | 
+--------------------+
5 rows in set (0.00 sec)

mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| bWAPP              | 
| drupageddon        | 
| mysql              | 
+--------------------+
4 rows in set (0.00 sec)

create database ; 명령어를 이용하여 

데이트베이스를 생성하고

drop database ; 명령어 

데이터베이스를 삭제할 수 있습니다

(test 데이터베이스 생성)

테이블 생성 및 삭제
mysql> use test;
Database changed

mysql> show tables;
Empty set (0.00 sec)

mysql> create table linux (id int, login varchar(10), password varchar(10), username varchar(20), age int);
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+------------------+
| Tables_in_test   |
+------------------+
| linux            | 
+------------------+
1 row in set (0.00 sec)

mysql> create table cisco (id int, login varchar(10), password varchar(10), username varchar(20), age int);
Query OK, 0 rows affected (0.00 sec)

mysql> create table security (id int, login varchar(10), password varchar(10), username varchar(20), age int);
Query OK, 0 rows affected (0.00 sec)

mysql> create table java (id int, login varchar(10), password varchar(10), username varchar(20), age int);
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+------------------+
| Tables_in_test   |
+------------------+
| cisco            | 
| java             | 
| linux            | 
| security         | 
+------------------+
4 rows in set (0.00 sec)

mysql> drop table java;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables; 
+------------------+
| Tables_in_test   |
+------------------+
| cisco            | 
| linux            | 
| security         | 
+------------------+
3 rows in set (0.00 sec)

use ; 명령어를 이용하여 test 데이터베이스를 사용하고

show tables ; 명령어 테이블을 확인합니다.

create table ; 명령어 리눅스 테이블을 생성하고 

cisco, security, java 테이블을 리눅스와 

동일하게 추가로 생성합니다.

(java 테이블은 삭제)

칼럼 속성 확인 & 데이터 값 입력
mysql> desc cisco;
+----------+-------------+------+-----+---------+-------+
| Field    |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|    id    |   int(11)   |  YES |     |   NULL  |       |
|   login  | varchar(10) |  YES |     |   NULL  |       |
| password | varchar(10) |  YES |     |   NULL  |       |
| username | varchar(20) |  YES |     |   NULL  |       |
|   age    |   int(11)   |  YES |     |   NULL  |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.021 sec)

mysql> desc linux;
+----------+-------------+------+-----+---------+-------+
|   Fiel d |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|    id    |   int(11)   |  YES |     |   NULL  |       |
|   login  | varchar(10) |  YES |     |   NULL  |       |
| password | varchar(10) |  YES |     |   NULL  |       |
| username | varchar(20) |  YES |     |   NULL  |       |
|    age   |   int(11)   |  YES |     |   NULL  |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.001 sec)

mysql> desc security;
+----------+-------------+------+-----+---------+-------+
|  Field   |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|    id    |   int(11)   |  YES |     |   NULL  |       |
|   login  | varchar(10) |  YES |     |   NULL  |       |
| password | varchar(10) |  YES |     |   NULL  |       |
| username | varchar(20) |  YES |     |   NULL  |       |
|    age   |   int(11)   |  YES |     |   NULL  |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.001 sec)

desc; 명령어를 이용하여 속성을 확인해 보고,

mysql> select * from cisco;
Empty set (0.000 sec)

mysql> insert into cisco values(1, 'cisco1', 'cisco1111', 'test', 23);
Query OK, 1 row affected (0.001 sec)

mysql> insert into cisco values(2, 'cisco2', 'cisco2222', 'test', 26);
Query OK, 1 row affected (0.001 sec)

mysql> insert into cisco (login, id, password, age, username) values('cisco3', 3, 'cisco3333', 29, 'test'); 
Query OK, 1 row affected (0.001 sec)

mysql> select * from cisco;
+------+--------+-----------+----------+------+
| id   | login  | password  | username |  age |
+------+--------+-----------+----------+------+
| 1    | cisco1 | cisco1111 |   test   |  23  |
| 2    | cisco2 | cisco2222 |   test   |  26  |
| 3    | cisco3 | cisco3333 |   test   |  29  |
+------+--------+-----------+----------+------+
3 rows in set (0.000 sec)

mysql> \! clear

mysql> insert into linux values(1, 'linux1', 'linux1111', 'test', 33); Query OK, 1 row affected (0.001 sec)

mysql> insert into linux values(2, 'linux2', 'linux2222', 'test1', 36);
Query OK, 1 row affected (0.001 sec)

mysql> insert into linux values(3, 'linux3', 'linux3333', 'test2', 39);
Query OK, 1 row affected (0.001 sec)

mysql> select * from linux;
+------+--------+-----------+--------------+------+
|  id  |  login |  password |   username   |  age |
+------+--------+-----------+--------------+------+
|   1  | linux1 | linux1111 |     test     |  33  |
|   2  | linux2 | linux2222 |     test1    |  36  |
|   3  | linux3 | linux3333 |     test2    |  39  |
+------+--------+-----------+--------------+------+
3 rows in set (0.000 sec)

mysql> insert into security values(1, 'security1', 'security11', 'test', 43); Query OK, 1 row affected (0.001 sec)

mysql> insert into security values(2, 'security2', 'security22', 'test1', 46);
Query OK, 1 row affected (0.001 sec)

mysql> insert into security values(3, 'security3', 'security33', 'test2', 49);
Query OK, 1 row affected (0.001 sec)

mysql> select * from security;
+------+-----------+------------+---------------+------+
|  id  |   login   |  password  |    username   |  age |
+------+-----------+------------+---------------+------+
|   1  | security1 | security11 |      test     |  43  |
|   2  | security2 | security22 |      test1    |  46  |
|   3  | security3 | security33 |      test2    |  49  | 
+------+-----------+------------+---------------+------+
3 rows in set (0.000 sec)

각 칼럼에 데이터 값을 입력해 봅니다.

select * from ; 명령어로 칼럼을 선택하고

insert into ~ values ; 명령어 

원하는 정보를 입력하여 넣어줍니다.

데이터 값 수정 및 삭제
mysql> select * from cisco;
+------+--------+-----------+--------------+------+
|  id  |  login |  password |   username   |  age |
+------+--------+-----------+--------------+------+
|   1  | cisco1 | cisco1111 |     test     |  23  |
|   2  | cisco2 | cisco2222 |     test     |  26  |
|   3  | cisco3 | cisco3333 |     test     |  29  |
+------+--------+-----------+--------------+------+
3 rows in set (0.000 sec)

mysql> update cisco set username='test1' where login='cisco2';
Query OK, 1 row affected (0.022 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update cisco set username='test2' where id=3; 
Query OK, 1 row affected (0.003 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from cisco;
+------+--------+-----------+--------------+------+
|  id  |  login |  password |   username   |  age |
+------+--------+-----------+--------------+------+
|   1  | cisco1 | cisco1111 |     NULL     |  23  |
|   2  | cisco2 | cisco2222 |     test1    |  26  |
|   3  | cisco3 | cisco3333 |     test2    |  29  |
+------+--------+-----------+--------------+------+
3 rows in set (0.000 sec)

mysql> update cisco set username=default where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from cisco; 
+------+--------+-----------+--------------+------+
|  id  |  login |  password |   username   |  age |
+------+--------+-----------+--------------+------+
|   1  | cisco1 | cisco1111 |     test     |  23  | 
|   2  | cisco2 | cisco2222 |     test1    |  26  | 
|   3  | cisco3 | cisco3333 |     test2    |  29  | 
+------+--------+-----------+--------------+------+
3 rows in set (0.00 sec)

mysql> update cisco set username=default;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 3 Changed: 2 Warnings: 0

mysql> select * from cisco;
+------+--------+-----------+----------+------+
|  id  |  login |  password | username |  age |
+------+--------+-----------+----------+------+
|   1  | cisco1 | cisco1111 |   NULL   |  23  | 
|   2  | cisco2 | cisco2222 |   NULL   |  26  | 
|   3  | cisco3 | cisco3333 |   NULL   |  29  | 
+------+--------+-----------+----------+------+
3 rows in set (0.00 sec)

mysql> delete from cisco where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> select * from cisco;
+------+--------+-----------+----------+------+
|  id  |  login |  password | username |  age |
+------+--------+-----------+----------+------+
|   1  | cisco1 | cisco1111 |   NULL   |  23  | 
|   2  | cisco2 | cisco2222 |   NULL   |  26  | 
+------+--------+-----------+----------+------+
2 rows in set (0.00 sec)

mysql> delete from cisco;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from cisco;
Empty set (0.00 sec)

mysql> desc cisco;
+----------+-------------+------+-----+---------+-------+
|   Field  |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|    id    |   int(11)   |  YES |     |   NULL  |       | 
|   login  | varchar(10) |  YES |     |   NULL  |       | 
| password | varchar(10) |  YES |     |   NULL  |       | 
| username | varchar(20) |  YES |     |   NULL  |       | 
|    age   |   int(11)   |  YES |     |   NULL  |       | 
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

select * from ; 명령어로 컬럼을 선택하고

update ~ set username= ~ where login='~';

으로 username 값을 변경해 본다

update ~ set username=default where id=~; 과 update ~ set username=default 명령어로

username을 NULL로 변경해 본다

delete from ~ where id=~ 명령어

삭제를 시도해 본다

desc ~; 명령어 지금까지 작업한 내용을 확인해 본다.


다음 실습을 위해 Cisco 테이블에 데이터 값 재 입력
mysql> insert into cisco values(1, 'cisco1', 'cisco1111', 'test', 23);
Query OK, 1 row affected (0.001 sec)

mysql> insert into cisco values(2, 'cisco2', 'cisco2222', 'test1', 26);
Query OK, 1 row affected (0.001 sec)

mysql> insert into cisco values(3, 'cisco3', 'cisco3333', 'test2', 29); 
Query OK, 1 row affected (0.001 sec)

mysql> select * from cisco;
+------+--------+-----------+----------+------+
| id   | login  | password  | username |  age |
+------+--------+-----------+----------+------+
| 1    | cisco1 | cisco1111 |   test   |  23  |
| 2    | cisco2 | cisco2222 |   test1  |  26  |
| 3    | cisco3 | cisco3333 |   test2  |  29  |
+------+--------+-----------+----------+------+
3 rows in set (0.000 sec)

칼럼 속성 정보 변경
mysql> desc linux;
+----------+-------------+------+-----+---------+-------+
|   Field  |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|    id    |   int(11)   |  YES |     |   NULL  |       | 
|   login  | varchar(10) |  YES |     |   NULL  |       | 
| password | varchar(10) |  YES |     |   NULL  |       | 
| username | varchar(20) |  YES |     |   NULL  |       | 
|    age   |   int(11)   |  YES |     |   NULL  |       | 
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> alter table linux modify login varchar(20);
Query OK, 0 rows affected (0.002 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table linux modify password varchar(40);
Query OK, 0 rows affected (0.001 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc linux;
+----------+-------------+------+-----+---------+-------+
|   Field  |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|    id    |   int(11)   |  YES |     |   NULL  |       |
|   login  | varchar(20) |  YES |     |   NULL  |       |
| password | varchar(40) |  YES |     |   NULL  |       |
| username | varchar(20) |  YES |     |   NULL  |       |
|    age   |   int(11)   |  YES |     |   NULL  |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

alter table ~ modify login ~; 명령어를 이용하여

로그인 속성을 변경해 봅니다.

alter table ~ modify password ~ 명령어

이용하여 패스워드 속성을 변경해 봅니다.

칼럼 추가 & 수정 & 삭제
mysql> alter table linux add email varchar(20) first;
Query OK, 0 rows affected (0.006 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc linux;
+----------+-------------+------+-----+---------+-------+
|   Field  |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|   email  | varchar(20) |  YES |     |   NULL  |       |
|    id    |   int(11)   |  YES |     |   NULL  |       |
|   login  | varchar(20) |  YES |     |   NULL  |       |
| password | varchar(40) |  YES |     |   NULL  |       |
| username | varchar(20) |  YES |     |   NULL  |       |
|    age   |   int(11)   |  YES |     |   NULL  |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.001 sec)

mysql> select * from linux;
+-------+------+--------+-----------+--------------+------+
| email |  id  |  login |  password |   username   |  age |
+-------+------+--------+-----------+--------------+------+
|  NULL |   1  | linux1 | linux1111 |     test     |  33  |
|  NULL |   2  | linux2 | linux2222 |     test1    |  36  |
|  NULL |   3  | linux3 | linux3333 |     test2    |  39  |
+-------+------+--------+-----------+--------------+------+
3 rows in set (0.000 sec)

mysql> alter table linux modify email varchar(20) after username; Query OK, 0 rows affected (0.009 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc linux; 
+----------+-------------+------+-----+---------+-------+
|   Field  |     Type    | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
|    id    |   int(11)   |  YES |     |   NULL  |       |
|   login  | varchar(20) |  YES |     |   NULL  |       |
| password | varchar(40) |  YES |     |   NULL  |       |
| username | varchar(20) |  YES |     |   NULL  |       |
|   email  | varchar(20) |  YES |     |   NULL  |       |
|    age   |   int(11)   |  YES |     |   NULL  |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.001 sec)

mysql> select * from linux; 
+------+--------+-----------+--------------+-------+------+
|  id  |  login |  password |   username   | email |  age |
+------+--------+-----------+--------------+-------+------+
|   1  | linux1 | linux1111 |     test     |  NULL |  33  |
|   2  | linux2 | linux2222 |     test1    |  NULL |  36  |
|   3  | linux3 | linux3333 |     test2    |  NULL |  39  |
+------+--------+-----------+--------------+-------+------+
3 rows in set (0.000 sec)

mysql> update linux set email='linux1@test.com' where login='linux1';
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update linux set email='linux2@test.com' where login='linux2';
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update linux set email='linux3@test.com' where login='linux3';
Query OK, 1 row affected (0.001 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from linux;
+------+--------+-----------+--------------+-------------------+------+
|  id  |  login |  password |   username   |       email       |  age |
+------+--------+-----------+--------------+-------------------+------+
|   1  | linux1 | linux1111 |     test     |  linux1@test.com  |  33  |
|   2  | linux2 | linux2222 |     test1    |  linux2@test.com  |  36  |
|   3  | linux3 | linux3333 |     test2    |  linux3@test.com  |  39  |
+------+--------+-----------+--------------+-------------------+------+
3 rows in set (0.000 sec)

mysql> alter table linux drop email;
Query OK, 0 rows affected (0.009 sec)
Records: 0 Duplicates: 0 Warnings: 0

alter table ~ add ~ varchar(20) first; 명령어

테이블 맨 앞부분에 칼럼 추가

잘 추가됐는지 desc ; 로 확인한 후

alter table ~ modify ~ after ~; 명령어로

리눅스 테이블에 이메일 칼럼 위치 수정

update ~ set ~='~' where login='~'; 명령어

이용하여 상세 데이터 수정


각 명령어 사용 직후

  • 데이터베이스 생성 및 삭제: CREATE DATABASE test;와 DROP DATABASE test; 명령어 직후에 각 명령어가 데이터베이스를 생성하고 삭제하는 기능을 수행한다는 설명을 추가합니다.
    • 예: "CREATE DATABASE test; 명령어는 'test'라는 이름의 새로운 데이터베이스를 생성합니다. 이때, 데이터베이스 이름은 고유해야 합니다. DROP DATABASE test; 명령어는 'test' 데이터베이스를 시스템에서 완전히 제거합니다."
  • 테이블 생성, 데이터 입력, 수정 및 삭제: 각 CREATE TABLE, INSERT INTO, UPDATE, DELETE 명령어 사용 직후에 명령어의 기능을 간략하게 설명합니다.
    • 예: "CREATE TABLE 명령어는 새로운 테이블을 생성합니다. INSERT INTO 명령어는 테이블에 새로운 행을 추가합니다. UPDATE 명령어는 테이블의 데이터를 수정하고, DELETE 명령어는 데이터를 삭제합니다."

오늘은 Mysql을 알아본 후
어떤 식으로 mysql을 사용하는 건지
간단한 실습을 통해서
Mysql에 접속해 보고,
Database를 생성하고 삭제해 보고,
테이블을 생성하고 삭제해 보고,
테이블 안에 컬럼 속성을 확인해 보고,
값을 입력하고 수정해 보고 삭제해 보고,
속성 정보를 변경해 보고,
칼럼을 추가하고 수정하고 삭제까지 해봤습니다.

아직까지 정말 많이 쓰이고 있는 mysql은 

어느 곳에 속하여 일을 하시던지

알고 계시면 분명 도움이 될만한 내용이라고 생각합니다.


  • 보안 관련 주의사항 및 안전한 사용법: mysql -u root -p 명령어를 사용하여 접속하는 방법을 설명하는 부분에 보안 주의사항을 추가합니다.
    • 예: "MySQL을 사용할 때는 보안을 항상 유념해야 합니다. 예제에서 사용한 'root' 계정과 'bug'라는 비밀번호는 테스트 목적으로만 사용해야 합니다. 실제 환경에서는 강력한 비밀번호를 설정하고, 필요한 최소한의 권한을 가진 사용자 계정을 생성하여 사용하는 것이 좋습니다."

실습 후 데이터베이스와 테이블 정리: MySQL 실습을 마친 후, 생성한 데이터베이스와 테이블을 어떻게 정리해야 하는지에 대한 방법을 설명합니다.

  • 예: "실습을 마친 후에는 사용한 데이터베이스와 테이블을 정리하는 것이 좋습니다. 이를 위해 DROP DATABASE 명령어와 DROP TABLE 명령어를 사용하여 더 이상 필요하지 않은 데이터베이스와 테이블을 삭제할 수 있습니다. 이 과정은 실습 환경을 깔끔하게 유지하고, 불필요한 데이터의 축적을 방지합니다

궁금하신 사항은 댓글에 남겨주세요
댓글에 남겨주신 내용
추후 정리해서 올려드리겠습니다
구독 신청하시면 업로드 시 알려드릴게요!
-
조금이라도 도움이 되셨다면
공감&댓글 부탁드리겠습니다
감사합니다!

 

반응형
반응형

오늘은 개발자라면 꼭 알고 있어야 할 깃허브 (Github)
너무 어려워서 접근하기 힘든 깃허브지만
개발자가 꿈이 이 사라면 사용할 수밖에 없을 텐데요
오늘은 깃허브에서 이력서를 만들어보겠습니다.

깃(git)과 깃허브 (Github)에 대한 설명과 차이점은
아래 글을 참고해 주세요

 

저장소

먼저 깃 허브 가입을 하신 후에 
저장소 (Repository)를 만들어 

이력서 관련 파일들을 저장하겠습니다.

먼저 깃허브에 로그인한 후 Repository

(이제 쉽게 레포라고 부르겠습니다)

에서 New를 클릭하여 새 저장소를 만들어줍니다.

"Repository name"에 원하는

레포 이름을 입력해 줍니다.

저는 resume라고 입력하도록 하겠습니다.

코딩할 때와 마찬가지로 띄어쓰기

즉 스페이스바를 하지 마시고

두 개 단어 이상으로 설정하시려면

gildong-resume처럼

하이픈으로 연결해 주시길 바랍니다.

다 작성하셨다면 Add a README flie 체크 박스를

클릭하신 후

Create repository 버튼을 클릭하여

이력에서 쓸 레포를 만들어줍니다.


소스 작성 환경 만들기
VSCODE 편집기

자동으로 만들어진 레포가 열리면 그 상태에서
키보드 마침표. 를 눌러 주세요.
github.dev라는 편집기가 나타납니다.
온라인에서 사용할 수 있는 Vscode 편집기입니다.
만약 작업에 능숙하시고 따로 사용하시는 편집기가
있으시다면 그걸로 사용하셔도 무방합니다.
이제 이곳에 원하는 html 소스를 작성하여 작업하면
자동으로 깃허브 레포로 파일이 업로드되고,
내용 수정 역시 즉시 반영됩니다.

 

소스 작성 환경 만들기2
Codeswing

Codeswing은 우리가 직접 작성한 소스가
어떻게 반영되는지 바로 확인이 가능하도록
출력해 주는 기능을 가지고 있습니다.
작업하면서 잘 노출되고 있는지 확인하기 위해
설치해 주도록 하겠습니다.

왼쪽 사이드바에서 확장 아이콘을 클릭한 후 codeswing을 검색하여 설치해 주세요.
그리고 바로 마크업 (Markup)에 들어가도록 하겠습니다.
마크업이란 웹 브라우저가 이해할 수 있도록
기호를 사용하여 구성하는 것을 말합니다.

Index.html / Codeswing

VS Code에서 명령 팔레트를 통해

Codeswing을 검색하고

CodeSwing: Initialize Workspace as Swing

선택합니다.

그리고 HTML 파일을 만들기 위해

Basic: HTML-only 선택합니다.

정상적으로 선택했다면 편집기 화면이 두 개로 나뉘면서

왼쪽에는 index.html이 나타나고,

오른쪽에는 CodeSwing 화면이 나타납니다.

index.html은 우리가 앞으로 소스를 작성할 화면이고,

오른쪽의 CodeSwing은 소스를 작성하면서

결과를 확인하기 위한 화면입니다.

<html lang = "en"> -> <html lang = "ko">

index.html 화면에서 느낌표! 를 입력한 후

Enter 키를 눌러주세요.

웹 문서의 가장 기본적인 소스 코드가

자동으로 만들어집니다.

그곳에서 "en" 부분을 "ko"로 수정해 주세요.

깃은 영문 페이지로 만들어졌지만

우리는 한글로 작성할 것입니다.

<title>Document</title> <- <title>원하는 제목</title>

보이는 소스에서 <title> 태그는 웹 브라우저 탭에

표시되는 이력서 제목입니다.

Document 부분을 원하는 제목으로 바꿔주세요

html 마크업

본격적으로 html 마크업을 시작하도록 하겠습니다.

아래 소스를 복사해서 index.html 문서의

<body> 태그와 </body> 태그 사이에 삽입해 주세요

<header id="header">
  <!-- 이력서 헤더 : 이름과 타이틀 작성 -->
  <h1>이름</h1>
  <hr>
  타이틀 (예: 학생 등)
  <hr>
</header>

<main>
  <article id="mainLeft">
    <section>
      <h2>CONTACT</h2>
      <!-- 연락처 정보 -->
    </section>
    <section>
      <h2>SKILLS</h2>
      <!-- 자신이 잘할 수 있는 기술 -->
     </section>
     <section>
      <h2>EDUCATION</h2>
      <!-- 학력 -->
    </section>            
  </article>
  <article id="mainRight">
    <section>
     <h2>ABOUT</h2>
     <!-- 자기 소개 -->
    </section>
    <section>
      <h2>WORK EXPERIENCE</h2>
      <!-- 경력 -->
    </section>
  </article>
</main>

위와 같이 Codeswing에 출력된다면

아주 잘 따라오고 계신 겁니다.

<header id="header">
<!-- 이름과 타이틀 작성 -->
  <h1>이름</h1>
  <hr>
    타이틀 (예: 학생 등)
  <hr>
</header>


<header id="header">
<!-- 이력서 헤더 : 이름과 타이틀 작성 -->
  <h1>홍길동</h1>
  <hr>
    도적
  <hr>
</header>

이제 필요한 내용들을 각 소스 코드 사이에 써넣어 주시면 됩니다.

위의 예시를 보고 본인의 이력서 내용을 채워 넣어주세요.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>!!!</title>
</head>
<link rel="stylesheet" href="style.css">
<body>
    <header id="header">
        <h1>!!!</h1>
        <hr>
       !!!
        <hr>
      </header>
      <main>
        <article id="mainLeft">
          <section>
            <h2>CONTACT</h2>
        <p>
            <i class="fa fa-envelope" aria-hidden="true"></i>
            <a href=!!!</a>
        </p>
        <p>
            <i class="fa fa-github" aria-hidden="true"></i>
            <a href=!!!</a>
          </p>      
        <p>
            <i class=!!!</i>
            <a href=!!!</a>
          </p>      
          </section>
          <section>
            <h2>SKILLS</h2>
            !!!
           </section>
           <section>
            <h2>EDUCATION</h2>
            !!!
          </section>            
        </article>
        <article id="mainRight">
          <section>
            <h2>!!!</h2>
            !!!
            <ul>
            !!!
            </ul>  
            !!!
           </section>
            <section>
                <h2>ABOUT</h2>
               </section>
        </article>
      </main>
</body>
</html>
스타일 적용하기

너무 정직한 이력서를 조금만 스타일 수정해 보겠습니다.

왼쪽 탐색기 화면에서 새 파일을 추가해 줍니다.

style.css를 검색하시면 오른쪽에 

창 하나가 추가됩니다.

이제 이곳에 소스를 적어 스타일을 만든 것을 index.html에 적용시키려면

HTML 문서에 연결해 주어야 합니다.

link 태그를 사용하여 연결시켜주도록 합시다.

<link rel="stylesheet" href="style.css">

위 코드를 index.html 문서 </head> 태그

바로 앞에 삽입해 주세요.

Google에서 제공하는 Noto Sans KR 체로

폰트를 바꿔보도록 하겠습니다.

@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap');

body {
    max-width: 960px;    /* 최대 너비 */
    margin: auto;         /* 마진 auto - 내용을 화면 가운데 맞추기 위해  */
    font-family: "Noto Sans KR", "Nanum Gothic";        /* 글꼴 - 웹 폰트 */
    font-size:14px;     /* 글자 크기 */
}

(이제부터 style 창에서 작업합니다)

위 코드를 삽입해 주세요

적용됐는지 보시려면 오른쪽 위 재생 버튼을 클릭하고

Codeswing 창을 보시면 적용되어 있는 모습을

확인할 수 있습니다.

우리가 만든 문서 제목을 지정하는

<h1> 태그와 <h2> 태그에 대한 스타일도 만들겠습니다

h1 {
    font-size: 3rem;    /* 글자 크기 */
    letter-spacing: 0.6rem;  /* 자간 */
    padding-top: 1rem;   /* 위쪽 패딩 */
    padding-bottom: 1rem;   /*  아래쪽 패딩 */
}

h2 {
    font-size: 1.5rem;
    padding-bottom: 1em;
}

너무 일자로 출력되어 보기가 힘들어 

2줄로 배치를 바꾸고 싶은데

이럴 경우 CSS 그리드를 사용하시면 됩니다.

작성한 각 파트의 너비를 조절하여 

양쪽으로 출력될 수 있게 해보겠습니다.

main {
    display: grid;    /* css grid 사용 */
    grid-template-columns: 40% 60%; /* 왼쪽 40%, 오른쪽 60% */
    margin-top: 3rem;
}

CSS 그리드를 이용하여 너비를 조절하고 

2줄로 출력되게 만들었습니다.

조금 답답해서 여백을 추가하면서 

가운뎃 줄을 하나 긋도록 하겠습니다.

header {
    text-align: center;
    margin: auto 2rem;
}

section {
    margin: auto 1rem 4rem 2rem;
}

p {
    margin: 0.2rem auto;
}

hr {
    border: none;
    background-color: lightgray;
    height: 1px;
}

h1, h2 {
    font-weight: 100; 
    margin-bottom: 0;
}

i {
    margin-right: 0.5rem;    /* SNS 아이콘 오른쪽 여백 */
}
#mainLeft {
    border-right: 1px solid lightgray;
}

이제 조금 잘 보이는 것 같습니다.

자 이제 깃에 커밋 (commit)을 해보도록 하겠습니다

깃에 커밋을 한다는 말은 

변경된 사항을 저장한다는 말입니다.

사이드바에서 Source Control 아이콘을 클릭한 후,

맨 위에 커밋 메시지를 입력하고

바로 위의 체크 버튼을 클릭합니다.

소스 컨트롤 아이콘에 나와있는 3이라는 파란 숫자는

수정된 사항이 3개가 있다고 표시해 주는 겁니다.

깃허브에서도 자동으로 저장되어

잘 업로드되어 있는 걸 확인해 보실 수 있습니다.

깃허브 레포 화면에서 오른쪽에 있는

Settings을 클릭하고 Pages를 선택합니다.

오른쪽 화면에서 Source 항목을 보면

아직 None이라고 되어 있을 것입니다.

None을 클릭한 후 main을 선택합니다.

위 설정의 뜻은

레포 main 브랜치에 있는 파일들을 

사용하겠다는 뜻입니다.

마지막으로 Save를 클릭합니다.

페이지 설정을 하고 페이지 주소가 뜨는데

즉시 웹 사이트가 나타나지는 않을 수 있습니다.

404 오류 메시지가 뜨더라도 걱정하지 말고,

5~10분 후에 다시 접속해 보시길 바랍니다.

잘 따라오셨다면 아래와 같이 이력서가 나오게 됩니다.

(개인정보는 가렸습니다)

완성되었습니다.

감사합니다.


궁금하신 사항은 댓글에 남겨주세요
댓글에 남겨주신 내용
추후 정리해서 올려드리겠습니다
구독 신청하시면 업로드 시 알려드릴게요!
-
조금이라도 도움이 되셨다면
공감&댓글 부탁드리겠습니다
감사합니다!

반응형
반응형

소프트웨어의 신뢰성을 높이는 SBOM 생성

 

CycloneDX란 무엇일까요?

 

소프트웨어 구성 요소를 한눈에 관리하는 새로운 표준

소프트웨어 개발 프로세스에서 빠질 수 없는 요소 중 하나는 구성 요소의 관리일 것입니다.

라이브러리, 프레임워크 등 다양한 구성 요소가 복잡하게 얽힌 프로젝트가 빠르게 진행되며, 이를 체계적으로 정리하고 추적하는 것이 절실한 필요로 대두되었습니다.

이에 따라 CycloneDX라는 소프트웨어 구성 요소 정보를 기록하고 공유하는 표준이 등장하게 되었습니다.

많은 조직과 개발자들에게 인기를 얻고 있는 CycloneDX는 간결하고 효율적인 구성 요소 관리 도구로 주목받고 있으며 감히 예상컨대 이미 많이 사용하고 있지만 앞으로는 더더욱 CycloneDX를 많은 보안 기업에서 사용할 것이라고 예상하고 있습니다.

특히 구성 요소 관리라 함은 보안에 있어 굉장히 중요합니다.

CycloneDX는 SBOM (Software Bill of Materials)을 만드는 데 사용되는데, 이를 통해 소프트웨어의 구성 요소와 해당 요소의 버전, 라이선스 정보 등을 일관된 표준 포맷으로 제공합니다.

소프트웨어 프로젝의 구성 요소와 종속성을 정확하게 추적하고, 여러 구성 요소와 라이브러리 간의 관계를 명확게 파악할 수 있습니다.

Bom metadata.. Components.. Services.. Dependencies.. Extensions..

 

SBOM에서 CyclonDX의 중요성

 

소프트웨어를 구축하는 데 필요한 구성 요소들은 복잡하게 얽혀 있습니다.

이런 복잡성을 관리하려면 우리가 사용하는 각 구성 요소에 대한 자세한 정보가 필요한데요,

CycloneDX는 이러한 복잡성을 관리하는 데 아주 큰 도움이 되는 도구입니다.

앞선 글에서 설명드린 SBOM의 중요성과 앞으로 필현적으로 생성하고 제출해야 되는

제도적 대비를 준비하는 가운데 우리가 사용하는 소프트웨어의 구성 요소 관리와 이에 대한 정보는 정말 중요합니다.

 

CycloneDX의 이해

기능과 사용법

 

CycloneDX의 기술적 세부사항을 추가하기 위해,

이 도구가 어떻게 SBOM(Software Bill of Materials)을 생성하는지에 대한 설명이 필요합니다.

CycloneDX는 주로 XML, JSON, 그리고 Protobuf 형식을 사용하여 SBOM을 생성합니다.

 

Json과 XML에 대해 아직 모르신다면 아래 쉽게 설명해놨으니 참고해주세요

https://jdcyber.tistory.com/42

 

JSON 이란? (효율적인 데이터 교환의 핵심)

JSON, 이 단어를 들어본 적이 있으신가요? 오늘은 웹 개발 및 데이터 전송에 있어 매우 중요하고 유용한 JSON 파일에 대해 알아보는 시간을 갖도록 하겠습니다. JSON은 데이터 교환을 가능하게 하는

jdcyber.tistory.com

https://jdcyber.tistory.com/41

 

XML이란? (데이터 통신의 보편적 언어)

안녕하세요! 오늘은 데이터 통신 및 교환에 있어 전문적이며 보편적인 언어인 XML에 대해 알아볼까 합니다. 쉽게 말해, XML은 데이터를 공유하고 전송하는 데 도움을 주는 언어로 생각하시면 됩니

jdcyber.tistory.com

 

이 SBOM은 소프트웨어 프로젝트의 구성 요소, 그들의 버전, 라이선스 정보, 그리고 보안 취약점 데이터를 포함합니다.

또한, CycloneDX는 이러한 구성 요소들 사이의 관계와 종속성을 명확하게 나타내어,

보안 위험을 식별하고 관리하는 데 중요한 역할을 합니다.

CycloneDX는 개발자가 이해하기 쉬운 형식으로 이 정보들을 제공하므로,

소프트웨어의 보안 및 컴플라이언스 상태를 더욱 효과적으로 관리할 수 있습니다.

 

CycloneDX는 소프트웨어의 각 구성 요소, 그 구성 요소의 버전,

그리고 해당 구성 요소의 라이선스 정보 등을 SBOM에 기록합니다.

SBOM 생성을 어떻게 해야하나 고민하는 많은 보안 업계 종사자들에게는

현재까지 유일무의하게 활용해야 하는 도구로써 자리매김하였습니다.

이 도구는 XML, JSON, 또는 Protobuf 형식으로 SBOM을 생성할 수 있으며,

이를 통해 효과적인 라이선스 관리와 생겨날 보안 취약점 추적이 가능합니다.

 

Json 문서를 참고하여 CycloneDX 이해하기

 

CycloneDX의 깊이 있는 이해를 위해 공식 문서, 특히 JSON 스키마 사양을 참조하는 것이 중요합니다.

CycloneDX v1.5 JSON 문서는 bomFormat, specVersion 등의 주요 요소가

CycloneDX BOM의 구조와 내용을 어떻게 정의하는지에 대한 상세한 내용을 제공합니다.

소프트웨어 및 하드웨어 구성 요소, 그들의 유형과 관계를 정의하는 방법,

메타데이터, 버전 관리, 라이선스 정보를 포함하는 방법 등을 상세히 설명합니다.

CycloneDX를 소프트웨어 개발 및 보안 과정에 구현하려는 이들에게 이 가이드는 필수적입니다.

자세한 정보는 CycloneDX v1.5 JSON 문서를 참조하시길 바랍니다.

 

CycloneDX v1.5 JSON Reference

CycloneDX v1.5 JSON Reference

cyclonedx.org

CycloneDX 사례
보안 취약점 관리와 라이선스 추적

 

CycloneDX를 통해 SBOM을 생성하면, 이를 이용하여 보안 취약점을 효과적으로 관리할 수 있습니다.

만약 특정 라이브러리에 보안 취약점이 발견되었다면 이 라이브러리를 사용하는 모든 애플리케이션을 쉽게 찾아낼 수 있으며,

CycloneDX를 이용하여 라이선스를 추적하면, 전체 프로젝트에 어떤 영향을 미치는지 쉽게 알아낼 수 있습니다.

결국 꼬리를 물며 들어가 위협 요소를 판별하고 취약점을 색인하는 데 있어서 보안에 필수적 요소라고 할 수 있겠죠

 

CycloneDX를 사용한 보안 취약점 관리와 라이선스 추적의 구체적인 예를 들어 설명해 보겠습니다.

예를 들어, 특정 오픈 소스 라이브러리에서 새로운 보안 취약점이 발견되었다고 가정해 봅시다.

CycloneDX를 사용하면, 이 라이브러리를 포함하는 모든 소프트웨어 프로젝트를 신속하게 식별할 수 있습니다.

이를 통해 해당 취약점에 노출된 모든 애플리케이션을 즉시 파악하고, 필요한 보안 조치를 취할 수 있습니다.

또한, 라이선스 관리 측면에서, CycloneDX는 모든 구성 요소의 라이선스 정보를 제공함으로써,

소프트웨어 프로젝트가 특정 라이선스 요건을 준수하고 있는지 쉽게 확인할 수 있게 해줍니다.

 

CycloneDX의 장점과 한계

 

CycloneDX의 가장 큰 장점은 그 간결성과 효율성입니다.

이 도구는 필요한 정보만을 제공하여, 사용자가 쉽게 이해하고 사용할 수 있게 합니다.

그러나, 아직 ISO 표준화를 받지 않았고 더 광범위한 정보를 제공하는 도구들에 비해

제공하는 정보의 범위가 상대적으로 제한적인 것은 사실입니다.

 

CycloneDX를 통한 효과적인 소프트웨어 관리

 

CycloneDX는 간결하면서도 효율적인 SBOM 생성 도구로, 보안 취약점 관리와 라이선스 추적에 매우 유용합니다.

이 도구를 이용하여, 우리는 소프트웨어의 복잡성을 효과적으로 관리하고, 더 안전하고 신뢰성 있는 소프트웨어를 개발할 수 있습니다.

앞으로 나아갈 길이 기대되는 CycloneDX..

공급사에 조금은 특화되어 보이는 위 도구를 통해 소프트웨어 보안 프로세스의 도약을 기대해 봅니다.

 

위에 언급된 SBOM에 대한 내용은 아래 자세히 기술해 놨으니 확인해봐 주세요

https://jdcyber.tistory.com/4


궁금하신 사항은 댓글에 남겨주세요
댓글에 남겨주신 내용은
추후 정리해서 올려드리겠습니다
구독 신청하시면 업로드 시 알려드릴게요!
-
조금이라도 도움이 되셨다면
공감&댓글 부탁드리겠습니다
감사합니다!

반응형
반응형

John the Ripper

 

1996년에 처음 공개된

존더리퍼(John the Ripper, JtR)

본래 유닉스 기반 시스템을 위해 개발된 비밀번호 크래킹 도구입니다.

사전 공격(Dictionary Attack)을 통해 비밀번호 강도를 테스트하고

암호화된(해시된) 비밀번호를 무차별 대입(brute-force) 공격하여 비밀번호를 크래킹 하기 위해 고안됐습니다.

비밀번호 크래킹 속도를 높이기 위한 다양한 모드 제공하고,

암호화된 비밀번호가 사용하는 해싱 알고리즘 자동 탐지,

손쉬운 도구 구동 및 구성 등이 포함되어 있어 초보자와 전문가 모두 연습이 가능한 비밀번호 크래킹 도구입니다.
하지만 JtR은 악의적인 해킹 목적보다는 보안 전문가들이 시스템의 약점을 찾고 강화하는 데 사용하는 교육 도구로 더 널리 인식됩니다.

보안 연습을 위한 실습 도구로서 그 가치가 높히 평가됩니다.


설치

 

아래 코드를 이용하여 깃에 접속해 존더리퍼를 손쉽게 설치할 수 있으며,

git clone "https://github.com/magnumripper/JohnTheRipper.git" && cd JohnTheRipper/src && ./configure && sudo make -s clean && sudo make -sj4

 

아래 코드를 이용하여 Zip 파일을 풀고 비밀번호 해제를 진행합니다.

cd JohnTheRipper/run ./zip2john [filename.zip] > hash.txt ./john hash.txt

 

아래 사이트에서는 직접 자신에게 맞는

OS 별 환경에 맞게 다운로드하고 설정할 수 있습니다.

https://www.openwall.com/john/

 

John the Ripper password cracker

John the Ripper password cracker John the Ripper is an Open Source password security auditing and password recovery tool available for many operating systems. John the Ripper jumbo supports hundreds of hash and cipher types, including for: user passwords o

www.openwall.com


일반적으로 비밀번호 크래커와 같은 도구는

3가지 방식으로 동작합니다.

 

사전 공격 (Dictionary Attack)

무차별 대입 (brute-force)

레인보우 테이블 (Rainbow tables)

 

전수 지수 공격 무작위 대입 공격이며

(모든 문자 및 숫자를 대입하는 방식)

사전 대입 공격은 관련성 있는 문자 및 숫자를 먼저 대입하는 방식입니다


사전 공격

사전 공격 사전에 입력된 수많은 단어와 구문,

이전에 유출된 데이터에서 가능성 있는 비밀번호 목록으로 로그인을 시도합니다.

이 도구는 올바른 비밀번호를 찾기 위해 애플리케이션 목록의 모든 단어를 입력합니다.
일반적으로 간단한 비밀번호에 효과적이지만,

복잡하고 무작위적인 비밀번호에는 덜 효과적입니다.

이 방법은 보안 수준이 낮은 시스템을 빠르게 크래킹 하는 데 유용하지만,

강력한 비밀번호에 대해서는 시간이 오래 걸릴 수 있습니다.


무차별 대입 공격

무차별 대입 공격은 사용자에게 아래와 같이 몇 가지 규칙을 구성하도록 요청합니다.

올바른 비밀번호의 최소 길이와 최대 길이,

구성될 가능성이 있는 글자 유형

(문자, 문자+숫자, 특수 문자 등)

위치 (알파벳 몇 개, 특수 문자 몇 개, 비밀번호 총 길이 등의 규칙)

이상적인 대입 구성을 찾기 위해서는 약간의 추측과 전문 지식이 필요합니다.

그리고 범위 안에서 기준에 따라 가능한 모든 비밀번호 조합을 추측하고,

올바른 비밀번호를 찾아내면 사용자에게 알려주도록 고안되어 있습니다.

이 방법은 매우 효과적인 방법이지만 속도가 매우 느립니다.

예를 들어, 대소문자와 함께 숫자와 특수 문자가 혼합된 9자리 비밀번호는

컴퓨터가 추측하는 데 9년 이상이 소요되기 때문에 실제로는 크래킹이 불가능합니다.

그래서 보안 전문가들이 항상 다양한 문자 유형의 조합으로 구성된 길고 복잡한 비밀번호를 선택하라고 제안하는 것이죠


레인보우 테이블(Rainbow tables)

 

업무에 필수적이고 보안 지향적인 애플리케이션은

비밀번호를 평문으로 저장하는 경우가 거의 없고 길이가 고정된 해시를 저장하고 있습니다.

때문에 유출된 데이터 등으로부터 얻은 해시화된 비밀번호 목록의 경우에 레인보우 테이블이 더욱 효율적일 수 있습니다.

우선 사전에 연산된 비밀번호 해시 목록을 기존의 데이터와 비교해 평문 형식의 올바른 비밀번호를 찾습니다.

해시된 데이터가 미리 계산되기 때문에 레인보우 테이블을 사용하는 것이

무차별 대입보다 속도 적으로 훨씬 빠릅니다.

레인보우 테이블은 비밀번호 해시가 솔팅(Salting) 되어 있고 솔트 값이 너무 커서

비밀번호의 전체적인 복잡성이 증가할 때는 효과적이지 못합니다.

그래서 해시된 사용자 비밀번호를 데이터베이스에 저장하는 것 외에

솔팅을 보안 방어책으로 사용하는 것입니다.

솔팅을 제대로 적용하면 비밀번호 데이터베이스가 유출되더라도

실제로 해커가 사용자 비밀번호를 본래의 평문 형식으로 되돌리는 것이 불가능하기 때문입니다.

솔팅과 해시 평문 등 어려운 단어로 알아듣지

못하시더라도 지금은 괜찮습니다.

추후 제가 설명 글을 작성해 드리도록 하겠습니다.

해당 방법은 보안을 위한 연습만 하시길 바라며

악의적인 해킹은 절대 삼가 주시기 바랍니다.


궁금하신 사항은 댓글에 남겨주세요
댓글에 남겨주신 내용은
추후 정리해서 올려드리겠습니다
이웃 신청하시면 업로드 시 알려드릴게요!
-
조금이라도 도움이 되셨다면
공감&댓글 부탁드리겠습니다
감사합니다!

반응형
반응형

ACL 접근 제어 목록 (Access Control List)

허가되지 않은 이용자가 라우터나 네트워크의 특정 자원에 접근하려고 하는 것을 차단하는 기능입니다.

첫 번째 실습에 이어 두 번째 시간입니다.


이 실습에서는 네트워크 보안의 중요한 측면인 접근 제어와 트래픽 관리를 실습합니다.

이 실습의 주된 목적은 네트워크 보안을 강화하고 특정 네트워크 트래픽을 제어하는 방법을 배우는 것입니다.
ACL을 사용하여 특정 소스에서 오는 또는 특정 목적지로 가는 트래픽을 제어하고,
네트워크 자원에 대한 무단 접근을 방지하는 방법을 배울 수 있습니다.

ACL에 대한 자세한 개념은

아래 글을 참고해 주세요!

https://jdcyber.tistory.com/17

 

ACL (Access Control List) 이란? ACL 구성 가이드: 네트워크 보안 강화를 위한 필수 지침 (쉬운 설명, 예

ACL (Access Control List) 정의 및 개념 ACL (Access Control List) 은 네트워크 보안의 핵심 구성 요소로, 네트워크 장비에서 데이터 패킷의 흐름을 제어하는 데 사용되는 일련의 지침입니다. 이 규칙들은 특

jdcyber.tistory.com

 

모든 패스워드는 'cisco'입니다.

R1, R2, R3에는 RIPv2 라우팅 업데이트 설정 완료

모든 구간 패킷 전송이 가능 상태

다음 조건에 맞게 ACL를 이용하여 R3에서 트래픽 필터링을 구현하세요

(패킷 트레이서 예제 파일은 본 글 하단에 첨부 해놨습니다.)


차단 규칙 먼저: 특정 트래픽을 차단하는 규칙은 해당 트래픽이 다른 규칙에 의해 우선적으로 허용되기 전에 평가되어야 합니다. 따라서, 트래픽을 차단하려는 규칙들은 ACL의 상단부에 배치해야 합니다.

'permit' 규칙의 위치: ACL의 마지막에는 대체로 'permit' 규칙을 두어, 이전의 모든 규칙에서 명시적으로 차단되지 않은 나머지 모든 트래픽을 허용합니다. 이는 실수로 중요한 트래픽을 차단하지 않도록 보장하는 안전장치 역할을 합니다.

정확한 순서의 중요성: 잘못된 순서로 규칙을 설정하면 의도하지 않은 트래픽 차단 또는 허용이 발생할 수 있습니다.
따라서, 각 규칙을 정확한 순서대로 설정하는 것이 네트워크 보안과 효율성을 유지하는 데 매우 중요합니다.

조건

R3는 외부에서 오는 트래픽 중 출발지 네트워크가 ‘13.13.10.0/24’인 트래픽이 내부 로컬 네트워크 ‘13.13.30.0/24’로 Telnet 접근을 차단하여라. 
(목적: 이 규칙은 민감한 내부 네트워크('13.13.30.0/24')로의 무단 Telnet 접근을 차단합니다. Telnet은 암호화되지 않은 통신을 사용하므로, 무단 접근자가 중요한 정보를 쉽게 가로챌 수 있습니다. 이 규칙은 특정 외부 네트워크('13.13.10.0/24')로부터의 잠재적인 위협을 방지하고 내부 네트워크의 보안을 강화합니다.)


R3에 위치한 HTTP/FTP 서버는 외부로부터 ICMP 공격을 받고 있는 상태이다. 외부로부터 수신하는 ICMP를 차단하여 공격을 방지하여라. 단, 서버는 외부로 Ping이 가능해야 한다.
(목적: 이 설정은 외부로부터 R3에 위치한 서버로의 ICMP 트래픽(특히 'echo' 요청, 즉 Ping)을 차단하여, 네트워크 서비스 거부(DoS) 공격과 같은 위협으로부터 서버를 보호합니다. 동시에, 서버가 네트워크 연결 상태를 확인하기 위해 외부로 Ping을 보낼 수 있도록 합니다. 이는 서버가 공격을 받지 않으면서도 정상적으로 네트워크 진단을 수행할 수 있도록 보장합니다.)


R3는 외부에서 오는 트래픽 중 출발지 네트워크가 ‘13.13.20.0/24’인 트래픽이 내부 로컬 웹서버 ‘13.13.30.3’에 접근하는 것을 차단하여라.
(목적: 이 규칙은 특정 출발지 네트워크('13.13.20.0/24')에서 내부 로컬 웹서버('13.13.30.3')로의 접근을 차단하여, 서버가 무단 접근이나 잠재적인 공격으로부터 보호되도록 합니다. 이는 웹 서버의 데이터 보안과 운영 안정성을 유지하는 데 중요합니다.)


R3는 위에 조건을 제외한 나머지 트래픽은 허용한다.
(목적: 이 규칙은 위에 명시된 조건을 제외한 모든 트래픽을 허용합니다. 이는 네트워크가 필요한 정상적인 트래픽을 차단하지 않으면서 보안을 유지할 수 있도록 합니다. 이는 네트워크의 연결성과 기능성을 보장하는 동시에 필수적인 보안 조치를 유지합니다.)

명령어

 

conf t
(R3 외부 트래픽 중 출발지 네트워크 ‘13.13.10.0/24’인 트래픽이 내부 로컬 네트워크 ‘13.13.30.0/24’로 Telnet 접근 차단)
access-list 110 deny tcp 13.13.10.0 0.0.0.255 13.13.30.0 0.0.0.255 eq23

(R3 HTTP/FTP 서버는 외부로부터 ICMP 공격을 받고 있는 상태. 외부로 수신하는 ICMP를 차단하여 공격을 방지 단, 서버는 외부로 Ping이 가능도록 설정) access-list 110 deny icmp any host 13.13.30.3 echo

(R3 외부에서 오는 트래픽 중 출발지 네트워크가 ‘13.13.20.0/24’인 트래픽이 내부 로컬 웹서버 ‘13.13.30.3’에 접근하는 것을 차단) access-list 110 deny tcp 13.13.20.0 0.0.0.255 host 13.13.30.3 eq 80

(위에 조건을 제외한 나머지 트래픽은 허용) access-list 110 permit ip any any
!
(위의 조건을 구성할때에는 최대한 간결하게 ACL를 구성하며, ACL을 R1 Serial 1/1 에 적용)
int s1/1
ip access-group 110 in
  1. Telnet 접근 차단 (출발지 네트워크 '13.13.10.0/24'에서 '13.13.30.0/24'로):
    설명: 이 단계에서는 '13.13.10.0/24' 네트워크에서 '13.13.30.0/24' 네트워크로의 Telnet 접근을 차단하는 ACL 규칙을 설정합니다. 이는 무단 접근을 막아 네트워크의 보안을 강화하는 데 중요합니다.
    명령어: access-list 110 deny tcp 13.13.10.0 0.0.0.255 13.13.30.0 0.0.0.255 eq 23

  2. ICMP 공격 방지 (HTTP/FTP 서버 '13.13.30.3'로의 ICMP 수신 차단):
    설명: 이 단계는 R3에 위치한 HTTP/FTP 서버를 ICMP 공격으로부터 보호합니다. 외부에서 서버로의 ICMP 메시지를 차단하되, 서버가 외부로 Ping을 할 수 있도록 설정합니다.
    명령어: access-list 110 deny icmp any host 13.13.30.3 echo

  3. 특정 트래픽 차단 (출발지 네트워크 '13.13.20.0/24'에서 웹서버 '13.13.30.3'로의 접근 차단):
    설명: 이 규칙은 '13.13.20.0/24' 네트워크에서 내부 로컬 웹서버 '13.13.30.3'으로의 접근을 차단합니다. 특정 네트워크 소스로부터의 웹 트래픽을 제한하여 서버 보안을 강화합니다.
    명령어: access-list 110 deny tcp 13.13.20.0 0.0.0.255 host 13.13.30.3 eq 80

  4. 나머지 트래픽 허용:
    설명: 이 규칙은 위에 나열된 조건을 제외한 모든 트래픽을 허용합니다. ACL은 위에서 아래로 규칙을 평가하므로, 맨 마지막에 'permit' 규칙을 두어 그 이외의 모든 트래픽을 통과시킵니다.
    명령어: access-list 110 permit ip any any
  •  

확인

show ip access-lists

패킷 트레이서 예제 파일

18_ACL 트래픽 필터링 예제-2.pkt
0.11MB

ACL이란?

ACL 트래픽 필터링 실습 #1

ACL 트래픽 필터링 실습 #2


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

이웃 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

 

반응형

+ Recent posts