본문 바로가기
정보보안

정보보안5 5차시

by IT매니절 2024. 8. 17.

TCP 헤더 (20~60 Byte)
- 송신지 포트 번호
- 수신지 포트 번호
- 일련 번호
- 데이터 오프셋
- 예약
- 제어 비트 (URG ACK PSH RST SYN FIN)
- 윈도우 크기
- 체크썸
- 긴급 포인터
- 옵션

+ CWR 비트
혼잡 제어, 전송속도 감소

+ ECN 비트
네트워크 혼잡 상태 알림

 

 

UDP 헤더
- 송신지 포트 번호
- 수신지 포트 번호
- 전체 데이터그램 길이
- 체크썸

 

 

참고

https://www.lainyzine.com/ko/article/summary-of-how-to-use-docker/#google_vignette

초심자를 위한 Docker 입문

 

https://cafe.naver.com/linuxmasternet/1188
하이퍼바이저
Type1 : Native, Bare Metal Hypervisor
- 운영체제와 완전히 독립적

- vm웨어 ESXi나 마이크로소프트 Hyper-V 등

Type2 : Hosted Hypervisor
- 운영체제가 설치된 후 그 위에 다른 운영 체제 지원

- vm웨어 워크스테이션이나 오라클 버츄얼 box가 대표적

 

 

도커의 핵심 : 격리

경량화. 논리적인 공간으로 사용
도커 컨테이너는 쉽게 다른 서버에 복사 가능
윈도우에서는 WSL2 도커 데스크탑 설치하면 사용 가능

 

* 요즘에는 쿠버네티스를 많이 사용

 

로키 리눅스8에서 도커 설치

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl --now enable docker

 

도커 상태는 systemctl status docker.service 로 확인

 

# ip a
1: lo: 생략
2: ens160: 생략
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:47:91:b4:3f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

ip a에 도커용 인터페이스가 생성되었다

 

 

docker를 치면 사용 설명을 볼 수 있다

 

# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
31e907dcc94a: Pull complete
Digest: sha256:8a37d68f4f73ebf3d4efafbcf66379bf3728902a8038616808f04e34a9ab63ee
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    edbfe74c41f8   2 weeks ago   78.1MB

docker pull로 우분투 이미지를 땡겨와 복제설치한다

docker images로 용량확인

이러한 방식으로 도커 안에 db, php, apache 등이 속할 수 있다

 

docker run -it --name ubuntu ubuntu /bin/bash

 

docker run -it --name ubuntu ubuntu /bin/bash

              |    ||             |                |              └ 컨테이너 시작시 실행할 명령어

              |    ||             |               └ 실행할 이미지 이름

              |    ||            └ 컨테이너 이름을 ubuntu로 설정

              |    |└ -t 터미널 할당

              |   └ -i 컨테이너 표준 입력

             └ run을 이용하면 자동으로 pull하여 다운로드 후 실행한다

 

exit : 경우에 따라 컨테이너가 중지될 수있음

Ctrl+Shift+p Ctrl+Shift+q  
: 컨테이너를 중지하지 않고 빠져나가기

 

# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
e9829b3f0fc0   ubuntu    "/bin/bash"   7 minutes ago   Up 7 minutes             ubuntu

현재 실행여부 확인

 

docker exec로 재접속 가능

 

리눅스# uname -a
Linux rocky8.linuxmaster.net 4.18.0-553.el8_10.x86_64 #1 SMP Fri May 24 13:05:10 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

도커# uname -a
Linux e9829b3f0fc0 4.18.0-553.el8_10.x86_64 #1 SMP Fri May 24 13:05:10 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

uname -a로 커널버전을 확인

도커는 리눅스의 커널을 공유받아 사용한다

 

# docker stop ubuntu
ubuntu
# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                        PORTS     NAMES
e9829b3f0fc0   ubuntu    "/bin/bash"   16 minutes ago   Exited (137) 45 seconds ago             ubuntu

stop 명령어로 중지시키면 docker ps리스트에 뜨지 않는다

-a 명령어는 중지된 도커까지 볼 수 있다

# docker rm ubuntu
# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    edbfe74c41f8   2 weeks ago   78.1MB
# docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:8a37d68f4f73ebf3d4efafbcf66379bf3728902a8038616808f04e34a9ab63ee
Deleted: sha256:edbfe74c41f8a3501ce542e137cf28ea04dd03e6df8c9d66519b6ad761c2598a
Deleted: sha256:f36fd4bb7334b7ae3321e3229d103c4a3e7c10a263379cc6a058b977edfb46de

docker rm ubuntu

컨테이너 완전 삭제. ps -a 명령으로도 볼 수 없게된다.

삭제후에도 다운로드된 images는 남아있기 때문에 rmi를 이용해 완전삭제

 

# docker run --name apache_web_server -d httpd

                                                                   └ -d 백그라운드로 실행

 

 

dnf --enablerepo=powertools -y install lynx

lynx 설치하고

 

lynx --dump 172.17.0.2
                                   It works!

내부에서 접속 가능. 이 때는 docker0 인터페이스로 직접 접속한다.

 

iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 37 packets, 2710 bytes)
 pkts bytes target     prot opt in     out     source               destination 
   30  1560 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

... 생략

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0

도커를 통해 컨테이너를 설정하면 자동으로 iptables DNAT에 룰로 등록된다

 

# docker run -d --name apache_web_server -p 80:80 httpd

iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 37 packets, 2710 bytes)
 pkts bytes target     prot opt in     out     source               destination 
   30  1560 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

생략

Chain OUTPUT (policy ACCEPT 104 packets, 7329 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    1    60 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0  
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80

-p 80:80은 호스트port:컨테이너port로 리눅스의 80번 포트와 연결한다.

iptables의 룰에도 연결해주는 변화가 생겼다 (기존 리눅스가 갖고있던 ens160 인터페이스를 통해 접속)

 

# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                               NAMES
1f933f7a6f68   httpd     "httpd-foreground"   19 minutes ago   Up 19 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   apache_web_server

내부(vm웨어 리눅스)뿐만 아니라 외부(윈도우)에서도 접근가능해졌다

 

# docker run -d --name mysql5.6 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=111111 mysql:5.6

                                                                                                           |                                          |

                                                                                    mysql 내부 환경 변수 설정     실행할 이미지 이름과 태그 지정

 

# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 40 packets, 3397 bytes)
 pkts bytes target     prot opt in     out     source               destination 
   32  1664 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

생략

Chain POSTROUTING (policy ACCEPT 182 packets, 12991 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    1    60 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:3306

Chain OUTPUT (policy ACCEPT 181 packets, 12947 bytes)
 pkts bytes target     prot opt in     out     source               destination 
    1    60 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination 
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0  
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 to:172.17.0.2:3306

 

리눅스에 mysql 패키지 없으면 설치하고

# mysql -h 127.0.0.1 -P 3306 -u root -p111111

mysql> 

 

접속완료

 

-h 127.0.0.1 이 없으면 소켓으로 통신하기 때문에 에러 발생 (tcp 통신해야함)

 

vi .my.cnf 파일 만들어서

[client]

host=

user=

password=

정보넣고 사용하는 것이 비교적 안전

 

# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        5.6       dd3b2a5dcb48   2 years ago   303MB
# docker rmi mysql
Error response from daemon: No such image: mysql:latest

#docker rmi mysql:5.6

=> TAG가 5.6 이므로, :5.6을 붙여서 삭제하거나 IMAGE ID로 삭제해야한다

 

# docker network
Usage:  docker network COMMAND
Manage networks
Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.

 

커맨드 확인

 

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
708f99e2b3e6   bridge    bridge    local
54385ad65dc6   host      host      local
d151aaa9e1fc   none      null      local

ls 명령어를 통해 현재 도커에서 사용 가능한 네트워크 목록을 확인할 수 있다

DRIVER는 네트워크 구현에 사용되는 드라이버이며

기본적으로 bridge를 사용한다. host는 성능이 중요한 네트워크 작업에 사용되고, null은 네트워크 연결이 없다는 뜻

SCOPE는 범위를 의미한다

 

# docker network create mynetwork
324a32024101fe3cec46733f442997cba801f19274492fcfbda1d5c33780425c
# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
708f99e2b3e6   bridge      bridge    local
54385ad65dc6   host        host      local
324a32024101   mynetwork   bridge    local
d151aaa9e1fc   none        null      local

 

네트워크를 create로 생성하면 추가된다.

 

# docker network inspect mynetwork

좀 더 자세한 정보들을 출력할 수 있다 (json 형태로 제공)

# ip a
1: lo: 생략
2: ens160: 생략
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:47:91:b4:3f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:47ff:fe91:b43f/64 scope link
       valid_lft forever preferred_lft forever
12: br-324a32024101: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:b9:0d:8d:38 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-324a32024101
       valid_lft forever preferred_lft forever

ip a에 docker0 뒤로 새로 생성한 네트워크가 추가되었음

 

# docker network rm mynetwork

네트워크는 rm 으로 삭제한다

 

 

워드프레스Wordpress

오픈소스 콘텐츠 관리 시스템. 웹사이트를 쉽게 생성하고 관리할 수 있는 도구

PHP로 개발되었고, 취약점이 많지만 편리함. Maria DB와 연동한다

 

도커에서 사용할 네트워크 생성

# docker network create wordpress_network

# docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
708f99e2b3e6   bridge              bridge    local
54385ad65dc6   host                host      local
d151aaa9e1fc   none                null      local
07f1d0646f47   wordpress_network   bridge    local

확인

 

vi docker_mysql_install.sh

docker_mysql_install.sh 쉘 스크립트 생성

# chmod 755 docker_mysql_install.sh

권한 변경해주고 파일 생성하거나 그냥 스크립트 복사붙여넣기 해서 실행하면 된다

 

옵션은 별거없고 -dit는 -d -i -t 합쳐서 쓴것임.

 

# docker ps
CONTAINER ID   IMAGE       COMMAND                   CREATED              STATUS              PORTS                 NAMES
83164bbab30c   mysql:8.0   "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp   mysqlwordpress

 

Up 실행중 확인

 

vi docker_wordpress_install.sh

# docker ps                                                      CONTAINER ID   IMAGE       COMMAND                   CREATED         STATUS         PORTS                               NAMES
93c4ff0c02a6   wordpress   "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   wordpress
83164bbab30c   mysql:8.0   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   3306/tcp, 33060/tcp                 mysqlwordpress

 

둘 다 실행중 확인

 

http://192.168.100.30/wp-admin/install.php

 

해당하는 ip에 /wp-admin/install.php 붙여서 들어가면

워드프레스 설치 화면이 나온다

진행하면 쉽게 설치완료된다

 

 

 

비밀번호를 잊어버렸을 때

 

# docker exec -it mysqlwordpress /bin/bash

# mysql -u root -p111111

mysql> use wordpress;

mysql> show tables;
+-----------------------+
| Tables_in_wordpress   |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+

mysql> select * from wp_users\G

 

mysql> UPDATE wp_users SET user_pass= '21232f297a57a5a743894a0e4a801fc3' WHERE user_login = 'admin'

21232f297a57a5a743894a0e4a801fc3

가 admin에 해당하는 비밀번호 암호문값이라고 한다

참고 ( https://www.mbcdy.com/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C-%EB%B6%84%EC%8B%A4-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95/ )

 

 

도커로 톰캣 설치

# mkdir -p /project/tomcat
# docker run -d -it -p 8080:8080 -e LC_ALL=C.UTF-8 -v /project/tomcat:/usr/local/tomcat/webapps/ROOT/limanet --name tomcat8_1 bitnami/tomcat

=> 그런데 실행하니 docker ps -a 에서 죽은것으로 확인되어

 

# docker pull tamcat:latest

# docker run -d -it -p 8080:8080 -e LC_ALL=C.UTF-8 -v /project/tomcat:/usr/local/tomcat/webapps/ROOT/limanet --name tomcat8_2 tomcat

=> 최신버전 tomcat을 pull로 다운받아 재실행

# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                                       NAMES
0fd2654b8b36   tomcat    "catalina.sh run"   5 seconds ago   Up 4 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat8_2

Up 실행 확인

 

그냥 들어가면 에러가 난다

설정했던 /project/tomcat 폴더에 index.jsp 파일을 생성하고

/usr/local/tomcat/webapps/ROOT/limanet 였으니까

http://192.168.100.30:8080/limanet/ 로 접속

 

 

( 참고 : 도커에서 애플리케이션 서버 실행하기 https://yooloo.tistory.com/42 )

 

이 때 파일을 수정하고 웹 브라우저를 새로고침하면 바로 동기화 되는 것이 확인된다.

이것은 도커의 실행시 -v 볼륨 옵션을 주었기 때문이다.

'정보보안' 카테고리의 다른 글

정보보안5 7차시  (0) 2024.08.24
정보보안5 6차시  (0) 2024.08.18
정보보안5 4차시  (0) 2024.08.11
정보보안5 3차시  (0) 2024.08.10
정보보안5 2차시  (0) 2024.08.04