펜타네스트님께서 질문해주신 내부에서 사용중인 VM을 disk 형태로 꺼내서 마이그레이션 하는방법입니다.
기본적으로 Proxmox에서 스냅샷을 사용하기위해서는 lvm(btrfs)이나 ZFS를 사용해야합니다. 이경우에 VM의 가상디스크는 자동으로 Data 볼륨에 마운트 되기때문에 실제로 그 파일의 경로를 찾을수는 없는데요.
아래 방법을 통해 디스크의 논리적 위치를 확인하고 qcow2 파일로 떨궈서 보관하는방법을 진행하겠습니다. 보관장소는 NAS의 NFS를 사용하거나 외장하드를 사용하거나 편하신대로 하시면 되며 저같은경우 예를들기위해 작성하는거라 기본 셋팅된 lvm-local에서 진행하겠습니다.
1. 사용하고있는 VM의 확인하기.
먼저 백업할 디스크가있는 VM의 설정 -> 하드웨어로 가서 하드디스크의 위치를 확인해줍니다.
여기서는 local-lvm:vm-103-disk-0 이 되겠네요.
2. qcow 파일로 변환하기.
그다음 Proxmox Host의 쉘로 접근한뒤에 백업을 할 디렉터리로 이동해주시고 아래명령어를 통해 해당 vm disk의 논리적 위치를 확인해줍니다.
pvesm path [VMdisk 경로]
경로는 /dev/pve/vm-103-disk-0이 되겠군요.
이제 백업할 디렉터리로 이동해주신뒤에 qemu-img 명령어를 통해 파일로 떨궈줍니다.
qemu-img convert -O qcow2 -f raw [VM-Disk경로] [output.qcow2]
명령어가 잘실행되면 아래처럼 파일이 잘떨어집니다.
3. 로컬로 내려받기 and 복구방법.
이제 winscp를 통해 로컬로 내려받으시거나 보관하시면되며 여기서는 간단히 복구 방법도 기술해보겠습니다.
docker: 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 플랫폼이다. docker compose: yaml 파일에 설정된 정의를 기반으로 다중 컨테이너 애플리케이션 환경을 실행할 수 있게 해주는 도구입니다. YAML: 사람이 쉽게 이해할 수 있고 기계가 해석할 수 있는 방식으로 구조화된 데이터를 표현하는 표준화 형식을 제공합니다. 'YAML'은 'YAML은 마크업 언어가 아니다(YAML Ain't Markup Language)' 또는 '또 다른 마크업 언어(Yet Another Markup Language)'의 약어입니다. (참조 : https://www.ibm.com/kr-ko/topics/yaml)
yaml 파일에(docker-compose.yml) MinIO (Minimal Object Storage), MC (MinIO Client) 두 개의 서비스를 정의하고(차후 포스팅), docker compose로 한 번에 실행(docker compose up -d) 및 관리할 수 있도록 우선 docker와 docker TooL 인 docker compose를설치하는 방법을 기재하겠습니다.
환경 : Rocky Linux 8.9
dnf: Rocky Linux는 기존 리눅스의 패키지 설치 관리 도구인 yum을 개선한 패키지 관리 도구로 dnf(Dandified YUM)를 사용을 할 수 있습니다. dnf는 RHEL/CentOS 8부터 정식 도입 되었으며, 기존 yum을 사용해도 되고, dnf(yum과 같은 용법)를 사용해도 됩니다.
docker 설치
1. dnf-utils 설치 (dnf config-manager 사용 시 필요)
**전체 명령어 root 권한으로 수행
# dnf install dnf-utils -y
2. docker 레포지토리 추가
참고 : Rocky Linux에서 # yum install docker로 설치하게 되면, podman-docker 가 설치된다. podman(RHEL 컨테이너 실행/관리 도구)
docker 컨테이너 실행 확인(별다른 컨테이너를 실행하지 않았을 경우 아래와 같은 유사한 내용만 출력)
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(참고) Linux 일반 사용자에게 docker 사용 권한 부여
docker 그룹 확인
# cat /etc/group
docker:x:986:
test-user에게 권한 부여
# usermod -aG docker test-user
-a, --append
-G, --groups GROUPS
권한 부여 전
[test-user@test ~]$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json": dial unix /var/run/docker.sock: connect: permission denied
권한 부여 후
[test-user@test ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
라이 믹스는 PHP 기반의 오픈소스 콘텐츠 관리 시스템(CMS) 및 프레임워크입니다.현재는 개발이 중단된 XE1버전의 가지치기 포크(Frok)로 별도 개발된 프로젝트이며 누구나 무료로 사용 및 개발에 참여할 수 있는 자유 소프트웨어입니다. 라이 믹스는 "시를 짓다, 운을 맞추다"라는 의미의 "rhyme"과 "조합하다, 변주하다"라는 의미의 "remix"를 합친 이름이라고 합니다.
[root@]#firewall-cmd --permanent --add-port=80/tcp [HTTP 80번 포트 추가]
success
[root@]#firewall-cmd --reload [적용]
success
[root@]#firewall-cmd --list-all [추가된 포트 확인]
ports: 80/tcp
⑥ 웹 구동 확인 테스트[스크린샷 참고]
⑦ PHP 적용 확인
[root@]# cd /var/www/html/
해당 경로에서 PHP의 정보를 보여주는 함수 파일 생성 후 저장 [root@]#vim /var/www/html/phpinfo.php
<?php phpinfo();?> [라인 추가]
[root@]#ls
phpinfo.php [파일 생성 확인]
⑧ PHP 웹 연동 확인 테스트[스크린샷 참고]
STEP06 → MariaDB 구동 및 설정
① MariaDB 구동
[root@]#systemctl start mariadb
[root@]#systemctl enable mariadb [부팅 시 자동 시작 활성화(비활성화 disable)]
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service. Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service. Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@]#ps -ef | grep mysql [구동 확인]
mysql/usr/libexec/mysqld --basedir=/usr
② Maria DB 기본 설정 [DB가 구동된 상태에서 진행 가능]
[root@]#mysql_secure_installation
Enter current password for root (enter for none):[패스워드가 없기 때문에 엔터]
◇ 유닉스 소켓 관련 메시지는 10.4 버전 이상에서 나옵니다.
Switch to unix_socket authentication [Y/n]Y[MariaDB 실행 시 통신 소켓 생성 여부? Y 엔터]
Change the root password? [Y/n]Y[DB ROOT 패스워드 설정할 것인가? Y 엔터]
New password:패스워드 입력
Re-enter new password:재확인 패스워드 입력
Remove anonymous users? [Y/n]Y[익명의 접근을 막을 것인지? 보안을 위해 Y 엔터]
Disallow root login remotely? [Y/n]Y[DB ROOT 원격을 막을 것인지? 보안을 위해 Y 엔터]
Remove test database and access to it? [Y/n]Y[Test 용으로 생성된 데이터베이스를 삭제할 것인가? Y 엔터]
Reload privilege tables now? [Y/n]Y[현재 설정한 값을 적용할 것인지? 당연히 Y 엔터] Thanks for using MariaDB! [설정 완료]
③ MariaDB 접속 및 Rhymix 데이터베이스 생성
◇ 데이터베이스 이름이나 유저 ID/패스워드는 임의로 설정
[root@]# mysql -u root -p [DB 접속] Enter password: 패스워드 입력
◇ Rhymix 데이터베이스 생성 : CREATE DATABASE 데이터베이스 이름; MariaDB [(none)]> CREATE DATABASErhymixdb; Query OK, 1 row affected (0.000 sec)
◇ 접근 유저 ID 및 패스워드 생성 : CREATE USER '유저 ID'@'localhost' IDENTIFIED BY '패스워드'; MariaDB [(none)]> CREATE USER 'rhymix'@'localhost' IDENTIFIED BY 'test1234'; Query OK, 0 rows affected (0.037 sec)
◇ 접근 권한 설정[모든 권한] : GRANT ALL ON 데이터베이스 이름.* TO '유저 ID'@'localhost'; MariaDB [(none)]> GRANT ALL ON rhymixdb.* TO 'rhymix'@'localhost'; Query OK, 0 rows affected (0.000 sec)
◇ 저장 종료 MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.000 sec)
[root@]#vim /etc/httpd/conf.d/rhymix.conf [파일 생성 후 저장]
<VirtualHost *:80> [시작]
ServerName192.168.150.153 [도메인 호스트 주소 또는 서버 IP]
ServerAdmin foxydog@localhost
DocumentRoot/var/www/html/rhymix
<Directory "/var/www/html/rhymix">
OptionsIndexes FollowSymLinks
AllowOverrideall
Requireall granted
</Directory>
ErrorLog/etc/httpd/logs/rhymix_error.log
CustomLog/etc/httpd/logs/rhymix_access.log common
</VirtualHost> [끝]
[root@]#systemctl restart httpd [재시작 적용]
[root@]# systemctl status httpd | grep active [구동 확인] Active: active (running) since Wed 2022-07-13 04:32:15 EDT; 4s ago
STEP09 → 브라우저에서 Rhymix 설정 및 설치[스크린샷 순서대로 진행]
◇http://서버IP입력
마치며
앞서 설명하였듯이 기본 베이스는 XE1(Xpress Engine.ver1) 이므로 해당 게시판을 운영을 해보았다면 비슷한 부분이 많아 개발 및 운영이 좀 더 익숙하다고 느낄 수 있습니다. 저도 개인적으로는 워드프레스보다는 좀더 친숙한 느낌이 드네요. 실제로도 운영하는 서버가 있어 관리하기가 좀더 편합니다. 개발자분들께서 최적화가 좀더 진행이 되었는지 VMWARE에서 기본 2코어/2GB 메모리만 할당하였음에도 엔진이 가볍다는 느낌이 듭니다.웹 개발자로 공부하시는 분들은 개인 PC 가상 서버나 클라우드 서버에 업로드 설치하여 연습하면 좋을 것으로 보입니다.
FortiGate에서 아래와 같이 외부(all)에서 내부(all)로의 정책(ID 15)을 차단으로 설정했지만, VIP 정책(ID 14)은 차단되지 않고 허용된다.
FortiOS에서는VIP 객체와 Firewall Address 객체는 완전히 다른 객체로 판단하다. 즉Firewall Address 객체인 "all" 과 VIP 객체인 "VIP_eBT_FAZ" 객체는 서로 다른 별개의 영역으로 판단하게된다. 따라서"VIP_eBT_FAZ"접속하는 트래픽은 "all"에 매칭되지 않고, ID 15 정책에 의해 허용된다.
차단하려면VIP 객체에 대한 차단 정책을 생성해야 한다.
또는 ID 15 정책에 아래와 같은옵션을 추가하여, VIP 객체에 대해서도 매칭되도록 설정 할 수 있다.
본 가이드에서는 미크로틱(마이크로틱) 라우터 및 CRS 스위치 제품군에서 RouterOS와 부트로더의 버전을 이해하고, 업그레이드 또는 다운그레이드 하는 방법을 설명합니다.
RouterOS에는 WinBox 또는 FTP, SCP로 파일을 전송할 수 있으며, 여기서는 WinBox로 전송하는 방법만 다룹니다.
또한 RouterOS v7을 기준으로 설명하며, 기존 v6에서는 추가 및 번들 패키지 종류가 다를 수 있으나 이미 사장되어 가는 구식 커널 기반 OS이므로 해당 설명은 제외하였습니다.
RouterOS가 설치된 MikroTik 제품을 처음 접하신다면 사용자가 확인할 수 있는버전 정보가 여러가지 표시되어혼란스러울 수 있습니다.
예를 들면 아래와 같습니다.
당장 현시되는 버전 정보만 다섯 가지나 되는데, 의미를 모르는 사람이 보면 약간 기괴하게 느껴집니다.
왼쪽에 표시되는 버전은 7.16.2인데 오른쪽에 표시되는 현재 버전은 7.15.3입니다.
현재 설치된 버전은 7.16.2일까요? 아니면 7.15.3?
그런데 오른쪽의 업그레이드 버전은 7.16.2이니까 동일버전으로 업그레이드 해야된다는 걸까요?
지금 혼란스러우시다면, 이 가이드를 꼭 읽어보셔야 합니다!
그래서... 미크로틱 개발자들은 변태 성향이라 사용자를 괴롭히는 걸까요? 당연히 아닙니다.
이를 모르고 사용하시는 분들도 많지만, 각각의 버전 정보는 MikroTik 장비에서 중요한 의미를 가지므로 이해하면 큰 도움이 됩니다.
시스템 소프트웨어 구분
미크로틱 RouterOS 장비는 크게 두 가지 시스템 소프트웨어로 구동됩니다.
RouterOS
RouterBOARD 장치용Linux 기반 OS 및 라우팅 소프트웨어
RouterBOOT
RouterBOARD 장치용부트로더 및 펌웨어
부팅시 RouterOS 구동 및 장치의 Low-Level 설정 제어
RouterBOARD의 의미
소프트웨어 버전 확인하기
RouterOS 버전 확인하기
WinBox 우측 메뉴에서 System - Resource를 순서대로 누릅니다.
A. Version
현재 설치 및 구동 중인 RouterOS의 버전과 출시 정보가 표시됩니다.
B. Factory Software (중요)
해당 장치가지원하는 가장 오래된 버전을 표시합니다.
해당 장치는 반드시 해당 버전과 동일하거나 이후에 출시된RouterOS만 설치할 수 있습니다.
이는 해당 기종에 맞는 드라이버나 여러 리소스 지원이 추가된 버전의 RouterOS가 필요하기 때문이며, 동일 모델이라도 하드웨어 리비전에 따라서 개정 사항이 반영된 OS 및 부트로더가 필요하기 때문입니다.
인텔 8세대 이후의 컴퓨터에서 윈도우 XP나 7을 지원하지 않는 것처럼, 미크로틱 장비 또한 구동할 수 있는 구형 OS 버전에 한계가 있습니다.
설치된 패키지(Package) 종류와 버전 확인하기
1. WinBox 좌측 메뉴에서 System - Packages를 차례대로 누릅니다.
2. Package List 창이 표시되며, 여기서 RouterOS를 크게 두 가지 패키지로 구분할 수 있습니다.
A. routeros - Main Package / System Package (시스템 패키지)
RouterOS의필수 시스템 패키지입니다.
해당 장치의 CPU 아키텍처에 따라 구분되어 제공됩니다. (arm / arm64 / tile / mmips / mipsbe 등)
v7.12까지는 와이파이 제어 인터페이스가 wifiwave2라는 추가 패키지로 지원되었지만, v7.13부터는 시스템 패키지에 통합되어 WiFi 메뉴로 제공됩니다.
B. Extra Packages (추가 패키지)
RouterOS의기능 추가를 위한 선택형 패키지입니다.
Extra Package는 각 기능에 특화되어 개별 패키지로 제공되며, 사용자 필요나 용도에 따라 별도 설치할 수 있습니다.
예를 들어 Container 패키지를 설치하면 RouterOS에서 리눅스 컨테이너 기능이 지원되고, User Manager 패키지를 설치하면 RouterOS에 중앙 집중식 인증 서버(RADIUS)를 구축할 수 있으며, Zerotier 패키지를 설치하면 제로티어 엔드포인트 기능이 추가됩니다.
여기서 주의해야 할 부분은, 언제나각 시스템 패키지 버전에 맞는 추가 패키지가 제공 및 배포된다는 것입니다.
예를 들어 7.15 버전의 시스템 패키지와 및 추가 패키지가 설치된 라우터를 7.15.2로 업그레이드 하려면 반드시해당 버전의 시스템 패키지와 추가 패키지 파일을 모두라우터에 업로드 해야 합니다.
또한다른 버전의 추가 패키지만 설치하는 것도 불가능하므로 반드시 설치된 시스템 패키지와 동일한 버전의 추가 패키지를 다운로드하여 설치해야 합니다.
그렇지 않다면 설치 또는 업그레이드 절차가 거부되고, 기존의 패키지가 그대로 유지됩니다.
RouterBOOT 버전 확인하기
WinBox 우측 메뉴에서 System - RouterBOARD를 순서대로 누릅니다.
C. Factory Firmware
공장 제조시 해당 장치에 내장시킨백업 부트로더(RouterBOOT)의 버전입니다.
D. Current Firmware
현재 설치되어 사용 중인 RouterBOOT의 버전입니다.
E. Upgrade Firmware
현재 설치된 버전과 다른 RouterBOOT 펌웨어가 발견되면 해당 버전을 표시합니다.
Factory Firmware와 Current Firmware 버전이 서로 다른 경우
새로 구매한 장비라도 Factory Firmware와 Current Firmware의 버전이 서로 다를 수 있습니다.
Current Firmware는 기설치된 RouterOS와 동일한 버전으로 설치되며, Factory Firmware는 해당 장치에서 오랜 시간 검증된 버전으로 설치하여 출하하기 때문입니다.
현재 사용 중인 부트로더인 Current Firmware는 사용자가 원할 때 얼마든지 업그레이드 또는 다운그레이드 할 수 있지만, 이와 다르게Factory Firmware는 자유롭게 업그레이드 할 수 없습니다.
비교적 최근(2022년)에 Factory Firmware 업그레이드가 허용된 사례는 '보호된 부트로더(Protected)' 기능을 지원하기 위해서 였는데, 이 또한 최근 생산/출하되는 기기에는 해당 없으며 특별한 소정의 절차가 필요합니다.
해당 절차를 요약하면, Factory Firmware가 v7.6 미만 또는 v6.x 버전인 기종에서 Factory Firmware 쓰기 제한이 해제된 특정 버전(v7.6 또는 v6.49.7)의 RouterOS를 설치한 뒤 별도의 범용 패키지로 업그레이드하는 것입니다.
따라서 이미 설치된 Factory Firmware를 변경하는 경우는 드물며, 현재 부트로더가 손상되었을 때 사용되는 보루에 가까우므로 애초에 업그레이드 할 필요가 없습니다.
RouterBOOT를 업그레이드 해야 하나요?
모든 RouterOS 패키지에는해당 버전에 맞는 RouterBOOT 부트로더(펌웨어)를 포함하여 제공됩니다.
예를 들어, RouterOS v7.16.2 버전의 npk 패키지에는 이미 v7.16.2 버전의 RouterBOOT가 함께 포함된 것입니다.
그러나 새로운 RouterBOOT는 RouterOS 업그레이드 과정에서자동 적용되지 않으며 항상 개별 적용해야 합니다.
'신규 펌웨어를 함께 제공하지만 설치는 개별'이라는 부분을 이해하기 어려우실 수 있으나, 윈도우 업데이트와 바이오스 업데이트가 서로 구분되는 것처럼 RouterOS와 RouterBOOT 또한 서로 다르게 구분해야 합니다.
또한, 반드시 두 버전이 같아야 하는 것은 아닙니다.
대부분 OS와 부트로더의 버전이 서로 다르더라도 문제 없이 사용할 수 있기 때문에 오히려 RouterBOOT의 존재를 모르거나 업그레이드 필요성을 느끼지 못하는 분들도 있습니다.
그럼에도 RouterBOOT 업그레이드를 권장하는 이유는 무엇일까요?
아래는 RouterOS v7의 변경 사항 중 일부입니다.
What's new in 7.10 (2023-Jun-15 08:17):
*) routerboard - fixed memory test on CCR2116-12G-4S+ ("/system routerboard upgrade" required);
*) routerboard - improved RouterBOOT stability for Alpine CPUs ("/system routerboard upgrade" required);
*) routerboot - increased "preboot-etherboot" maximum value to 30 seconds ("/system routerboard upgrade" required);
What's new in 7.11 (2023-Aug-15 09:33):
*) routerboard - fixed "gpio-function" setting on RBM33G ("/system routerboard upgrade" required);
*) routerboard - improved RouterBOOT stability for Alpine CPUs ("/system routerboard upgrade" required);
*) routerboard - removed unnecessary serial port for netPower16P and hAP ax lite devices ("/system routerboard upgrade" required);
*) routerboot - increased etherboot bootp timeout to 40s on MIPSBE and MMIPS devices ("/system routerboard upgrade" required);
What's new in 7.16 (2024-Sep-20 16:00):
*) routerboard - improved Etherboot stability for CRS320-8P-8B-4S+ device ("/system routerboard upgrade" required);
*) routerboard - improved Etherboot stability for IPQ-40xx devices ("/system routerboard upgrade" required);
*) routerboot - improved boot process ("/system routerboard upgrade" required);
복사
새로운 버전의 RouterBOOT에는일반적으로 RouterBOARD의 전반적인 동작 안정성을 위한 개선 사항이 포함됩니다.
또한 변경 사항에 명시된 개선 사항 외에도 명시하지 않은 개선 사항이 있을 수 있는데, 경험상 이러한 차이는 RouterOS v6에서 v7 전환이 이루어지던 초기부터 과도기(v7.8 출시 이전까지)에 꽤나 잦았습니다.
예를 들면 v7.x로 업그레이드 후 라우터 부팅이 오래 걸리거나 중간에 비정상 재부팅 되는 문제가 발생했는데, RouterBOOT까지 업그레이드하면 증상이 없어졌지만 변경 사항에서 관련 내용을 별도 명시한 부분은 없었습니다.
따라서 MikroTik에서는 Current Firmware와 Upgrade Firmware의 버전이 서로 다른 경우 버전이 일치하도록 RouterBOOT 업그레이드를 권장하고 있고, 저 또한 Changelog에 특별히 명시된 부분이 없더라도 OS 업그레이드 후 습관처럼 함께 적용하고 있습니다.
RouterOS 업그레이드하기
RouterOS를 업그레이드 하는 방법은 크게 5 가지로 구분할 수 있습니다.
표준 업그레이드 (최신, 간편)
클릭 몇 번만 누르면 간편하게 최신 버전으로 업그레이드할 수 있는 표준 방법입니다.
수동 업그레이드 (직접 파일 업로드)
사용자가 원하는 버전의 RouterOS를 라우터에 업로드하여 업그레이드합니다.
자동 업그레이드 (회사/학교 등 중대규모 또는 폐쇄망 환경용)
자동/로컬 업그레이드
미크로틱 라우터 중 하나를 업데이트 서버로 지정하고 다른 라우터에서 이를 다운로드할 수 있습니다.
업그레이드 서버 라우터에 원하는 버전의 파일을 직접 업로드하거나 미러 서버로부터 자동 다운로드할 수 있으며, 주로 폐쇄망 환경에서 활용됩니다.
OS 버전에 따라 System 메뉴에 Auto Upgrade 또는 Packages - Local Upgrade에 표시됩니다.
Dude로 업그레이드
MikroTik의 중앙 집중식 네트워크 모니터링 툴인 Dude에서 업그레이드 서버로 활용 및 특정 라우터를 업그레이드 시킬 수 있습니다.
Netinstall (라우터 포맷 및 완전한 OS 재설치)
etherboot 모드로 진입한 라우터를 컴퓨터와 직접 연결해야 하며, Netinstall 소프트웨어로 깨끗하게 포맷 & 재설치할 수 있습니다.
표준 또는 수동 업그레이드 후 예기치 못하게 오동작하는 경우 Netinstall로 완전히 재설치하면 해결되는 사례가 종종 있습니다.
Resources의 Bad Block 값이 5%를 초과한 경우, Netinstall로 라우터/스위치의 OS를 다시 설치해야 합니다. 이는 설치 과정에서 mtd로 flash erase를 거치면서 마킹된 불량 블록 정보가 갱신되기 때문입니다. (불량 블록을 없앨 수는 없습니다. 단지 마킹 테이블을 갱신하여 해당 위치에 데이터를 쓰지 않도록 피하는 것입니다.)
여기서는 RouterOS의표준 및 수동 업그레이드 방법만 설명합니다.
자동 및 Netinstall을 설명하려면 개별 가이드 작성이 필요한 분량이 발생하므로 건너뛰었으며, 아래 공식 가이드를 참고하시기 바랍니다.
WinBox에서 매우 간편하게 최신 버전의 RouterOS로 업그레이드 하는 방법을 설명합니다.
기본적으로 RouterOS에 추가 패키지가 설치된 경우, 업그레이드하려면 해당 버전의 추가 패키지 파일까지 함께 넣어야 합니다.
그러나 표준 업그레이드 기능을 사용하면설치된 추가 패키지의 최신 버전까지'알아서' 다운로드 및 설치해주므로 매우 쉽게 적용할 수 있습니다.
1. WinBox 좌측 메뉴에서 System - Packages를 차례대로 누르면 표시되는 Package List 창에서 우측의 Check For Updates를 누릅니다.
2. Check For Updates 창이 표시됩니다.
Channel : 소프트웨어 배포판 채널을 선택합니다.
Development : 신규 변경 사항을 적용하여 비정기적으로 출시하는 개발용 알파 버전입니다.
Testing : 출시 후보(RC) 중 하나이며, 수 주마다 출시되는 베타 버전이므로 '변경사항 테스트' 목적에 적합하며 프로덕션 목적으로는 권장하지 않습니다.
Stable : 새로운 기능과 수정 사항을 포함한 안정적인 버전이며, 수 개월마다 출시됩니다. (권장)
Long-term : Stable 버전에서 장기간 검증된 출시판에 대해 보안 및 버그 패치 등 중요한 수정 사항만 적용하여 출시됩니다. (실제 운용 환경에서 권장) 단, 현재 RouterOS v7에서는 LTS 채널이 없으므로 사용할 수 없습니다.
Version : 현재 설치된 버전과 최신 버전 정보를 표시합니다.
Changelogs : 선택한 채널에 출시된 최신 버전의 변경 사항을 표시합니다.
Download: 최신 버전의 RouterOS 패키지를 라우터에 다운로드 합니다.
설치된 추가 패키지가 있는 경우 해당 패키지의 최신 버전까지 알아서 다운로드 됩니다.
다운로드가 완료되더라도 설치는 하지 않으며, RouterOS 재부팅시 설치됩니다.
Download & Install: 최신 버전의 RouterOS 패키지를 라우터에 다운로드 후 자동 재부팅하여 설치합니다.
설치된 추가 패키지가 있는 경우 해당 패키지의 최신 버전까지 알아서 다운로드 및 설치됩니다.
Download 또는 Download & Install을 누르면 아래 이미지와 같이 진행률이 표시되며, 최신 버전의 시스템 및 추가 패키지를 임시 공간에 다운로드 합니다.
여기서 중요한 부분은Download와 Download & Install 명령간의 차이입니다.
1. Download를 누르면 최신 패키지를 라우터에 '다운로드' 하지만, 자동으로 설치되지는 않습니다.
다운로드된 패키지는사용자가 원할 때WinBox 좌측 메뉴 - System - Reboot을 눌러소프트 리부트 작업을 수행해야재부팅되며 비로소 설치됩니다.
라우터를 재부팅하면 그 시간 동안 모든 링크가 끊기므로 통신 장애가 발생하고, 중규모 이상의 네트워크 환경에서는 아무리 VRRP로 이중화가 되었다고 하더라도 링크 복구 및 일관된 라우팅 테이블의 갱신(컨버전스) 등의 시간이 소요되므로 매우 부담스러운 일입니다.
따라서 RouterOS를 업그레이드 하고 싶지만, 당장 재부팅하기에는 곤란한 상황이나 주기적으로 라우터를 재부팅하는 사용자에게 유용합니다.
2. Download & Install를 누르면 최신 패키지를 다운로드하고, 완료되면자동으로 재부팅 및 설치됩니다.
이는 당장 라우터를 재부팅하더라도 문제 없는 상황에서 매우 간편하고 유용합니다.
상기된 Download 후 수동 재부팅 또는 Download & Install로 자동 설치하여 표준 업그레이드를 수행하면 RouterOS를 매우 간단하게 최신 버전으로 유지할 수 있습니다!
참고 : RouterOS 출시 과정 순서도
수동 업그레이드 하기 (버전 선택 가능)
원하는 버전의 RouterOS 패키지를 직접 라우터/스위치에 업로드하여 업그레이드할 수 있습니다.
참고 : 저사양 기기에서 수동 업그레이드시 주의하세요.
자동 또는 수동 업그레이드 진행시, 패키지 파일는 램디스크에 임시 저장됩니다.
RouterOS의 메인 패키지는 10MB에 불과하지만 무선 패키지 등의 추가 패키지를 포함할 때 15MB 전후의 크기가 되는데, 여기서 문제가 발생할 수 있습니다.
hAP lite 등의 저사양 기기의 경우 RAM 용량이 32MB에 불과하며, 그외 64MB 이하인 기기라면 가용 메모리 용량이 크기 않기 때문에 필요한 파일을 업로드 할 수 없거나 업로드 하더라도 시스템이 메우 불안정해지므로 실패할 가능성이 있습니다.
이런 경우 재부팅 등으로 RAM 공간을 충분히 확보한 뒤에 진행하거나, 표준/수동 업그레이드보다는 Netinstall로 완전히 재설치하시기 바랍니다.
올바른 RouterOS 패키지를 다운로드하려면반드시 설치하려는 라우터의 CPU 아키텍처 종류를 알아야 합니다.
1. WinBox 좌측 메뉴에서 System - Resources를 차례대로 누르고, 표시된 Resources 창에서 'CPU' 항목의 정보를 확인합니다.
모델에 따라 arm / arm64 / tilegx (=tile) / mmips / mipsbe / x86(CHR) 등의 값이 표시될 것입니다.
2. 상기된 [설치된 패키지(Package) 종류와 버전 확인하기] 섹션에서 소개된 방법으로 시스템에 설치된 추가 패키지가 있는지 확인합니다.
위 이미지를 기준으로, 현재 RouterOS를 상위 버전으로 업그레이드 하려면 상위 버전의 ups, user-manager, zerotier 패키지 파일도 함께 준비해야 됩니다.
[참고] 와이파이(Wi-Fi) 기능이 포함된 모델의 추가 패키지 선택 요령
현재 사용 중인 라우터가와이파이 지원 기종이라면 아래 내용을 꼭 읽어보시기 바랍니다.
위 이미지는 hAP ax3의 패키지 목록인데, 시스템 패키지 아래에 wifi-qcom이라는 추가 패키지가 설치되어 있습니다.
이는 Wi-Fi 6 지원 모델의 무선 드라이버 패키지이며, 와이파이 동작을 위해서는 해당 추가 패키지가 반드시 필요합니다.
RouterOS v7.13을 기점으로 CAPsMAN과 무선 드라이버 패키지가 완전히 분리되어필요한 무선 드라이버 패키지를 설치해야만 무선(와이파이) 인터페이스를 올바르게 인식할 수 있습니다.
[wireless] 패키지가 필요한 경우
MIPSBE 타입 CPU가 적용된 모든 레거시 무선 모델에 해당
hAP, hAP lite, hAP AC, hAP AC lite, cAP lite 등
상기 모델 및 wireless 패키지는 WPA3 인증이나 802.11k/v/r 로밍, MU-MIMO, OFDMA 등 wave2 이후 주요 기능을 지원하지 않습니다.
[wifi-qcom-ac] 패키지가 필요한 경우
ARM CPU를 적용한 Wi-Fi 5 지원 기종에 해당
Audience
Audience LTE kit
Chateau (모든 D53 파생 모델)
RB4011iGS+5HacQ2HnD-IN (5GHz 전용)
hAP ac2
hAP ac3
cAP ac
cAP XL ac
LDF 5 ac
LHG XL 5 ac
LHG XL 52 ac
NetMetal ac^2
mANTBox 52 15s
wAP ac (RBwAPG-5HacD2HnD)
SXTsq 5 ac 등
[wifi-qcom] 패키지가 필요한 경우
모든 Wi-Fi 6 지원 모델
hAP ax2
hAP ax3
hAP ax lite
cAP ax
wAP ax
Chateau PRO ax 등
위 내용을 정리한다면, 아래와 같습니다.
hAP ac 에서 와이파이를 사용하려면 반드시 'wireless' 패키지를 추가로 설치해야 합니다.
hAP ac2 에서 와이파이를 사용하려면 반드시 'wifi-qcom-ac' 패키지를 추가로 설치해야 합니다.
hAP ax3 에서 와이파이를 사용하려면 반드시 'wifi-qcom' 패키지를 추가로 설치해야 합니다.
참고로 RB4011iGS의 와이파이 모델 (RB4011iGS+5HacQ2HnD-IN)은 v7.13부터 2.4G와 5G 무선을 동시에 사용할 수 없습니다.
이는AR9582(2.4G) + QCA9984(5G)라는 이상한 패브릭 디자인 때문인데, AR9582는 레거시 wireless 패키지가 필요하고 QCA9984는 wave2용 wifi-qcom-ac 패키지가 필요하지만 두 패키지와 무선 장치는 더 이상 양립할 수 없으므로두 주파수 중 하나만 사용할 수 있습니다.
VMware, Proxmox 등 가상화 환경에서 헤놀로지로 DVA모델을 올린 후 SurveillanceStation을 사용하다보면 어느순간 용량이 무럭무럭 늘어나서 하드디스크가 꽉 차는 모습을 볼 수 있습니다.
이미 해결을 한 상태라 스크린샷을 찍지는 못했으나..
카메라 3개를 90일 보관설정하고 데이터 보관을 하고 있는데 2TB의 하드디스크가 용량 부족이 뜹니다.
이리저리 검색해봐도 순정이 아니기도 하고.. 네이티브 설치하신 분들께는 나오지 않는 증상이라 자료를 찾기 어려웠습니다.
일단 원인은 그래픽카드를 패스쓰루시키지 않아 서베일런스 스테이션 패키지 폴더 내의 특정 파일이 증식하는 문제입니다.
1. 그래픽카드를 패스쓰루하시면 해결됩니다.
2. 서베일런스 스테이션의 Local Display를 사용 중지시키면 됩니다.
이미 만들어진 파일은 설치 경로에서 파일을 찾아 삭제하면 됩니다.
SSH로 접속한 후 sudo -i를 입력해 루트권한을 획득한 후에 아래 폴더로 이동합니다.
/[패키지가 설치된 볼륨]/@appstore/SurveillanceStation/local_display/.config/chromium-local-display/BrowserMetrics
*는 와일드카드, 즉 모든 문자를 대체합니다.
*.pem은 .pem으로 끝나는 모든 파일을 의미합니다.
rm *.pem 으로 삭제하셔도 되고 rm * 하셔도 됩니다. 어짜피 저 폴더 안에는 BrowerserMetrics-*.pem 파일만 존재합니다.
만약, 이미 많이 생성되어 삭제가 어렵다면..파일명을 쪼개서 삭제해주세요.
rm *62F*.pem 이런식으로 중간의 번호부분 일부를 잡아서 지워버리면 됩니다.
# SSH 접속
$sudo -i
# 패스워드 입력
# 볼륨 이동 volume1인 경우 아래와 같이 입력합니다.
cd /volume1/@appstore/SurveillanceStation/local_display/.config/chromium-local-display/BrowserMetrics
# 파일 삭제
rm *
# 만약, 파일이 너무 많다는 오류가 나오는 경우
# rm BrowerserMetrics-62*.pem 과 같은 형태로 일부만 잡아 삭제
docker-compose up -d 로 docker-compose.yml 파일 내용을 실행 시 아래와 같이 오류가 발생을 확인하면
$ docker-compose up -d
[+] Running 1/2
✔ Network mstream_default Created 0.1s
⠹ Container mstream Starting 0.2s
Error response from daemon: failed to create task for container: Unimplemented: failed to start shim: start failed: unsupported shim version (3): not implemented
아래 명령어 입력 후
$ systemctl restart containerd
다시 도커 실행하면 해결완료
$ docker-compose up -d
[+] Running 1/1
✔ Container mstream Started
##
## Arch Linux repository mirrorlist
## Filtered by mirror score from mirror status page
## Generated on 2021-11-29
##
## South Korea
#Server = https://ftp.harukasan.org/archlinux/$repo/os/$arch
## South Korea
#Server = https://mirror.premi.st/archlinux/$repo/os/$arch
curl 명령어 사용 시, 위와 같은 결과가 나온다.
필요 없는 정보들을 없애기 위해 sed 명령어를 사용하면 아래와 같은 결과가 출력된다.
Server = https://ftp.harukasan.org/archlinux/$repo/os/$arch
Server = https://mirror.premi.st/archlinux/$repo/os/$arch
위에서 출력된 미러리스트를 빠른 순으로 정렬하기 위해 rankmirrors 명령어를 사용한다.
rankmirrors 명령어는 pacman-contrib 패키지에 포함되어 있다.
- n <NUM> 옵션
- NUM 개수만큼 빠른 순으로 미러를 출력한다.
tee 명령어는 파이프를 통해 넘어온 결과를 출력하는 동시에 파일에 쓴다.
이때, /etc/pacman.d/mirrorlist 파일은 root 권한이 필요하므로, sudo를 사용한다.
Windows를 시작하지 못했습니다. 최근 하드웨어 또는 소프트웨어 변경이 원인일 수 있습니다.
문제를 해결하려면 다음을 수행합니다.
Windows 설치 디스크를 삽입하고 컴퓨터를 다시 시작합니다.
언어 설정을 선택하고 다음을 클릭합니다.
컴퓨터 복구를 클릭합니다.
이 디스크가 없는 경우 시스템 관리자 또는 컴퓨터 제조업체에 문의하여 도움을 받으세요.
상태: 0xc000000e
정보: 필요한 디바이스에 액세스할 수 없으므로 부팅 선택이 실패했습니다.
이 장의 목표는 시스템 디스크 공간을 통합하고 스왑 파티션과 local-lvm 파티션 계정을 로컬 파티션에 통합하는 것입니다.
PVE와 함께 제공되는 Shell 기능을 엽니다.
다음과 같이하세요
pve에서 local-lvm 파티션 제거
lvremove pve/data
lvextend -l +100%FREE -r pve/root
볼륨 제거 여부 확인 [y/n] y를 입력하세요.
root@rh1288v3:~# lvremove pve/data 활성 논리 볼륨 pve/data를 제거하시겠습니까? [y/n]: y 논리 볼륨 "data"가 성공적으로 제거되었습니다. FREE -r pve/root 논리 볼륨 pve/root의 크기가 37.45GiB(9588 익스텐트)에서 101.82GiB(26067 익스텐트)로 변경되었습니다.resize2fs 1.47.0(2023년 2월 5일)파일 시스템 크기가 조정되었습니다./dev/mapper/pve-root는 /에 마운트됩니다. 온라인 크기 조정 필요old_desc_blocks = 5, new_desc_blocks = 13/dev/mapper/pve-root의 파일 시스템 길이는 이제 26692608(4k) 블록입니다.
Data Center-Storage-local-lvm을 클릭하고 제거를 클릭한 후 확인합니다.
pve와 함께 제공되는 스왑 파티션을 제거하십시오.
기본 스왑 파티션은 시스템 디스크에 생성되므로 시스템 디스크의 작동에 영향을 미치고 시스템 디스크의 수명을 소모하므로 삭제하는 것이 좋습니다.
(다음 기사에서는 Optane M10 16G를 스왑 캐시 디스크로 사용합니다)
쉘에 들어가서 다음 명령을 입력하십시오
swapoff -a
lvremove /dev/pve/swap
lvresize -l +100%FREE/dev/pve/root
예
root@RH1288V3:~# swapoff -a root@RH1288V3:~# lvremove /dev/pve/swap 활성 논리 볼륨 pve/swap을 제거하시겠습니까? [y/n]: y 논리 볼륨 "swap"이 성공적으로 제거되었습니다. root@RH1288V3:~# lvresize -l +100%FREE /dev/pve/root 논리 볼륨 pve/root의 크기가 101.82 GiB(26067 익스텐트)에서 109.82 GiB(28115 익스텐트)로 변경되었습니다. 논리 볼륨 pve/root의 크기가 조정되었습니다.
*************************************************************
* !!! WARNING !!! *
* All Connections are monitored and recorded *
* Disconnect IMMEDIATELY if you are not an authorized user! *
*************************************************************
12. sudo vi /etc/issue.net
*************************************************************
* !!! WARNING !!! *
* All Connections are monitored and recorded *
* Disconnect IMMEDIATELY if you are not an authorized user! *
*************************************************************
\S
Kernel \r on an \m
13. sudo dnf install chrony
sudo vi /etc/chrony.conf
server time.google.com iburst
server time.nist.gov iburst
server time.bora.net iburst
server time.kriss.re.kr iburst
server time.windows.com iburst
DocumentRoot 폴더는 웹문서가 위치하는 디렉토리로 불필요한 파일이 있을시에 삭제 하는 것이 좋다. 따라서 DocumentRoot 디렉토리의 경로에 있는 파일들을 삭제해주자. (rm -rf)
또한 Apache 설치시 기본적으로 설치되는 CGI 스크립트를 제거한다. CGI 스크립트는 해킹에 이용될 수 있기때문이다.
/var/www/manual 또는 /var/www/cgi_bin은 삭제해주자.
리눅스 웹서버 정보 숨기기
1. ServerTokens
브라우저가 보낸 요청에 아파치 서버는 응답 패킷을 보내는데 이때 패킷의 Header에는 서버의 정보가 나타난다. 이는 서버 버전별 해킹을 시도할 수 있는 단서를 줄 수 있기 때문에 서버정보를 숨겨야한다.
서버정보는 httpd.conf파일에서 ServerToken 값을 변경해준다.
먼저 [curl -I 웹서버주소]로 응답 헤더의 매세지를 살펴보자. 현재 서버와 OS의 정보를 알려주어 보안에 취약한 상태이다. (현재 상태는 ServerToken이 기본값인 OS 상태이다.)
이를 해결하기 위해 httpd.conf에 있는 ServerTokens 값을 변경해주어야 한다.
ServerTokens 값에 따라 노출되는 정보를 선택할 수 있다.
ServerTokens 값
정보
Prod
웹서버의 이름만 알려준다. Apache
Major
웹서버의 이름과 Major 버전만 알려준다. Apache2
Minor
웹서버의 이름과 Minor 버전까지 알려준다. Apache2.2
Min
웹서버 이름과 Minimum버전까지 알려준다. Apache2.2.2
OS
웹서버 이름, 버전 운영체제까지 알려준다.(기본값)
Full
모든 정보를 알려준다.
httpd.conf 파일에서 ServerTokens 값을 가장 낮은 단계의 값인 Prod로 변경해주자.
이후 Apache 웹 서버를 restart해주고 헤더값을 다시 확인한다. 아래의 그림과 같이 서버 정보가 Apache만 나오는 것을 확인 할 수 있다.
2. ServerSignature
Apache 웹서버에 접속할 때 오류가 발생하면 404, 403 에러가 발생한다. 이때 아파치의 버전 정보와 포트가 나오게 되는데 해커가 악용할 수 있기 때문에 보안상으로 위험하다. 이러한 오류에 관여하는 설정은 httpd.conf 에 ServerSignature이다. 현재는 ServerSignature 값이 Off인 상태이다.
이러한 정보노출을 방지하기 위해 ServerSignature를 Off로 변경하여야한다.
이후 Apache 웹 서버를 restart해주고 헤더값을 다시 확인한다. 아래의 그림과 같이 서버 정보와 Port 정보가 나오지 않는 것을 확인할 수 있다..
디렉토리 리스팅
웹서버의 DocumentRoot 폴더에 가장 메인이 되는 index.html(설정에 따라 달라질 수 있다.)이 없는 경우 DocumentRoot 폴더에 있는 파일들을 탐색기 형태로 보여준다. 이는 소스코드, 스크립트 파일이
유출될 수 있으므로 점검해야 한다.
디렉토리 리스팅을 막기 위해 아래의 그림에 있는 Indexes를 제거 해야한다.
심볼릭 링크 차단
심볼릭 링크란 PC의 바로가기와 동일하다. 바로가기를 클릭하면 원본데이터를 불러와 사용할 수 있게 해주는 것 처럼 웹서버에서도 심볼릭 링크를 통해 파일 시스템에 있는 디렉토리에 접근할 수 있게 된다.
디렉토리 리스팅 처럼 디렉토리가 보이는 경우 심볼릭 링크를 root 디렉토리에 설정하면 누구나 파일시스템에 접근 가능하게 되는 것이다.
이를 차단하기 위해 httpd.conf에 FollowSymLinks 옵션을 삭제한다.
위의 그림에 나와있는 FollowSymLinks 옵션을 지우고 웹서버를 재시작하면 심볼릭 링크를 이용하여 파일시스템에 접근 할 수 없게 된다.
※ /etc/securetty : Telnet 접속 시 root 접근 제한 설정 파일 /etc/securetty파일 내 *pts/x 관련 설정이 존재하는 경우 PAM 모듈 설정과 관계없이 root 계정 접속을 허용하므로 반드시/etc/securetty파일에서 pts/x 관련 설정 제거 필요
또는
#echo > /etc/securetty
위에 제시한 내용으로 설정되어 있을 경우 root 원격 접속이 차단됨 / 내용 설정에 대해서는 아래의 보안설정방법을 참고함
결과
Last login: Fri Jan 7 14:27:23 2022 from 192.168.230.1
[root@rhel7 ~]# telnet 192.168.230.143
Trying 192.168.230.143...
Connected to 192.168.230.143.
Escape character is '^]'.
Red Hat Enterprise Linux Server release 6.10 (Santiago)
Kernel 2.6.32-754.el6.x86_64 on an x86_64
rhel6 login: root
Password:
Login incorrect
[SSH 서비스 사용시]
Step 1) vi 편집기를 이용하여/etc/ssh/sshd_config파일 열기 Step 2) 아래와 같이 주석 제거 또는, 신규 삽입
(수정 전) #PermitRootLogin Yes
(수정 후) PermitRootLogin No
루트 계정에 대한 액세스를 추가로 제한하기 위해 관리자는/etc/securetty파일을 편집하여 콘솔에서 루트 로그인을 비활성화할 수 있습니다. 기본적으로 Red Hat Enterprise Linux의/etc/securetty파일은 루트 사용자가 시스템에 물리적으로 연결된 콘솔에서만 로그인할 수 있도록 허용합니다. 루트 사용자가 로그인하지 못하도록 하려면 쉘 프롬프트에서 루트로 다음 명령을 입력하여 이 파일의 내용을 제거하십시오.
echo > /etc/securetty
KDM, GDM 및 XDM 로그인 관리자에서 securetty 지원을 활성화하려면 다음 행을 추가하십시오.
RHEL 8 이후 시스템에서 tty 장치 파일의 동적 특성으로 인해 securetty PAM 모듈은 기본적으로 비활성화되었으며 /etc/securetty 구성 파일은 더 이상 RHEL에 포함되지 않습니다. /etc/securetty는 가능한 많은 장치를 나열하므로 대부분의 경우 실질적인 효과는 기본적으로 허용되는 것이므로 이 변경은 약간의 영향만 미칩니다. 그러나 보다 제한적인 구성을 사용하는 경우 /etc/pam.d 디렉토리의 해당 파일에 pam_securetty.so 모듈을 활성화하는 행을 추가하고 새 /etc/securetty 파일을 생성해야 합니다.
RHEL 8.2 릴리스에서pam_faillock은 이제/etc/security/faillock.conf에 있는faillock.conf구성 파일에서 설정을 읽을 수 있습니다. 이 페이지의 아래 참고 사항을 참조하십시오.
메모: /etc/pam.d/xxxx-auth의pam_faillock.so행에 있는 옵션은faillock.conf의 설정을 재정의합니다. faillock.conf에서 구성하려면 다음과 같이/etc/authselect/custom/PROFILE/xxxx-auth를 수정하십시오.
7. 사용자 정의 프로필 디렉토리/etc/authselect/custom/password-policy/에서 사용할 수 있는 전역 PAM 구성 파일system-auth및password-auth에서 원하는/사용자 정의 변경을 수행합니다. 변경 사항이 적용되면 다음 명령을 사용하여 적용합니다.
# authselect apply-changes
- 파일에 변경 사항이 기록되었는지 확인합니다.
8. 사용된 비밀번호의 이력(재사용할 수 없는 이전 비밀번호의 수)을 유지합니다. /etc/authselect/custom/password-policy/system-auth및/etc/authselect/custom/password-policy/password-auth파일에 다음 줄을 삽입합니다(pam_pwquality.so 줄 뒤에)
9. 암호 복잡성을 위해 루트를 적용합니다. /etc/authselect/custom/password-policy/system-auth및/etc/authselect/custom/password-policy/password-auth파일의 암호 섹션 아래pam_pwquality.so행에 다음 옵션을 삽입/추가합니다.
enforce_for_root
참고: 변경한 후 변경 사항을 적용하려면 authselect apply-changes를 실행해야 합니다.
10./etc/security/pwquality.conf파일에서 적절한 옵션을 설정하십시오.
minlen = 9 새 암호에 대해 허용되는 최소 크기입니다. 여기에는 크레딧(기본값인 비활성화되지 않은 경우 1개 추가)이 포함됩니다.
dcredit = -1 비밀번호에 필요한 숫자가 있어야 하는 최소 크레딧
ucredit = -1 비밀번호에 대문자를 사용하기 위한 최소 크레딧입니다.
lcredit = 1 비밀번호에 소문자를 사용할 수 있는 최대 크레딧입니다.
ocredit = 1 암호에 다른 문자를 포함할 수 있는 최대 크레딧입니다.
minclass = 1 새 비밀번호에 필요한 최소 문자 클래스 수.
maxrepeat = 2 새 비밀번호에서 연속으로 허용되는 동일한 문자의 최대 수입니다.
maxclassrepeat = 2 새 비밀번호에서 동일한 클래스의 연속 문자가 허용되는 최대 수입니다.
difok = 5 새 비밀번호에 사용할 수 있는 최대 문자 수(이전 비밀번호에 비해..), root는 이전 비밀번호를 묻지 않으므로 적용되지 않음
크레딧 값 > 0 : 새 비밀번호에 각 문자를 포함하기 위한 최대 크레딧입니다. 크레딧 값 < 0 : 새 비밀번호에 각 문자를 포함하는 데 필요한 최소 필수 크레딧입니다. 신용 값 = 0: 새 암호에 해당 문자 클래스를 포함해야 하는 필수 요구 사항이 없습니다.
3번의 실패한 시도 후에 루트가 아닌 사용자를 잠그고 10분 후에 해당 사용자의 잠금을 해제하려면 /etc/pam.d/system-auth 및 /etc/pam.d/password-auth의 auth 섹션에 두 줄을 추가합니다. 파일. 편집 후 두 파일의 전체 인증 섹션은 다음과 같아야 합니다.
“wheel” 그룹 및 그룹 내 구성원 존재 여부 확인 /etc/group wheel:x:10:root,admin
/etc/pam.d/su
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid # 주석해제 시 해당 그룹사용자는 무조건 신뢰(패스워드확인 안함)
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid # 주석해제 시 해당 그룹사용자는 패스워드 확인 후 신뢰
auth include system-auth
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session optional pam_xauth.so
PASS_MAX_DAYS 99999 패스워드 사용 가능 기간(일)
PASS_MIN_DAYS 0 패스워드 변경 최소 기간(일)
PASS_MIN_LEN 5 패스워드 최소 길이
PASS_WARN_AGE 7 패스워드 기간 만료 경고 기간(일)
불필요한 계정 제거
/etc/passwd파일 내 계정확인 후 제거
관리자 그룹에 최소한의 계정 포함
/etc/group내 root:x:0:root 확인
계정이 존재하지 않는 GID 금지
/etc/group파일과/etc/passwd파일 비교하여 점검
동일한 UID 금지
/etc/passwd파일 내 동일한 UID가 있는지 확인
사용자 shell 점검
로그인이 불필요한 계정에/bin/false또는/sbin/nologin쉘 부여
/etc/passwd파일 내 로그인 쉘 부분인 계정 맨 마지막에 부여
Session Timeout 설정
/etc/profile파일 내
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=5000 # 히스토리 저장 갯수
HISTTIMEFORMAT="%F %T " # 히스토리 저장시 날짜 시간 같이 저장
TMOUT=300 # 세션 타임아웃 시간 설정
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL HISTTIMEFORMAT TMOUT # 환경변수 적용
RHEL v8 계열(CentOS/Oracle Linux/Rocky Linux) 부터는 이전과 같이 PAM 을 수정하여 설정하는 것을 권장하지 않습니다.
[root@chhanz-c8-vm ~]# cat /etc/pam.d/system-auth
...
# Generated by authselect on Fri Jul 16 13:13:24 2021
# Do not modify this file manually. <<<
...
추가로 RHEL v8 계열부터는 기존에 사용하던 보안 설정으로 많이 사용 되던pam_tally2module 이 deprecated 되었습니다. anthconfig로 PAM 설정이 가능하였으나, RHEL v8 계열부터authselect을 사용하도록 변경 되었습니다.
authselect이란?
authselect는 특정 프로파일을 선택하여 시스템의 ID 및 인증 소스를 설정 할 수 있는 도구입니다.
authselect사용법
Check current the profile
[root@chhan-rocky authselect]# authselect current
Profile ID: sssd
Enabled features: None
Enable feature
faillockmodule 활성화.
[root@chhan-rocky authselect]# authselect enable-feature with-faillock
Make sure that SSSD service is configured and enabled. See SSSD documentation for more information.
[root@chhan-rocky authselect]# authselect current
Profile ID: sssd
Enabled features:
- with-faillock
Create the custom profile
sssdProfile 를 base 로 한 Profile 생성.
[root@chhan-rocky authselect]# authselect create-profile -b sssd security-profile
New profile was created at /etc/authselect/custom/security-profile
Change profile
[root@chhan-rocky security-profile]# authselect select custom/security-profile
Profile "custom/security-profile" was selected.
The following nsswitch maps are overwritten by the profile:
- passwd
- group
- netgroup
- automount
- services
Make sure that SSSD service is configured and enabled. See SSSD documentation for more information.
faillockmodule 을 이용한 보안 설정
기존에pam_tally2등으로 주로 이용되던 계정 인증 실패에 대한 계정 잠금 정설이faillock으로 변경되면서 기능 활성화 및 정책 설정은 아래와 같이 해야됩니다.
faillockmodule 활성화
아래 명령을 통해faillockmodule 을 활성화 합니다.
[root@chhanz-c8-vm ~]# authselect enable-feature with-faillock
Make sure that SSSD service is configured and enabled. See SSSD documentation for more information.
[root@chhanz-c8-vm ~]# authselect current
Profile ID: sssd
Enabled features:
- with-fingerprint
- with-silent-lastlog
- with-faillock
faillock정책 설정
아래와 같이/etc/securrity/faillock.conf를 수정합니다. (Note:/etc/security/faillock.confis available frompam-1.3.1-8.el8.)
위와 같이 계정 인증 실패시faillock명령을 통해 인증 실패 현황을 파악 할 수 있습니다.
[root@chhanz-c8-vm ~]# faillock
root:
When Type Source Valid
test:
When Type Source Valid
2021-07-16 13:14:36 RHOST ::1 V
2021-07-16 13:14:39 RHOST ::1 V
2021-07-16 13:14:42 RHOST ::1 V
2021-07-16 13:14:46 RHOST ::1 V
/var/log/secure에서 위와 같이 계정 LOCK 에 대한 로그를 확인 할 수 있습니다.
...
Jul 16 13:14:46 localhost unix_chkpwd[7186]: password check failed for user (test)
Jul 16 13:14:46 localhost sshd[7184]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=::1 user=test
Jul 16 13:14:46 localhost sshd[7184]: pam_faillock(sshd:auth): Consecutive login failures for user test account temporarily locked <<<
...
실제로 4회 계정 인증 실패 후에는 계정 접근이 안되었고, 10분후에 다시 인증 시도를 할 수 있었습니다.
계정 잠금 해제
LOCK된 계정을 수동으로unlock하는 방법은 아래와 같습니다.
[root@chhanz-c8-vm ~]# faillock --reset --user test
[root@chhanz-c8-vm ~]# faillock
root:
When Type Source Valid
test:
When Type Source Valid
[참고]authselect에서 지원하는 feature (profile sssd)
Feature NameDescription
with-faillock
Lock the account after too many authentication failures.
with-mkhomedir
Create home directory on user’s first log in.
with-ecryptfs
Enable automatic per-user ecryptfs.
with-smartcard
Authenticate smart cards through SSSD.
with-smartcard-lock-on-removal
Lock the screen when the smart card is removed. Requires that with-smartcard is also enabled.
with-smartcard-required
Only smart card authentication is operative; others, including password, are disabled. Requires that with-smartcard is also enabled.
with-fingerprint
Authenticate through fingerprint reader.
with-silent-lastlog
Disable generation of pam_lostlog messages during login
with-sudo
Enable sudo to use SSSD for rules besides /etc/sudoers.
with-pamaccess
Refer to /etc/access.conf for account authorization.
8버전 부터는 pam_tally2가 더 이상 기본으로 사용되지 않으며 faillock로 이용하게 됩니다.
vi /etc/pam.d/system-auth
# Generated by authselect on Mon Jun 27 04:44:48 2022
# Do not modify this file manually.
auth required pam_env.so
# 아래 내용 추가
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600
auth required pam_faildelay.so delay=2000000
auth sufficient pam_fprintd.so
auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular
auth [default=1 ignore=ignore success=ok] pam_localuser.so
auth sufficient pam_unix.so nullok
# 아래 내용 추가
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=600
auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular
auth sufficient pam_sss.so forward_pass
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_usertype.so issystem
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
# 아래 내용 추가
account required pam_faillock.so
password requisite pam_pwquality.so local_users_only
password sufficient pam_unix.so sha512 shadow nullok use_authtok
password sufficient pam_sss.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_sss.so
audit - 사용자(일반계정) 감사를 활성화
deny - 실패 횟수, deny=5 5회 로그인 실패 시 계정 잠금
unlock_time - 계정 잠금 유지 시간, unlock_time=600 600초가 지나면 자동 해제, 설정하지 않으면 faillock를 이용하여 수동으로 잠금해제 하여야함
even_deny_root - root 계정 적용할때 사용
vi /etc/pam.d/password-auth
# Generated by authselect on Mon Jun 27 04:44:48 2022
# Do not modify this file manually.
auth required pam_env.so
# 아래 내용 추가
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600
auth required pam_faildelay.so delay=2000000
auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular
auth [default=1 ignore=ignore success=ok] pam_localuser.so
auth sufficient pam_unix.so nullok
# 아래 내용 추가
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=600
auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular
auth sufficient pam_sss.so forward_pass
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_usertype.so issystem
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
# 아래 내용 추가
account required pam_faillock.so
password requisite pam_pwquality.so local_users_only
password sufficient pam_unix.so sha512 shadow nullok use_authtok
password sufficient pam_sss.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_sss.so
# 로그인 실패 확인
faillock
maint:
When Type Source Valid
2022-06-29 08:41:27 RHOST 12.12.12.1 V
root:
When Type Source Valid
2022-06-28 13:49:45 TTY /dev/tty1 V
2022-06-28 13:17:04 TTY /dev/tty1 I
2022-06-28 13:17:09 TTY /dev/tty1 I
2022-06-28 13:49:52 TTY /dev/tty1 V
2022-06-28 13:49:57 TTY /dev/tty1 V
# 특정 사용자만 확인
faillock --user maint
maint:
When Type Source Valid
2022-06-29 08:41:27 RHOST 12.12.12.1 V
# 수동 계정 잠금 해제
faillock --user maint --reset
# 로그인 한 번이라도 실패 시 아래 경로에 기록
ls /var/run/faillock/
maint root
제가 근무하고 있는 회사는 CentOS 7을 대체하기 위한 Next OS로 상용 OS인 RHEL(Red Hat Enterprise Linux) 9를 준비하고 있습니다. 아래 내용은 RHEL9 도입을 위한 사전 체크 중 기존 CentOS 7 기반 설정에서 변경이 되는 부분에 대한 내용을 정리하였습니다.
1. 문제점
기존 CentOS7 기반으로 작성된 설정과 스크립트들을 RHEL9에 그대로 적용하여 사용하려고 한 결과 아래와 같은 문제점이 발생되었습니다.
1) RHEL8 이상 pam_tally2 미지원
RHEL8 이상부터 pam_tally2를 더 이상 지원하지 않습니다. 저는 CentOS7 기반 OS에서 pam_tally2와 pam_faillock이 선택적으로 사용이 가능하기에 pam_tally2를 사용해 왔습니다.
/etc/pam.d/system-auth 및 /etc/pam.d/password-auth에 pam_tally2 설정
2) RHEL8/9에서는 pam_faillock 사용
RHEL8/9에서는 pam_faillock을 사용해야 합니다. 하지만 RHEL7과 RHEL8/9의 pam_faillock 사용법이 다릅니다. 이에 대해서는 아래에 설명하도록 하겠습니다.
2. pam_faillock 설정
RHEL8 이상부터 계정 잠금 제어 시 사용하던 PAM 패키지의 pam_faillock 사용법이 변경되었습니다. 기존의 authconfig를 대체한 authselect를 사용하여 pam_faillock 모듈을 활성화할 수 있습니다.
1) RHEL7 pam_faillock 설정
RHEL7에서는 /etc/pam.d/system-auth 및 /etc/pam.d/password-auth에 pam_faillock을 설정합니다. 두 파일 모두 변경해야 적용됩니다.
위 RHEL7과 동일하게 설정하여 제어할 수도 있습니다. 하지만 RHEL8은 RHEL7과 달리 /etc/pam.d/system-auth 및 /etc/pam.d/password-auth를 수동으로 편집하는 것은 권장하지 않습니다. RHEL 8/9는 authselect 명령어를 사용하여 제어가 가능합니다.
명령어 예시: # authselect enable-feature with-faillock → faillock 활성화
설정 파일 : /etc/security/faillock.conf
3) RHEL9 system-auth, password-auth 파일 설정
RHEL9의 /etc/pam.d/system-auth 와 /etc/pam.d/password-auth 파일 내용은 아래와 같습니다.
[ system-auth 와 password-auth 파일 내용 ]
파일 내용 수정 후 /etc/pam.d/password-auth 화면은 아래와 같습니다. /etc/pam.d/system-auth 내용도 동일합니다.
[ password-auth 수정 후 화면 ]
※ 주의사항
이렇게 수정하는 방법은 RedHat에서 권장하는 방법이 아니므로 주의가 필요합니다.
4) /etc/security_faillock.conf 파일
/etc/security_faillock.conf 화면은 아래와 같습니다. 해당 설정에 대한 내용 확인 후 주석을 해제하여 설정하면 됩니다.
[ /etc/security/faillock.conf 파일 내용 ]
5) pam_faillock 활용
1. sexyguy 계정에 대한 실패한 로그인 정보 확인
# faillock --user sexyguy
2. sexyguy 계정 잠금 해제
# faillock --reset --user sexyguy
[ faillock 로그인 정보 확인 및 잠금해제 ]
3. 마치며
지난 리눅스 계정 잠금 임계값 설정 포스팅은 CentOS7 기준으로 작성이 되었습니다. 기존에 사용하던 설정들을 RHEL9에 적용하려다 보니 수정해야 될 부분이 조금 있었습니다. 저는 위 방법들을 토대로 스크립트를 작성할 예정입니다. 지금까지 제가 RHEL9 도입을 준비하면서, 계정 잠금 설정에는 기존에 사용하던 OS와 어떠한 차이가 있는지 정리한 내용을 포스팅했습니다.
[root@localhost faillock]#faillock test: When Type Source Valid 2020-06-16 02:02:14 RHOST 192.168.232.1 V 2020-06-16 02:02:19 RHOST 192.168.232.1 V 2020-06-16 02:02:37 RHOST 192.168.232.1 V 2020-06-16 02:05:17 RHOST 192.168.232.1 V 2020-06-16 02:05:25 RHOST 192.168.232.1 V
test2: When Type Source Valid 2020-06-16 02:08:00 RHOST 192.168.232.1 V
특정 사용자만 확인
[root@localhost faillock]# faillock --user test
수동 차단 해제
[root@localhost faillock]# faillock --user test --reset
로그인 한 번이라도 실패한 계정은 아래의 경로에 관리됨 [root@localhost faillock]#ls /var/run/faillock/ test
Red Hat Enterprise Linux에서 파생된 리눅스 배포판 CentOS가 2021년 12월 31일 기준으로 수명이 다 되었다고 합니다. CentOS는 RHEL의 소스를 기반으로 철저하게 최신 버전의 RHEL을 포킹하는데 중점을 두어 사용되었으나 이제부터는 RHEL배포 이전에 테스트 기반(Stream버전)만 지원하므로 더이상 우리가 안정적으로 사용했던 CentOS의 장점이 사라졌다.
다행스럽게 새롭게 RHEL을 포킹하는 Rocky Linux가 생겨났고, 기존 CentOS를 Rocky로 대체하는 분위기가 형성되어있다.
Rocky Linux는 RHEL8 버전을 포킹하는 프로젝트라 기존 7버전까지 잘 사용하던 보안 설정과 tcp_wrappers부분 (host.allow설정)이 미지원되어 새로운 방법으로 보안설정이 필요로 하게 되었다.
[보안 설정]
보안 설정에서 /etc/pam.d/ 이하 system-auth 설정으로 계정 보안 설정이 필요했으나, 8버전 부터 해당 설정 파일을 수동으로 변경하기보다 명령어를 통해 변경하는 것을 권장한다고 합니다. 패스워드 길이 정책은 아래 경로에서 (기본은 전부 주석) 주석을 해제하고, 필요한 값으로 대체해야 합니다.
1. pam_pwquality 모듈 설정
[root@localhost ~]# vi /etc/security/pwquality.conf
minlen = 8 (최소 패스워드 길이 8로 설정) dcredit = 1 (최소 1개 이상 숫자 포함) ucredit = 1 (최소 1개 이상 대문자 포함) lcredit = 1 (최소 1개 이상 소문자 포함) ocredit = 1 (최소 1개 이상 특수문자 포함) maxrepeat =3 (최대 연속된 동일한 숫자 또는 문자 3회 이상 안됨) 111 maxclassrepeat = 3 (최대 연속된 숫자 또는 문자 반복 3회 이상 안됨) 123 usercheck = 1 (패스워드에 사용자ID 포함 여부- 1 체크, 0 No체크)
2. vi /etc/pam.d/system-auth
아래와 같이 system-auth 파일을 수정하였고, root 또는 사용자 계정으로 접속할 때 특이사항은 없었다. 파란색으로 표기한 내용이 보안 설정을 위해 추가한 내용이며, 그 외는 기본 Default 설정이다.
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authselect is run. auth required pam_env.so auth required pam_faillock.so preauth silent audit deny=5 even_deny_root unlock_time=600 auth required pam_faillock.so delay=2000000 auth sufficient pam_fprintd.so auth [default=1 ignore=ignore success=ok] pam_succeed_if.so uid>=1000 quiet auth [default=1 ignore=ignore success=ok] pam_localuser.so auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail audit deny=5 even_deny_root unlock_time=600 auth requisite pam_succeed_if.so uid>=1000 quiet_success auth sufficient pam_sss.so forward_pass auth required pam_deny.so
3. tcp_wrappers 대신 firewall 모듈 사용으로 ssh접근 호스트 정책 제어
아래와 같이 파란색표기된 zone에 IP를 넣어두지 않으면 외부에서 SSH접근 불가
RHEL 7버전 이하에서는 hosts.allow, hosts.deny 파일에 접근 허용할 호스트 IP를 등록하면 되었으나 8버전부터는 모듈이 지원되지 않아 사용이 불가능하다. firewalld 패키지를 사용하여 특정 호스트에 대한 접속 허용을 아래와 같이 지정하면 됩니다.## ssh 서비스를 기본 방화벽에서 제거 # firewall-cmd --permanent --remove-service=ssh ## newzone 이름으로 새로운 zone 추가 # firewall-cmd --permanent --new-zone=newzone # firewall-cmd --permanent --zone=newzone --add-source=10.0.0.0/24 ## 추가된 newzone에 ssh서비스를 추가 # firewall-cmd --permanent --zone=newzone --add-service=ssh ## 방화벽 다시 로드 # firewall-cmd --reload
5. 기본 셋팅(Application 성격에 맞게) ulimits 제한 설정 --- 보안설정은 아님
* soft core unlimited * hard core unlimited 사용자ID soft nproc 16384 사용자ID hard nproc 16384 사용자ID soft nofile 131072 사용자ID hard nofile 131072 root soft nofile 131072 root hard nofile 131072
6. 패스워드 만료일 설정 (이후 설정된 계정에만 적용되며 기존 계정에는 적용 안됨) 아래와 같이 적용해야 보안 심사에서 귀찮게 안함.
# vi /etc/login.defs PASS_MAX_DAYS 90 (90~180일 권장) PASS_MIN_DAYS 90 (MAX값과 동일하게 설정) PASS_MIN_LEN 8 (패스워드 최소 길이 설정) PASS_WARN_AGE 7
* 특정 계정에는 패스워드 만료를 안먹이도록 설정이 필요할 수 있음. (스케줄링에 의한 계정 등) # chage -l 사용자ID (사용자ID에 대한 패스워드 정책 조회) # chage -E -1 -I 0 -m 0 -M 99999 사용자ID (사용자ID에 대해 패스워드 만료 안되게 설정)
7. 로그인 접속 세션 시간 설정 및 History 조회 시 타임라인 설정
# vi /etc/profile
HISTSIZE=2000 (기본 1000) HISTTIMEFORMAT="%F %T "(%T뒤에 스페이스 붙여야 시간과 명령어가 떨어져서 보임) TMOUT=600 (세션 타임아웃 설정- 보안 가이드에 맞게 설정) export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL HISTTIMEFORMAT TMOUT
History 명령어 시 날짜 시간 표기
8. 부팅 시 서비스 자동 시작
# systemctl -t service list-unit-files # systemctl enable "서비스 Unit"