Python์ ๋ฐฐ์ฐ๋ ์ด์
Python์ ๋ณด์ ๊ณต๋ถ์์ ์์ฃผ ์ฐ์ด๋ ์ธ์ด์ ๋๋ค. ๋ฌธ๋ฒ์ด ๋น๊ต์ ์ฝ๊ธฐ ์ฝ๊ณ , ํ์ผ ์ฒ๋ฆฌ, ๋ฌธ์์ด ๋ถ์, ๋ก๊ทธ ์ ๋ฆฌ, ๊ฐ๋จํ ์๋ํ์ ๊ฐํฉ๋๋ค. ๋ณด์ ๋๊ตฌ๋ฅผ ์ง์ ๊น๊ฒ ๋ง๋ค์ง ์๋๋ผ๋, ๋ก๊ทธ์์ ํ์ํ ์ค์ ๊ณจ๋ผ๋ด๊ฑฐ๋ IP ์ฃผ์๋ฅผ ๋ถ๋ฅํ๋ ์ ๋๋ง ํ ์ ์์ด๋ ํ์ต ํจ์จ์ด ํฌ๊ฒ ์ฌ๋ผ๊ฐ๋๋ค.
Python์ ๊ณต๋ถํ ๋ ์ฒ์๋ถํฐ ์ด๋ ค์ด ํ๋ ์์ํฌ๋ ํดํน ๋๊ตฌ๋ฅผ ๋ง๋ค ํ์๋ ์์ต๋๋ค. ๋ณ์, ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ํ์ผ ์ฝ๊ธฐ, ๋ฌธ์์ด ๊ฒ์์ ์ดํดํ๋ฉด ์ถฉ๋ถํ ๋ง์ ์ผ์ ํ ์ ์์ต๋๋ค. ๋ณด์ ์๋ํ์ ์ถ๋ฐ์ ์ ๋ณต์กํ ๊ณต๊ฒฉ ์ฝ๋๊ฐ ์๋๋ผ ๋ฐ๋ณต ์์ ์ ์ค์ด๋ ์์ ์คํฌ๋ฆฝํธ์ ๋๋ค.
์ด ์ฅ์์๋ ์ํํ ๊ธฐ๋ฅ์ ๋ง๋ค์ง ์๊ณ , ๋ก๊ทธ์ ๋ฌธ์์ด์ ์ฝ๊ณ ๋ถ๋ฅํ๋ ๋ฐฉ์ดํ ๊ด์ ์ผ๋ก Python ๊ธฐ์ด๋ฅผ ๋ด ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ ์๋ํ ํ๋ฆ
๋ณ์์ ์๋ฃํ
๋ณ์๋ ๊ฐ์ ๋ด์ ๋๋ ์ด๋ฆ์ ๋๋ค. IP ์ฃผ์, ๋๋ฉ์ธ, ํ์ผ ๊ฒฝ๋ก, ํฌํธ ๋ฒํธ์ฒ๋ผ ๋์ค์ ๋ค์ ์ฌ์ฉํ ๊ฐ์ ๋ณ์์ ์ ์ฅํฉ๋๋ค. ์ซ์, ๋ฌธ์์ด, ๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ ๊ฐ์ ์๋ฃํ์ ๊ตฌ๋ถํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ด ์ฌ์์ง๋๋ค.
๋ฌธ์์ด์ ๋ณด์ ํ์ต์์ ํนํ ์์ฃผ ๋ฑ์ฅํฉ๋๋ค. ๋๋ฉ์ธ ์ด๋ฆ, URL, ๋ก๊ทธ ํ ์ค, User-Agent, ํ์ผ ๊ฒฝ๋ก๊ฐ ๋ชจ๋ ๋ฌธ์์ด์ ๋๋ค. ๋ฆฌ์คํธ๋ ์ฌ๋ฌ ๊ฐ์ ์์๋๋ก ๋ด์ ๋ ์ฐ๊ณ , ๋์ ๋๋ฆฌ๋ ํค์ ๊ฐ์ ์ง์ง์ด ์ ์ฅํ ๋ ์๋๋ค.
domain = "school-login.test"
ip = "192.168.56.30"
ports = [53, 80, 443]
service = {"53": "DNS", "80": "HTTP", "443": "HTTPS"}
์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ
์กฐ๊ฑด๋ฌธ์ โ๋ง์ฝ ์ด๋ค ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ์ด ์ผ์ ํ๋ผโ๋ ๊ตฌ์กฐ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ก๊ทธ ํ ์ค์ 404๊ฐ ๋ค์ด ์์ผ๋ฉด ํ์ผ ์์ ์์ฒญ์ผ๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค. ๋ฐ๋ณต๋ฌธ์ ์ฌ๋ฌ ์ค์ ํ๋์ฉ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํฉ๋๋ค.
์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ์ด ํฉ์ณ์ง๋ฉด ๋ก๊ทธ ๋ถ์์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค. ํ์ผ์ ํ ์ค์ฉ ์ฝ๊ณ , ๊ทธ ์ค์ ํน์ ๋๋ฉ์ธ์ด๋ IP๊ฐ ๋ค์ด ์์ผ๋ฉด ์ถ๋ ฅํ๊ฑฐ๋ ๊ฐ์๋ฅผ ์ธ๋ ๋ฐฉ์์ ๋๋ค.
for line in log_lines:
if "school-login.test" in line:
print(line)
ํ์ผ๊ณผ ๋ก๊ทธ ์ฝ๊ธฐ
๋ก๊ทธ ํ์ผ์ ๋ณดํต ํ
์คํธ ํํ์
๋๋ค. Python์์๋ open()์ผ๋ก ํ์ผ์ ์ด๊ณ , ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ์ค์ฉ ์ฝ์ ์ ์์ต๋๋ค. ํ์ผ์ ํ๊บผ๋ฒ์ ์ฝ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๋ก๊ทธ๊ฐ ๊ธธ์ด์ง ์ ์์ผ๋ฏ๋ก ํ ์ค์ฉ ์ฒ๋ฆฌํ๋ ์ต๊ด์ด ์ข์ต๋๋ค.
์น ์๋ฒ access.log๋ฅผ ์ฝ์ ๋๋ IP ์ฃผ์, ์์ฒญ ๊ฒฝ๋ก, ์๋ต ์ฝ๋, ์๊ฐ ์ ๋ณด๋ฅผ ๋์ฌ๊ฒจ๋ด ๋๋ค. DNS ๋ก๊ทธ๋ผ๋ฉด ์ง์ํ ๋๋ฉ์ธ๊ณผ ์๋ต IP๊ฐ ์ค์ํฉ๋๋ค. Python์ ์ด๋ฐ ํ ์คํธ์์ ํ์ํ ๋ถ๋ถ๋ง ๊ณจ๋ผ๋ด๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
with open("access.log", "r", encoding="utf-8") as f:
for line in f:
if "GET" in line and "200" in line:
print(line.strip())
๋ฌธ์์ด๊ณผ ์ ๊ทํํ์
๋ฌธ์์ด ๊ฒ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ถ์ ๋ฐฉ๋ฒ์
๋๋ค. in์ ์ฌ์ฉํ๋ฉด ํน์ ๋จ์ด๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์กฐ๊ธ ๋ ๋ณต์กํ ํจํด์ ์ฐพ๊ณ ์ถ์ ๋๋ ์ ๊ทํํ์์ ์ฌ์ฉํฉ๋๋ค.
์ ๊ทํํ์์ ์ฒ์์๋ ๋ฏ์ค์ง๋ง, IP ์ฃผ์๋ ๋๋ฉ์ธ ๊ฐ์ ์ผ์ ํ ํํ๋ฅผ ์ฐพ์ ๋ ์ ์ฉํฉ๋๋ค. ๋ค๋ง ๋ฌด๋ฆฌํด์ ๋ณต์กํ๊ฒ ์ฐ๊ธฐ๋ณด๋ค, ๊ฐ๋จํ ํจํด๋ถํฐ ์ฒ์ฒํ ์ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
import re
line = "client connected to 192.168.56.30:80"
match = re.search(r"\d+\.\d+\.\d+\.\d+", line)
if match:
print(match.group())
๋ณด์ ํ์ต์์ ์ฐ๋ ๋ฐฉ์
Python์ ๋ณด์ ํ์ต์์ ๋ก๊ทธ ์ ๋ฆฌ, ๋ฌธ์์ด ๊ฒ์ฌ, ํ์ผ ๋ชฉ๋ก ํ์ธ, ๊ฐ๋จํ ํต๊ณ ๊ณ์ฐ์ ์ธ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด access.log์์ ํน์ IP์ ์์ฒญ ํ์๋ฅผ ์ธ๊ฑฐ๋, DNS ๋ก๊ทธ์์ ํน์ ๋๋ฉ์ธ์ ์ฐพ๊ฑฐ๋, ์ฌ๋ฌ ํ์ผ ์ด๋ฆ ์ค ์์ฌ์ค๋ฌ์ด ํ์ฅ์๋ฅผ ๊ณจ๋ผ๋ผ ์ ์์ต๋๋ค.
์ค์ํ ๊ฒ์ ์์ ํ ๋ฒ์์ ๋๋ค. ์ค์ ๊ณต๊ฒฉ ์๋ํ, ๋ฌด๋จ ์ค์บ, ๊ณ์ ์ ๋ณด ์์ง ๊ฐ์ ๊ธฐ๋ฅ์ ๋ง๋ค์ง ์์ต๋๋ค. ๋์ ๋ฐฉ์ด์ ์ดํด๋ฅผ ๋๋ ์์ ์๋ํ์ ์ง์คํฉ๋๋ค.
| ํ์ต ์์ | Python์ผ๋ก ํ๋ ์ผ | ์ดํดํ ๊ฐ๋ |
|---|---|---|
| ์น ๋ก๊ทธ ๋ถ์ | ํน์ ์ํ ์ฝ๋ ์ฐพ๊ธฐ | HTTP ์๋ต ์ฝ๋ |
| DNS ๋ก๊ทธ ํ์ธ | ๋๋ฉ์ธ๊ณผ IP ์ถ์ถ | DNS ์ง์/์๋ต |
| ๋ฌธ์์ด ๊ฒ์ฌ | ์ง๊ฐ ์ฃผ์์ฒ๋ผ ๋ณด์ด๋ ํจํด ํ์ง | ์ ๊ทํํ์ |
| ํ์ผ ๋ชฉ๋ก ํ์ธ | ํ์ฅ์๋ณ ๋ถ๋ฅ | ํ์ผ ์์คํ |
ํต์ฌ ๊ฐ๋ ๋ณต์ต
Python ๊ธฐ์ด์ ํต์ฌ์ ๊ฐ์ ์ ์ฅํ๊ณ , ์กฐ๊ฑด์ผ๋ก ํ๋จํ๊ณ , ๋ฐ๋ณตํด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๋ณ์๋ ๊ฐ์ ๋ด๊ณ , ์กฐ๊ฑด๋ฌธ์ ํ๋จํ๋ฉฐ, ๋ฐ๋ณต๋ฌธ์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋ก๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. ํ์ผ ์ฝ๊ธฐ์ ๋ฌธ์์ด ์ฒ๋ฆฌ๊ฐ ๋ํด์ง๋ฉด ๋ก๊ทธ ๋ถ์์ ๊ธฐ๋ณธ ํ์ด ์์ฑ๋ฉ๋๋ค.
๋ณด์ ๊ณต๋ถ์์ Python์ ๋ชฉ์ ์ด ์๋๋ผ ๋๊ตฌ์ ๋๋ค. ๋คํธ์ํฌ, DNS, ์น, ๋ก๊ทธ ๊ฐ๋ ์ ์ดํดํ๊ณ ์์ ๋ Python์ ๊ทธ ๊ฐ๋ ์ ๋ ๋น ๋ฅด๊ฒ ํ์ธํ๊ฒ ๋์์ค๋๋ค.
๋ค์ ์ฅ์์๋ ์์์ ๋ฐฐ์ด ๋คํธ์ํฌ, ์๋ฒ, DNS, ์น, ๊ณต์ ๊ธฐ, ํจํท, ํ์ง ๊ฐ๋ ์ ํ๋์ ํฐ ํ๋ฆ์ผ๋ก ๋ค์ ์ฐ๊ฒฐํด ๋ด ๋๋ค.