sudo mount -o remount,exec /dev sudo vbetool dpms off sudo mount -o remount,noexec /dev
다시 디스플레이를 켜려면
1 2 3
sudo mount -o remount,exec /dev sudo vbetool dpms on sudo mount -o remount,noexec /dev
Network 상태 확인
ss 명령
ss 명령은 Socket Statistics 를 출력해 준다. open 된 소켓에 대한 정보를 표시한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
ss [-a -t -u -l -p -n] [filter]
-a: -t: TCP -u: UDP -l: LISTEN 상태 포트 -n: 호스트/포트/사용자 이름을 숫자로 표시 -p: 프로세스 이름 -r, --resolve: resolve host names -w, --raw : display only RAW sockets -x, --unix : display only Unix domain sockets -4, --ipv4 : display only IP version 4 sockets -6, --ipv6 : display only IP version 6 sockets -m, --memory : show socket memory usage
LISTEN Port 확이
netstat 같이 LISTEN 상태 프로세스를 확인할 수 있다. 다음은 t: tcp 포트, l: LISTEN 상태의 소켓 정보를 출력한다.
$ ss -tl4 State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 511 0.0.0.0:http 0.0.0.0:* LISTEN 0 511 0.0.0.0:https 0.0.0.0:* $ $ ss -tl6 State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 [::]:2020 [::]:* q
lsof
Linux에서 open file을 확인하는데 사용되는 lsof 명령입니다. Unix/Linux의 모든 것은 파일로 이루어져있기때문에 스트림이나 네트워크 파일도 lsof 로 확인할 수 있습니다.
-d, --detach : 명령을 detach mode, 백그라운드로 실행 -e, --env : 환경변수 설정하고 실행 -it [SHELL]: iteractive tty 옵션. 사용할 shell을 지시한다, 보통 bash -u, --user: User ID, UID -w, --workdir: 작업 디렉토리 지정
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 119.2G 0 disk ├─sda1 8:1 0 84.5G 0 part └─sda6 8:6 0 28.9G 0 part / mmcblk0 179:0 0 7.5G 0 disk ├─mmcblk0p2 179:2 0 6.8G 0 part /media/qkboo/ROOT ├─mmcblk0p3 179:3 0 486.1M 0 part └─mmcblk0p1 179:1 0 200M 0 part /media/qkboo/EFI
parted 사용
파티션 및 포맷을 위해 마운트된 파티션을 언마운트 한다. parted 는 상호작용 프롬프트에서 사용하거나 단일 명령어로 사용할 수 있다.
parted 프롬프트 사용
[ext4 파티션 생성]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
sudo parted /dev/sdb (parted) print Number Start End Size File system Name Flags 1 0.00GB 32.0GB 32.0GB
(parted) mklabel gpt Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? y
(parted) unit GB (parted) mkpart primary 0 1000.0GB #디스크 크기 입력
(parted) print Number Start End Size File system Name Flags 1 0.00GB 32.0GB 32.0GB primary lvm (parted) quit
[fat32 파티션 생성]
USB 스토리지는 아래 같이 나타난다. 다음은 USB 파티션에 fat32 파일시스템을 프롬프트로 생성하고 있다.
1 2 3 4 5
sudo parted /dev/mmcblk0 (parted) mklabel msdos (parted) mkpart primary fat32 1MiB 100% (parted) set 1 boot on (parted) quit
생성한 파티션에 시스템 지원 파일 시스템을 생성해야 한다. 해당 파일 시스템으로 파티션을 포맷한 후에 지정한 디렉토리에 마운트를 해서 사용하면 된다. 지속적인 사용을 위해서 /etc/fstab 에 파티션을 마운트 포인트로 등록하면 재시동 후에도 동일한 폴더에 마운트 된다.
mkfs
mkfs 명령은 파일 시스템에 따랴서 -t 옵션에 파일시스템을 지시하거나 mkfs.[FS] 형식을 명령을 바로 쓰기도 한다.
RedHat, Ubuntu, OpenSUSE LEAP 15.0 등은 시스템 기본 파이어월 관리자로 firewalld 를 제공한다고 한다.
firewalld
firewalld 는 ….
firewalld는 ufw 처럼 iptables 을 구성할 수 있다.
네트워크를 지역 관리가 가능해서 다른 네트워크, 지역에 따라 다른 규칙으로 구성해서 사용할 수 있다. For example “Home” and “Office” where all communications with local machines are allowed, and “Public Wi-Fi” where no communication with the same subnet would be allowed.
OpenSUSE LEAP 15.0, RedHat, Ubuntu 등은 시스템 기본 파이어월 관리자로 firewalld 를 제공한다고 한다.
1
$ sudo apt install firewalld
Start firewalld
To start firewalld, enter the following command as root:
1
systemctl start firewalld
root 사용자로 시작한다.
1 2
sudo systemctl enable firewalld sudo reboot
For more information about the service status, use the systemctl status sub-command:
1 2 3 4 5 6
sudo systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: disabled) Active: active (running) since Thu 1970-01-01 09:01:48 KST; 48 years 6 months ago
sudo firewall-cmd --state
Stop firewalld
To stop firewalld, enter the following command as root:
1
systemctl stop firewalld
To prevent firewalld from starting automatically at system start, enter the following command as root:
1
systemctl disable firewalld
To make sure firewalld is not started by accessing the firewalld D-Bus interface and also if other services require firewalld, enter the following command as root:
1
systemctl mask firewalld
사용해 보기
firewalld 는 명령라인 firewall-cmd 와 GUI로 firewall-config 명령을 지원한다.
Zone 설정
Get a list of all supported zones
1
firewall-cmd --get-zones
List all zones with the enabled features.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
$ firewall-cmd --list-all-zones ...
public target: default icmp-block-inversion: no interfaces: sources: services: ssh dhcpv6-client http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
기본으로 제공하는 Zone
drop: Any incoming network packets are dropped, there is no reply. Only outgoing network connections are possible.
block: Any incoming network connections are rejected with an icmp-host-prohibited message for IPv4 and icmp6-adm-prohibited for IPv6. Only network connections initiated within this system are possible.
public: For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
external: For use on external networks with masquerading enabled especially for routers. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
dmz: For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.
work For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
home For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
internal For use on internal networks. You mostly trust the other computers on the networks to not harm your computer. Only selected incoming connections are accepted.
iptables정보를 저장하고 재부팅 이후에도 동작하도록 설정함. <= vi 로 열어서 맨 마지막에 추가함.
1 2 3
sudo sh -c "iptables-save > /backup/iptables.rules" sudo vi /etc/network/interfaces pre-up iptables-restore < /etc/iptables.rules
Web
기본 httpd 사용을 위한 80번 포트 개방과, node.js, python 등 실습을 위한 8080번 포트를 열어 주기 위해서 /etc/sysconfig/iptables 에 아래와 같이 입력한다.
1 2 3 4 5
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables 규칙을 만들 때는 순서가 매우 중요하다. 이 때 주의해야 할 것은 위의 4개 코드가 빨간 색의 코드보다 반드시 위에 적혀 있어야 한다.
예를 들어 만일 chain에서 로컬 192.168.100.0/24 서브넷에서 들어오는 모든 패킷을 drop하도록 지정한 후 (drop 하도록 지정된 서브넷에 포함되는) 192.168.100.13에서 들어오는 패킷을 모드 허용하는 chain (-A)을 그 후에 추가하면 뒤에 추가된 추가 규칙이 무시된다. 먼저 192.168.100.13를 허용하는 규칙을 설정한 후 서브넷을 drop하는 규칙을 설정해야한다.
이후에
service iptables restart
명령어를 실행해주면 2개의 포트가 열러서 정상적으로 외부접속이 가능해지는 것을 확인할 수 있다.
jail.conf: jail 이라 불리는 모니터링할 대상에 대한 기본 옵션과 행위를 선언한다.
action.d/iptables-multiport.conf: fila2ban 이 jail에 맞게 거부(Ban)한 IP를 다루는 기본 액션이다.
fail2ban.local : fail2ban 주요 설정 파일
jail.local: jail 설정 파일
jaild.d/defaults-debian.conf: jail enable/disable
paths-common.conf: 로그 파일 경로
paths-debian.conf: 로그 파일 경로
설정
fail2ban은 jail 을 구성하고 jail의 filter 그리고 action으로 나뉘어 있다.
fail2ban.conf 구성
fail2ban.conf는 기본 구성 변수로 loggin, socket 그리고 PID 파일 등등이 설정된다. 별도의 파일로 Jail을 구성할 때 fail2ban.local 같은 이름을 사용하고 새로 설정되는 값은 기본 설정 값을 재정의 하게 된다.
단 같은 [default] 섹션이 존재하면 구성된 내용 적용이 잘 안된다.
다음 스크립을 사용하면 모둔 변수를 주석 처리하고 수정할 옵션만 복사해 준다.
1
sed 's/\(^[[:alpha:]]\)/# \1/' fail2ban.conf | sudo tee fail2ban.local 1&> /dev/null
fail2ban.local 파일은 다음과 같은 내용을 담을 것이다.
loglevel: The level of detail that Fail2ban’s logs provide can be set to 1 (error), 2 (warn), 3 (info), or 4 (debug).
logtarget: Logs actions into a specific file. The default value of /var/log/fail2ban.log puts all logging into the defined file. Alternately, you can change the value to STDOUT, which will output any data; STDERR, which will output any errors; SYSLOG, which is message-based logging; and FILE, which outputs to a file.
socket: The location of the socket file.
pidfile: The location of the PID file.
jail.conf
/etc/fail2ban/jail.conf 는 데몬, 서비스에 대한 jail을 구성한다. jail은 log를 읽어 불필요한 것을 찾아 낸다. 다음은 jail.conf에서 주석이 달린 jail.local을 생성해 준다.
1
sed 's/\(^[[:alpha:]]\)/# \1/' jail.conf | sudo tee jail.local 1&> /dev/null
If using CentOS or Fedora open jail.local and set the backend to systemd. This is not necessary on Debian 8, even though it is a SystemD system.
/etc/fail2ban/jail.local
1
backend = systemd
화이트리스트 IP
먼저 검출된 IP 중에 무시할 영역, 화이트리스트를 선언해 줍니다. 리스트는 ‘,’로 구분하고 서브넷 혹은 IP주소를 입력한다.
1 2
[DEFAULT] ignoreip = 127.0.0.1/8 192.168.0.1/24
차단 시간과 재시도 횟수
bantime, findtime, maxretry 은 차단 시간에 대한 구성이다.
1 2 3
bantime = 2592000 findtime = 600 maxretry = 3
bantime: 검출된 IP가 접속 차단 시간을 초단위로 선언해 준다. -1 이면 영속적으로 밴 된다.
fail2ban에 검출되는 jail이 있으면 이메일 설정에 따라 메일로 경고를 받을 수 있다.
destemail: The email address where you would like to receive the emails.
sendername: The name under which the email shows up.
sender: The email address from which Fail2ban will send emails.
그리고 action 설정을 조절할 필요가 있다, 이것은 ban 상황이 기준점에 닿으면 발생한다. 기본 액션 %(action_)s은 사용자만 ban 한다. action_mw 액션은 ban을 실행하고 WhoIS 리포트로 메일을 보내준다. action_mwl은 모든 로그까지 함께 보내준다.
You will also need to adjudst the action setting, which defines what actions occur when the threshold for ban is met. The default, %(action_)s, only bans the user. action_mw will ban and send an email with a WhoIs report; while action_mwl will ban and send an email with the WhoIs report and all relevant lines in the log file. This can also be changed on a jail-specific basis.
1
action = %(action_)s
1
$ sudo service fail2ban restart
각 서버스에 대한 Jail 설정
필터를 이용해 Jail을 만들어 의심스런 접근을 막아 보자. 앞서 복사한 jail.local 파일에는 주요 서비스가 모두 선언되어 있고 sshd 만 활성화 되어 있다.
enabled: Determines whether or not the filter is turned on.
port: The port Fail2ban should be referencing in regards to the service. If using the default port, then the service name can be placed here. If using a non-traditional port, this should be the port number. For example, if you moved your SSH port to 3456, you would replace ssh with 3456.
filter: The name of the file located in /etc/fail2ban/filter.d that contains the failregex information used to parse log files appropriately. The .conf suffix need not be included.
logpath: Gives the location of the service’s logs.
maxretry: Will override the global maxretry for the defined service. findtime and bantime can also be added. action: This can be added as an additional setting, if the default action is not suitable for the jail. Additional actions can be found in the action.d folder.
각 서비스에 대한 jail은 jail.d에 설정 파일을 구성해도 된다.
(1) sshd
Brute-force Attack과 같은 접근을 차단하는 필터로 로그에 아래와 유사한 패턴이 나오면 IP를 검출한다.
Jul 22 06:56:50 foo sshd[14984]: Failed password for invalid user a from xxx.xxx.xxx.xxx port 55452 ssh2
jail.config 혹은 jail.local 에서 기본으로 활성화 되어 있다.
(2) ssh-ddos
sshd-ddos Filter를 사용해 SSH Service를 Scanning하거나 telnet으로 접속할 떄 발생하는 Message를 검사하여 해당 IP의 접근을 차단할 수 있습니다.
이 Filter로 검출되는 /var/log/auth.log의 Message는 다음과 같습니다.
Jul 23 13:16:25 foo sshd[21989]: Did not receive identification string from xxx.xxx.xxx.xxx
Jail 설정을 위해서 다음과 같이 입력합니다.
1 2
[sshd-ddos] enabled = true
혹은 $ sudo vi /etc/fail2ban/jail.d/sshd-ddos.conf
1
$ sudo service fail2ban restart
Failregrexs
다양한 필터를 사용할 수있다. 의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음
$ sudo fail2ban-client status Status |- Number of jail: 6 `- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-badbots, ssh-ddos, ssh
그리고 iptable의 서비스로 방화벽 규칙에 fail2ban 규칙이 동작중인지 확인한다.
1 2 3 4 5 6 7 8 9 10 11 12
$ sudo iptables -S ...
-A fail2ban-nginx-badbots -j RETURN -A fail2ban-nginx-nohome -j RETURN -A fail2ban-nginx-noproxy -j RETURN -A fail2ban-nginx-noscript -j RETURN -A fail2ban-ssh -j RETURN -A fail2ban-ssh-ddos -j RETURN
...
그리고 fail2ban 의 jail 실행 상태를 자세히 보고 싶므면 status 뒤에 jail 이름을 주면 된다.
1 2 3 4 5 6 7 8 9 10
$ sudo fail2ban-client status nginx-badbots Status for the jail: nginx-badbots |- filter | |- File list: /var/log/nginx/access.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0
Testing
의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음
nginx 인증 요구시 잘못된 인증을 시도하면 fail2ban 규칙에 따라 접근이 금지당한다. 그리고 jail 규칙이 잘 적용 됐는지 결과를 다음 같이 확인할 수 있다:
1 2 3 4 5 6 7 8 9 10 11
$ sudo fail2ban-client status nginx-http-auth Output Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | \- Total failed: 12 \- action |- Currently banned: 1 | \- IP list: 111.111.111.111 \- Total banned: 1
인증 규칙에 어긋나는 접근을 시도한 IP인 111.111.111.111을 확인 할 수 잇다. 금지된 IP는 해당 jail을 이용해 다음 같이 해제할 수 있다.
1
$ sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111