컬럼명 또는 인덱스로 데이터프레임 coulmn 삭제하기

 

아래와 같은 데이터 프레임이 있다고 가정하자.

Iris dataset

이때, 특정 컬럼을 추가하거나 삭제하고 싶다면?

 

컬럼명으로 삭제


'sepal width (cm)' 컬럼을 삭제하고 싶다면, 아래와 같이 코드를 구현하면 된다.

df.drop(columns=['sepal width (cm)'])

 

또는, columns= 을 쓰지 않는 대신, axis=1을 추가하면 된다.

참고로, axis=1은 column을 기준으로 연산하는 것, axis=0은 row를 기준으로 연산하는 것이다.

df.drop(['sepal width (cm)'], axis=1)

여러개의 컬럼을 한번에 삭제하고 싶을 땐 [] 안에 여러개의 컬럼을 입력하면 된다.

df.drop(['sepal length (cm)', 'petal width (cm)'],axis=1)

 

인덱스로 삭제


컬럼명을 일일이 작성하기 어렵거나, 쉽게 여러개의 column을 처리하고 싶다면 인덱스를 활용하면 된다.

df.drop(columns=df.columns[[1]])

데이터프레임.columns() 를 실행하면 해당 데이터프레임의 컬럼명 리스트를 확인할 수 있는데, 그걸 활용해서 몇번째 컬럼을 삭제할 지 선택할 수 있다. 

여러개의 컬럼을 한번에 삭제하고 싶을 땐 여러 인덱를 입력하면 된다.

df.drop(columns=df.columns[[0,2]])

그동안 학교 지메일과 구글 드라이브를 열심히 사용했는데, 앞으로 졸업생의 계정을 삭제한다고 한다.

대학원 졸업도 얼마 남지 않았을 뿐더러 나는 그동안 학부 계정을 열심히 사용해왔기 때문에..

드라이브 속 많은 파일들을 외장하드에 옮겨야만 했다.

 

이런 일도 있고 하니, 그동안 만들어왔던 파일들과 실험 내용들 중 일반적인 내용들을 블로그에 기록해두면 좋겠다는 생각이 들었다.

정말 나의 기록장, 마이 보안 다이어리답다.

 


오늘은 1탄!

GRR 설치 가이드이다.

 

GRR은 구글에서 나온 오픈소스 EDR 시스템이다. 

https://github.com/google/grr

 

GitHub - google/grr: GRR Rapid Response: remote live forensics for incident response

GRR Rapid Response: remote live forensics for incident response - GitHub - google/grr: GRR Rapid Response: remote live forensics for incident response

github.com

 

상세 내용은 독스에 잘 설명되어 있기도 하고, 그동안 연구했던 내용에 모두 포함되어 있다.

오늘은 설치 가이드를 위주로 작성하려고 한다.

 

설치는 VMware 가상머신에서 진행했고, 환경은 Ubuntu 18.04.4 LTS에서 진행했다.

이 외에도 20.04, 21.04 LTS에서도 실험해봤었는데 모두 성공적으로 설치할 수 있었다.

 

GRR은 서버, 클라이언트가 나누어져 있기 때문에 설치 과정에도 차이가 있다.

 

서버, 클라이언트 공통 설치 과정

0. 먼저 처음 가상머신을 설치했다면 아래 과정을 기본으로 진행해준다.

sudo apt-get install net-tools
sudo su
apt-get update -y

1. maria DB 설치

이 과정은 root 권한으로 변경 후 진행해야 한다.

apt-get install mariadb-server -y
mysql_secure_installation

위 과정을 진행하면, 아래와 같이 질문이 나오고 간단히 대답을 해주면 된다.

Enter current password for root (enter for none): enter
Set root password? [Y/n]: N
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: N
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now [Y/n]: Y

그리고나서 아래 과정을 진행해준다.

mysql -u root -p
MariaDB [(none)] > CREATE DATABASE grr;
MariaDB [(none)] > GRANT ALL PRIVILEGES ON grr.* TO ‘grr’@’localhost’ IDENTIFIED BY ‘password’ WITH GRANT OPTION; (복사, 붙여넣기 하지말고 직접 입력하기)
MariaDB [(none)] > FLUSH PRIVILEGES;
MariaDB [(none)] > EXIT;

EXIT;을 하고 나서,

systemctl restart mariadb로 터미널에서 mariadb를 재시작해준다.

+) systemctl status mariadb로 현재 상태를 확인할 수 있다. 

 

서버 설치 과정

서버를 설치하기 위해, deb 파일을 다운로드 해야한다.

나는 그동안 3.4.0-1 버전을 사용했는데, 버전 업데이트가 되었다면 그에 맞게 설치해주어야 한다.

버전이 몇인지 모르겠다면 wget https://github.com/google/grr/releases에서 확인해볼 수 있다.

(현재는 3.4.6.0이 최신이라고 나온다.)

wget https://storage.googleapis.com/releases.grr-response.com/grr-server_3.4.0-1_amd64.deb
sudo apt install -y ./grr-server_3.4.0-1_amd64.deb

이후에는 계속 엔터를 치면서 넘어가고, IP를 입력하는 부분이 나오면 서버의 IP를 입력해준다.

그리고 Please enter password for user 'admin' 에서는 GRR에 접속할 때 사용할 비밀번호를 입력해주면 된다.

 

설치를 완료했다면, systemctl restart grr-server로 서버를 재실행해준다.

 

재실행을 한 다음, 웹 페이지에서 서버의 IP주소:8000 로 접속하면 로그인 창이 나오는데, 

이때는 admin/비밀번호(이전에 설정한 것)을 입력하면 접속할 수 있다.

GRR 접속 화면

 

클라이언트 설치 과정

클라이언트의 경우, 공통 설치 과정을 거친 후에 진행한다.

그리고 웹 페이지에서 위에서와 같이 서버IP:8000에 접속한다.

그리고 왼쪽의 Binaries 탭에 들어간 다음, linux/installers/grr_3.4.0-1_amd64.deb 버전을 다운로드 하면 된다.

이때, 단순하게 다운로드만 하는 것이 아니라, 다운로드 한 파일을 실행시켜서 install로 설치해줘야 한다!

 

이 과정을 마무리하면, 서버 페이지에서 search box를 누르면 온라인 상태의 클라이언트를 확인할 수 있다!

 

처음 설치 가이드를 만드는 것은 어렵지만, 한번 만들어보면 다른 걸 설치할 때도 두려움이 없어진다.

그리고 한번 만들어두면 굉장히 편하다!

오늘도 간단한 공격을 snort로 탐지해보려고 한다.

 

공격자는 칼리리눅스이고, 피해자는 IP가 192.168.48.165인 우분투이다.

 

1) Snort3로 탐지할 준비하기

스노트 탐지 방법은 점점 손에 익어가는 것 같다.

순서는 늘 똑같다.

이전 log 파일 삭제 -> 탐지 룰 수정(새로운 탐지룰 넣어주기) -> 탐지 -> 로그분석 순이다.

2-1. 이전 log 파일 삭제

sudo rm /var/log/snort/*

1-2. 탐지 룰 수정

sudo gedit /usr/local/etc/rules/local.rules

이번에는 icmp 패킷들을 탐지하는 룰로 수정해주려고 한다.

alert icmp any any -> $HOME_NET any (msg: "ICMP Flooding"; sid:1000025;)

1-3. 간단하게 실행시켜보기

간단히 실행해보고, 에러가 나진 않는지 확인한다.

snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules

1-4. 탐지

에러가 안나는 것을 확인해주었다면, 탐지한 뒤 이를 로그파일로 저장할 수 있도록 한다.

sudo /usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 \
-k none -l /var/log/snort -i ens33 -m 0x1b

 

2) Land attack

칼리리눅스에서 hping3를 사용해 간단히 공격을 시도할 수 있다.

아래 명령어를 터미널에 입력해주면 된다.

hping3 192.168.48.165 -a 192.168.48.165 --flood --icmp

192.168.48.165 부분은 피해자 IP주소를 입력해주면 되는 것이다.

그럼 아래와 같이 나온다.

 

3) 로그 분석하기

조금 시간이 흐르면, ctrl+C를 눌러서 공격을 멈춘다.

그리고 우분투에서도 탐지를 멈춘 뒤, 로그 파일이 저장되는 폴더를 확인해보자.

이전에는 alert_json.txt 파일만 생겼었는데, 이번에는 엄청나게 많은 로그파일이 생성된 것을 알 수 있다.

아무래도 flooding 공격이다 보니 많은 것들이 탐지된 것 같다.

 

alert_json.txt 파일을 확인해보면,

대충 봐도 엄청나게 많은 로그가 쌓인 것을 알 수 있다.

몇가지 살펴보면, dst_addr과 dst_ap가 192.168.48.165이고, ICMP 패킷이 탐지된 것을 알 수 있다.

그리고 same src/dst IP 메세지도 꽤나 보인다.

다음에는 Splunk로 더 자세한 분석을 해보려고 한다!

EXIF를 활용해 이미지의 메타데이터를 확인하고, 수정해보려고 한다.

 

환경은 Ubuntu 20.04 가상머신이다.

 

1. 간단한 툴 이용하기

먼저, 터미널에 아래 명령어로 exiftool을 설치해준다.

sudo apt-get install exif

sudo apt install libimage-exiftool-perl

 

이미지 파일을 구글에서 하나 다운받아와서, 파일명을 dog2.jpeg로 변경해줬다.

그리고 아래 명령어를 입력한다.

exiftool dog2.jpeg

그럼 아래 그림과 같이 이 이미지 파일에 대한 메타데이터를 확인할 수 있다.

이번엔 이미지의 메타데이터를 수정해보자. 

exiftool -artist=me dog2.jpeg

 

그럼 현재 디렉터리에 dog2.jpeg(메타데이터 바뀐 것), dog2.jpeg_original(수정 전 이미지)가 생긴다.

그리고 다시 dog2.jpeg의 메타데이터를 확인해보면, 

메타데이터 내용이 더 추가됨으로써 파일 사이즈와 mtime, ctime, atime이 변한 것을 확인할 수 있다.

그리고 artist가 me로 변경된 것을 확인할 수 있다.

 

2. 파이썬 코드 활용하기

위와 유사하게, 파이썬으로도 가능하다.

먼저, exif를 설치해준다.

pip install exif

 

그리고 gedit read_exif.py을 한 다음, 아래 내용을 넣고 저장한다.

from exif import Image

original = 'dog2.jpeg'

with open(original, 'rb') as original:
    img = Image(original)

print(dir(img))

dir()은 원본 이미지의 exif 속성들을 확인할 수 있는 함수이다.

그럼 아래와 같은 결과를 얻을 수 있다. 

 

read_exif.py 파일을 조금 수정해서 몇가지 속성들에 대해 확인해보면,

from exif import Image

original = 'dog2.jpeg'

with open(original, 'rb') as original:
    img = Image(original)

print("img.artist: ", img.artist)
print("img.delete: ", img.delete)
print("img.get: ", img.get)
print("img.y_and_c_positioning: ", img.y_and_c_positioning)
print("img.y_resolution: ", img.y_resolution)

아래와 같이 나오는 것을 확인할 수 있다. 

보면, y_and_c_positioning, y_resolution 같은 경우엔 숫자이고, artist는 문자열인 것으로 보인다.

 

이번엔 파이썬 코드로 메타데이터를 수정해보자.

gedit revise_exif.py를 한 다음, 아래 내용을 입력하고 저장해준다.

from exif import Image

original = 'dog2.jpeg'

with open(original, 'rb') as original:
    img = Image(original)

img.artist = 'me2'

with open('modified_original', 'wb') as new:
    new.write(img.get_file())

dog2.jpeg의 artist 부분을 me2로 바꾼 다음, 이를 modified_original 파일로 저장하라는 의미이다.

 

python3 revise_exif.py로 이 코드를 실행시킨 뒤, modified_original을 확인해보면 아래와 같이 artist가 me2로 변경된 것을 확인할 수 있다.

그리고 이미지를 확인해보면,

이렇게 육안으로 보기에는 원본(dog2.jpeg)과 동일한 강아지 사진임을 확인할 수 있다.

+ Recent posts