반응형

로그인 기능은 웹 애플리케이션에서
사용자 인증을 담당하는 중요한 부분입니다.
보안을 강화하지 않으면 사용자의 계정이 탈취되거나
시스템에 무단 접근이 발생할 수 있습니다.
이번 글에서는 안전한 로그인 기능을 구현하기 위해
필수적으로 적용해야 할 보안 설정과
방법을 세세하게 살펴보겠습니다.
 
오늘은 프로그래밍 언어
파이썬(python)을 사용하겠습니다.


1. 비밀번호 보호

1.1 비밀번호 해싱 및 솔팅
비밀번호를 안전하게 저장하기 위해
해싱과 솔팅 기법을 사용합니다.

  • 해싱: 비밀번호를 해시 함수(bcrypt, Argon2 등)를 사용하여 해시된 값으로 변환합니다. 해시는 단방향 함수이므로 원본 비밀번호를 추출할 수 없습니다.
  • 솔팅: 각 비밀번호에 무작위 솔트 값을 추가하여 해시합니다. 동일한 비밀번호라도 솔트가 다르면 해시 값이 달라져서 무차별 대입 공격을 방지할 수 있습니다.
# bcrypt 설치
# pip install bcrypt

import bcrypt

def hash_password(password):
    salt = bcrypt.gensalt()
    hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt)
    return hashed_password

def check_password(hashed_password, user_password):
    return bcrypt.checkpw(user_password.encode('utf-8'), hashed_password)

1.2 비밀번호 복잡성 규칙
강력한 비밀번호를 설정하도록 유도합니다.
최소 길이, 대문자, 소문자, 숫자, 특수문자를
포함하는 규칙을 설정합니다.

  • 예시: 최소 8자 이상, 대문자 1자, 소문자 1자, 숫자 1자, 특수문자 1자 포함
import re

def is_password_strong(password):
    if (len(password) < 8 or 
        not re.search(r"[A-Z]", password) or 
        not re.search(r"[a-z]", password) or 
        not re.search(r"\d", password) or 
        not re.search(r"[!@#$%^&*(),.?\":{}|<>]", password)):
        return False
    return True

password = "Example1!"
if is_password_strong(password):
    print("Password is strong.")
else:
    print("Password is weak.")

2. 로그인 시도 제한

2.1 로그인 시도 제한
사용자가 일정 횟수 이상 잘못된 비밀번호를 입력하면
계정을 일시적으로 잠금 처리합니다.

  • 예시: 5회 실패 시 15분 동안 계정을 잠금
from datetime import datetime, timedelta

login_attempts = {}

def record_login_attempt(username, success):
    if username not in login_attempts:
        login_attempts[username] = {'attempts': 0, 'last_attempt': None, 'lock_until': None}
    
    # 계정이 잠겨있는지 확인
    if login_attempts[username]['lock_until'] and datetime.now() < login_attempts[username]['lock_until']:
        return "Account is locked. Try again later."
    
    # 로그인 성공 시 시도 횟수 초기화
    if success:
        login_attempts[username]['attempts'] = 0
    else:
        login_attempts[username]['attempts'] += 1
        login_attempts[username]['last_attempt'] = datetime.now()
        # 5회 실패 시 계정 잠금
        if login_attempts[username]['attempts'] >= 5:
            login_attempts[username]['lock_until'] = datetime.now() + timedelta(minutes=15)
            return "Account is locked due to too many failed attempts."
    
    return "Login attempt recorded."

2.2 캡차(CAPTCHA)
여러 번 로그인 실패 후 캡차를 요구하여 봇에 의한
자동화된 공격을 방지합니다.
캡차는 reCAPTCHA 등 서비스를 이용할 수 있습니다.

<form action="/login" method="post">
    <!-- Other login fields -->
    <div class="g-recaptcha" data-sitekey="your_site_key"></div>
    <button type="submit">Login</button>
</form>
<script src="https://www.google.com/recaptcha/api.js"></script>

3. CSRF(Cross-Site Request Forgery) 토큰

3.1 CSRF 토큰 사용
로그인 폼에 CSRF 토큰을 포함하여,
서버가 해당 요청이 신뢰할 수 있는 출처에서 왔는지
확인합니다.
이를 통해 CSRF 공격을 방지할 수 있습니다.

from flask import Flask, request, session, render_template_string
import os

app = Flask(__name__)
app.secret_key = os.urandom(24)

def generate_csrf_token():
    if 'csrf_token' not in session:
        session['csrf_token'] = os.urandom(24).hex()
    return session['csrf_token']

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        token = request.form.get('csrf_token')
        if not token or token != session['csrf_token']:
            return "CSRF token mismatch", 400
        # Process login
    return render_template_string("""
        <form method="POST">
            <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
            <!-- Other login fields -->
            <button type="submit">Login</button>
        </form>
    """, csrf_token=generate_csrf_token())

4. 2단계 인증(Two-Factor Authentication, 2FA)

4.1 2단계 인증 도입
비밀번호 외에도 추가 인증 요소를 요구합니다.
예를 들어, SMS, 이메일로 전송된 인증 코드,
인증 앱(Google Authenticator 등)을 사용한 코드를 입력하도록 요구할 수 있습니다.

import random

def send_otp_via_sms(phone_number):
    otp = random.randint(100000, 999999)
    # Code to send SMS
    return otp

def verify_otp(user_input, actual_otp):
    return user_input == actual_otp

# 예시 사용법
otp = send_otp_via_sms("+1234567890")
user_input = input("Enter the OTP sent to your phone: ")
if verify_otp(user_input, otp):
    print("OTP verified successfully.")
else:
    print("Invalid OTP.")

5. 세션 관리

5.1 세션 타임아웃
일정 시간 동안 사용자의 활동이 없으면
자동으로 로그아웃 시킵니다.

from flask import Flask, session
from datetime import timedelta

app = Flask(__name__)
app.secret_key = os.urandom(24)

@app.before_request
def make_session_permanent():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=30)

5.2 세션 고정 공격 방지

로그인 시 새로운 세션 ID를 할당하여 세션 고정 공격을 방지합니다. 

from flask import Flask, session

app = Flask(__name__)
app.secret_key = os.urandom(24)

@app.route('/login', methods=['POST'])
def login():
    # Authenticate user
    user = authenticate_user() # 가정한 함수
    if user:
        session.clear()
        session['user_id'] = user.id
        return "Login successful"
    return "Invalid credentials"

6. SSL/TLS를 통한 데이터 암호화

6.1 SSL/TLS 사용
로그인 페이지 및 API 통신에 SSL/TLS를 사용하여 전송되는 데이터를 암호화합니다.
이를 통해 중간자 공격(MITM)을 방지할 수 있습니다.

  • SSL 인증서를 설치하고 HTTPS를 적용합니다.
server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /path/to/your_certificate.crt;
    ssl_certificate_key /path/to/your_private.key;

    location / {
        proxy_pass http://localhost:5000;
        # Other configurations
    }
}

7. 계정 잠금 및 경고

7.1 계정 잠금
여러 번 로그인 실패 시 계정을 잠그고,
사용자가 등록한 이메일로 경고 메시지를 보냅니다.

def send_account_lock_email(user_email):
    # Code to send email
    pass

def lock_account(username):
    # Lock account logic
    send_account_lock_email(username)

7.2 로그인 알림
새로운 디바이스나 IP 주소에서 로그인 시 사용자가 알림을 받도록 설정할 수 있습니다.

def send_new_login_alert(user_email, ip_address):
    # Code to send email alert
    pass

8. 입력 데이터 유효성 검사

8.1 입력 데이터 검증
모든 사용자 입력 데이터에 대해 유효성 검사를 수행하여 SQL 인젝션, XSS 등의 공격을 방지합니다.

from flask import escape

@app.route('/login', methods=['POST'])
def login():
    username = escape(request.form.get('username'))
    password = escape(request.form.get('password'))
    # Process login

9. 보안 감사 및 로그

9.1 보안 로그
로그인 시도, 실패, 비밀번호 변경 등의 보안 관련 이벤트를 로깅하여 나중에 분석할 수 있도록 합니다.

import logging

logging.basicConfig(filename='security.log', level=logging.INFO)

def log_security_event(event):
    logging.info(event)

# 예시 사용법
log_security_event("User login attempt")

9.2 감사 로그
의심스러운 활동을 감지하고 대응할 수 있도록 보안 감사 로그를 유지합니다.

def log_suspicious_activity(user_id, activity):
    logging.warning(f"Suspicious activity detected for user {user_id}: {activity}")

# 예시 사용법
log_suspicious_activity(123, "Multiple failed login attempts")

오늘은 안전한 로그인 기능을 위한 보안 설정을 알아봤습니다.
오늘 설정한 내용 아래에서 한번 더 볼까요?

  1. 비밀번호 보호: 비밀번호를 해시 함수와 솔트를 사용하여 안전하게 저장하고, 비밀번호 복잡성 규칙을 설정하여 강력한 비밀번호를 요구합니다.
  2. 로그인 시도 제한: 일정 횟수 이상 잘못된 비밀번호 입력 시 계정을 잠금 처리하고, 봇 공격을 방지하기 위해 캡차(CAPTCHA)를 도입합니다.
  3. CSRF 토큰 사용: CSRF 토큰을 로그인 폼에 포함시켜 CSRF 공격을 방지합니다.
  4. 2단계 인증(2FA): 비밀번호 외에도 SMS, 이메일, 인증 앱을 통한 추가 인증 요소를 요구하여 보안을 강화합니다.
  5. 세션 관리: 세션 타임아웃 설정과 세션 고정 공격 방지 등을 통해 세션을 안전하게 관리합니다.
  6. SSL/TLS를 통한 데이터 암호화: SSL/TLS를 사용하여 전송되는 데이터를 암호화하여 중간자 공격(MITM)을 방지합니다.
  7. 계정 잠금 및 경고: 여러 번 로그인 실패 시 계정을 잠그고, 이메일로 경고 메시지를 발송하며, 새로운 디바이스나 IP 주소에서 로그인 시 알림을 보냅니다.
  8. 입력 데이터 유효성 검사: 모든 사용자 입력 데이터에 대해 유효성 검사를 수행하여 SQL 인젝션, XSS 등의 공격을 방지합니다.
  9. 보안 감사 및 로그: 로그인 시도, 실패, 비밀번호 변경 등의 보안 관련 이벤트를 로깅하고, 의심스러운 활동을 감지하여 대응합니다.

이러한 보안 설정을 통해 로그인 기능의 보안을 강화하고,
사용자 계정 및 시스템을 보다 안전하게 보호할 수 있습니다.
최신 보안 권고사항을 참고하고,
자동화된 보안 도구를 적극 활용하여 시스템의 안전성을 높여주세요
 
보안은 한 번에 완성되는 것이 아니라 지속적으로 관리하고 업데이트해야 하는 부분입니다.
따라서 정기적인 보안 점검과 최신 보안 패치 적용을 통해 안전한 웹 애플리케이션을 유지하시기 바랍니다.
이 글이 안전한 로그인 기능을 구현하는 데 도움이 되었기를 바랍니다.
추가적인 질문이나 도움이 필요하다면 언제든지 댓글로 남겨주세요.
감사합니다!


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

ACL 접근 제어 목록

(Access Control List)

허가되지 않은 이용자가 라우터나 네트워크의

특정 자원에 접근하려고 하는 것을 차단하는 기능입니다.

첫 번째 두 번째 실습에 이어 세 번째 시간입니다.

 

이 실습에서는 ACL (Access Control List)을 사용하여 특정 네트워크 트래픽을 필터링하는 방법을 다룹니다.

목표는 불필요하거나 위험한 접근을 제한하여 네트워크 보안을 강화함에 있습니다.

ACL에 대한 자세한 개념은

아래 글을 참고해 주세요!

https://jdcyber.tistory.com/17

 

ACL (Access Control List) 이란? ACL 구성 가이드: 네트워크 보안 강화를 위한 필수 지침 (쉬운 설명, 예

ACL (Access Control List) 정의 및 개념 ACL (Access Control List) 은 네트워크 보안의 핵심 구성 요소로, 네트워크 장비에서 데이터 패킷의 흐름을 제어하는 데 사용되는 일련의 지침입니다. 이 규칙들은 특

jdcyber.tistory.com

 

 

(패킷 트레이서 예제 파일은 본 글에 첨부해 놨습니다.)

1번 조건

R1, R2, R3
각각의 내부 네트워크에서는 www.ilbe.com, www.toto24.com으로 접근되지 않도록 차단하여라.
 

2번 조건

R1
13.13.20.0/24, 13.13.30.0/24 네트워크만 '13.13.10.100' 웹, FTP 접근이 가능하도록 하여라.
'13.13.10.100'으로 접근하는 모든 ICMP는 차단하여라.
단, '13.13.10.100'은 '13.13.20.0/24', '13.13.30.0/24'로 Ping이 되어야 한다.
 

명령어

conf t
(각각의 내부 네트워크에서는 www.ilbe.com, www.toto24.com으로 접근되지 않도록 차단)
access-list 110 deny ip 13.13.10.0 0.0.255.255 host 141.101.121.208
access-list 110 deny ip 13.13.10.0 0.0.255.255 host 81.150.200.78
access-list 110 permit ip any any
!
int fa0/0
ip access -group 110 int
!
(13.13.20.0/24, 13.13.30.0/24 네트워크만 '13.13.10.100' 웹, FTP 접근이 가능도록 설정)
('13.13.10.100'으로 접근하는 모든 ICMP는 차단 단, '13.13.10.100'은 '13.13.20.0/24', '13.13.30.0/24'로 Ping 가능하도록 설정)
access-list 120 permit tcp 13.13.20.0 0.0.0.255 host 13.13.10.100 eq 80
access-list 120 permit tcp 13.13.20.0 0.0.0.255 host 13.13.10.100 eq 443
access-list 120 permit tcp 13.13.20.0 0.0.0.255 host 13.13.10.100 range 20 21
access-list 120 permit tcp 13.13.30.0 0.0.0.255 host 13.13.10.100 eq 80
access-list 120 permit tcp 13.13.30.0 0.0.0.255 host 13.13.10.100 eq 443
access-list 120 permit tcp 13.13.30.0 0.0.0.255 host 13.13.10.100 range 20 21
access-list 120 deny tcp any host 13.13.10.100 eq80
access-list 120 deny tcp any host 13.13.10.100 eq443
access-list 120 deny tcp any host 13.13.10.100 range 20 21
access-list 120 permit icmp 13.13.20.0 0.0.0.255 host 13.13.10.100 echo-reply
access-list 120 permit icmp 13.13.30.0 0.0.0.255 host 13.13.10.100 echo-reply
access-list 120 deny icmp any host 13.13.10.100
access-list 120 permit ip any any
!
int s0/0/0
ip access-group 120 in
 

확인

show ip access-lists

신중한 IP 주소 및 서비스 선정
  • 정밀한 대상 지정: ACL을 설정할 때, 차단하거나 허용해야 하는 특정 IP 주소, 네트워크, 또는 서비스(웹, FTP, ICMP 등)를 명확히 식별해야 합니다. 이는 불필요한 접근을 정확히 차단하고, 필요한 트래픽은 원활하게 통과시키는 데 중요합니다.
최소 권한 원칙 적용
  • 필요한 최소한의 접근만 허용: 네트워크 보안에서는 항상 최소 권한 원칙(Principle of Least Privilege)을 적용해야 합니다. 이는 사용자나 시스템이 자신의 업무를 수행하는 데 필요한 최소한의 권한만을 가지도록 하는 것입니다. ACL 설정 시, 이 원칙에 따라 필수적인 접근만 허용하고 나머지는 기본적으로 차단하는 방식을 채택해야 합니다.
서비스별 포트 번호 인식
  • 적절한 포트 사용: 웹(HTTP, HTTPS)이나 FTP 서비스에 대한 접근을 허용하거나 차단할 때, 각 서비스의 표준 포트 번호(예: HTTP는 80, HTTPS는 443, FTP는 20과 21)를 정확히 지정해야 합니다. 잘못된 포트 번호 설정은 의도하지 않은 서비스 접근을 허용하거나 차단할 수 있습니다.
정책 구현 후 검증
  • 설정 후 검증: ACL을 구성한 후에는 show ip access-lists 명령어를 사용하여 설정된 규칙을 검토하고, 실제 네트워크 트래픽이 의도한 대로 필터링되는지 확인해야 합니다. 또한, 허용된 접근과 차단된 접근 모두를 테스트하여 ACL이 정상적으로 작동하는지 검증해야 합니다.
문서화 및 지속적 관리
  • 구성 문서화: ACL 설정을 문서화하여 관리하면 나중에 네트워크 변경이나 문제 해결 시 큰 도움이 됩니다. 구성 변경 사항을 기록해 두면, 미래의 보안 감사나 네트워크 개선 작업에 유용한 참고 자료가 됩니다.
  • 지속적인 업데이트와 관리: 네트워크 환경은 지속적으로 변화하므로, ACL도 새로운 보안 위협, 변경된 네트워크 구성, 새로운 서비스 요구 사항에 맞게 주기적으로 검토하고 업데이트해야 합니다.

ACL 실습을 진행할 때, 위의 지침들을 철저히 따르는 것이 중요합니다.

이를 통해 네트워크 보안을 강화하고, 불필요한 접근을 효과적으로 차단할 수 있습니다.

또한, 실습 과정에서 발생할 수 있는 다양한 문제를 예방하고, 보안 정책을 효과적으로 구현할 수 있습니다.


 

패킷 트레이서 예제 파일


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

VLAN

오늘은 VLAN을 실제로 설정해 보는 실습을 진행하도록 하겠습니다.

글에 앞서 VLAN에 대해서 아직 잘 모르시겠다면 아래 글을 읽고 와주세요!

https://jdcyber.tistory.com/53

 

VLAN 이란? (쉬운 설명, 개념, 정의)

LAN을 설명하기 전에 먼저 LAN의 개념을 알고 계셔야 하는데요 혹시 LAN에 대해 아직 잘 모르신다면 제가 아래 자세하게 알기 쉽게 써놓았으니 먼저 읽고 와주시길 바랍니다!! (작성중) VLAN (Virtual LA

jdcyber.tistory.com

 

오늘 실습에 이용해 볼 소프트웨어는 패킷트레이서(Packet tracer)입니다.

패킷 트레이서(Packet Tracer)는 Cisco에서 개발한 네트워크 시뮬레이션 도구로,

네트워크 설계, 구성, 테스트 등을 가상 환경에서 실습할 수 있게 해주는 프로그램입니다.

이 도구에 대해 모르신다면 아래 글을 참조해 주세요!

(작성 중)

 


 

오늘 실습의 목적은 VLAN 생성 및 관리의 기본을 배우고,

네트워크의 논리적 분리를 이해하며, 보안과 관리 효율성을 향상시키는 방법을 학습하기 위함입니다.

사용자모드 제한된 명령어 사용, 장치설정 X Router>
관리자모드 현재 동작중인 장치 설정 내용을 볼수 있다 Router#
전역설정모드 장치 설정가능 Rourer(config)#

VLAN 생성하기

  1. VLAN 생성 명령어 입력:
    • #conf t 명령어로 글로벌 구성 모드에 진입합니다.
    • (config)#vlan 11 명령어로 VLAN 11을 생성합니다.
    • (config-vlan)#name VLAN_A 명령어로 생성된 VLAN에 이름을 지정합니다.
    • 동일한 방식으로 VLAN 12와 VLAN 13을 생성하고 각각 VLAN_B, VLAN_C라는 이름을 부여합니다.
  2. 생성된 VLAN 확인:
    • #show vlan brief 명령어를 통해 현재 스위치에 구성된 VLAN 목록과 상태를 확인할 수 있습니다. 이때, VLAN 11, 12, 13이 성공적으로 생성되었는지 확인합니다.

VLAN Access 설정하기

VLAN을 생성한 후, 각 VLAN에 특정 포트를 할당하여 네트워크 장비들이 해당 VLAN에 속하도록 설정할 수 있습니다.

  1. VLAN Access 포트 설정 명령어 입력:
    • #conf t 명령어로 다시 글로벌 구성 모드에 진입합니다.
    • (config)#int fa0/1 명령어로 인터페이스 FastEthernet 0/1을 선택합니다.
    • (config-if)#switchport mode access 명령어로 이 포트를 액세스 모드로 설정합니다.
    • (config-if)#switchport access vlan 11 명령어로 이 포트를 VLAN 11에 할당합니다.
    • 동일한 방식으로 fa0/2 포트를 VLAN 12에 할당합니다.
  2. 설정 확인:
    • #show run 명령어를 사용하여 현재 구성을 확인합니다.
    • #show vlan brief 명령어로 각 VLAN에 할당된 포트들을 확인합니다.

명령어 모음

#conf t
(config)#vlan 11
(config-vlan)#name VLAN_A
(config-vlan)#
(config-vlan)#vlan 12
(config-vlan)#name VLAN_B
(config-vlan)#
(config-vlan)#vlan 13
(config-vlan)#name VLAN_C
(config-vlan)#end

Check
#show vlan brief
 
VLAN Aceess를 설정해 보자

vlan 11 - f0/1
vlan 12 - f0/2

#conf t
(config)#int fa0/1
(config-if)#switchport mode access
(config-if)#switchport access vlan 11
(config-if)#
(config-if)#int fa0/2
(config-if)#switchport mode access
(config-if)#switchport access vlan 12
(config-if)#end

Check
#show run
#show vlan brief

주요 정리
vlan 11
name VLAN_A
int fa0/1
Switchport mode access
Switchport access vlan 11

 

실습을 진행함에 있어 아래와 같은 실수를 많이 하셔서 남겨둡니다.

  • VLAN 설정이 반영되지 않는 경우:
    • 해결 방법: show vlan brief 명령어를 사용하여 현재 VLAN 설정을 확인합니다. 설정이 올바르게 반영되지 않았다면, 설정 과정을 다시 한번 점검하고, 오타나 누락된 부분이 없는지 확인합니다.
  • 특정 포트에서 트래픽이 통과하지 않는 경우:
    • 해결 방법: 포트가 올바른 VLAN에 할당되었는지, 그리고 해당 포트의 switchport mode access 설정이 올바르게 적용되었는지 확인합니다. 또한, 해당 포트의 상태가 활성화되어 있는지 show interface [interface-id] 명령어를 통해 확인합니다.
  • VLAN 간 통신 문제:
    • 해결 방법: VLAN 간 통신이 필요한 경우, Layer 3 장비를 통한 라우팅 설정이 필요합니다. 이는 VLAN 설정과는 별도의 고급 설정이며, 관련 지식이 필요합니다. 기본적으로 VLAN은 네트워크를 논리적으로 분리하기 때문에, VLAN 간 통신을 위해서는 추가적인 설정이 요구됩니다.

 

VLAN 생성과 포트 할당 과정을 통해,

각각의 VLAN에 특정 포트를 할당함으로써 네트워크의 논리적 분리를 실습해 보았습니다.

패킷 트레이서 같은 시뮬레이션 도구를 이용하면,

네트워크 구성과 관리 기술을 손쉽게 배우고 실습해 볼 수 있습니다.


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형
반응형

ACL 접근 제어 목록 (Access Control List)

허가되지 않은 이용자가 라우터나 네트워크의 특정 자원에 접근하려고 하는 것을 차단하는 기능입니다.

첫 번째 실습에 이어 두 번째 시간입니다.


이 실습에서는 네트워크 보안의 중요한 측면인 접근 제어와 트래픽 관리를 실습합니다.

이 실습의 주된 목적은 네트워크 보안을 강화하고 특정 네트워크 트래픽을 제어하는 방법을 배우는 것입니다.
ACL을 사용하여 특정 소스에서 오는 또는 특정 목적지로 가는 트래픽을 제어하고,
네트워크 자원에 대한 무단 접근을 방지하는 방법을 배울 수 있습니다.

ACL에 대한 자세한 개념은

아래 글을 참고해 주세요!

https://jdcyber.tistory.com/17

 

ACL (Access Control List) 이란? ACL 구성 가이드: 네트워크 보안 강화를 위한 필수 지침 (쉬운 설명, 예

ACL (Access Control List) 정의 및 개념 ACL (Access Control List) 은 네트워크 보안의 핵심 구성 요소로, 네트워크 장비에서 데이터 패킷의 흐름을 제어하는 데 사용되는 일련의 지침입니다. 이 규칙들은 특

jdcyber.tistory.com

 

모든 패스워드는 'cisco'입니다.

R1, R2, R3에는 RIPv2 라우팅 업데이트 설정 완료

모든 구간 패킷 전송이 가능 상태

다음 조건에 맞게 ACL를 이용하여 R3에서 트래픽 필터링을 구현하세요

(패킷 트레이서 예제 파일은 본 글 하단에 첨부 해놨습니다.)


차단 규칙 먼저: 특정 트래픽을 차단하는 규칙은 해당 트래픽이 다른 규칙에 의해 우선적으로 허용되기 전에 평가되어야 합니다. 따라서, 트래픽을 차단하려는 규칙들은 ACL의 상단부에 배치해야 합니다.

'permit' 규칙의 위치: ACL의 마지막에는 대체로 'permit' 규칙을 두어, 이전의 모든 규칙에서 명시적으로 차단되지 않은 나머지 모든 트래픽을 허용합니다. 이는 실수로 중요한 트래픽을 차단하지 않도록 보장하는 안전장치 역할을 합니다.

정확한 순서의 중요성: 잘못된 순서로 규칙을 설정하면 의도하지 않은 트래픽 차단 또는 허용이 발생할 수 있습니다.
따라서, 각 규칙을 정확한 순서대로 설정하는 것이 네트워크 보안과 효율성을 유지하는 데 매우 중요합니다.

조건

R3는 외부에서 오는 트래픽 중 출발지 네트워크가 ‘13.13.10.0/24’인 트래픽이 내부 로컬 네트워크 ‘13.13.30.0/24’로 Telnet 접근을 차단하여라. 
(목적: 이 규칙은 민감한 내부 네트워크('13.13.30.0/24')로의 무단 Telnet 접근을 차단합니다. Telnet은 암호화되지 않은 통신을 사용하므로, 무단 접근자가 중요한 정보를 쉽게 가로챌 수 있습니다. 이 규칙은 특정 외부 네트워크('13.13.10.0/24')로부터의 잠재적인 위협을 방지하고 내부 네트워크의 보안을 강화합니다.)


R3에 위치한 HTTP/FTP 서버는 외부로부터 ICMP 공격을 받고 있는 상태이다. 외부로부터 수신하는 ICMP를 차단하여 공격을 방지하여라. 단, 서버는 외부로 Ping이 가능해야 한다.
(목적: 이 설정은 외부로부터 R3에 위치한 서버로의 ICMP 트래픽(특히 'echo' 요청, 즉 Ping)을 차단하여, 네트워크 서비스 거부(DoS) 공격과 같은 위협으로부터 서버를 보호합니다. 동시에, 서버가 네트워크 연결 상태를 확인하기 위해 외부로 Ping을 보낼 수 있도록 합니다. 이는 서버가 공격을 받지 않으면서도 정상적으로 네트워크 진단을 수행할 수 있도록 보장합니다.)


R3는 외부에서 오는 트래픽 중 출발지 네트워크가 ‘13.13.20.0/24’인 트래픽이 내부 로컬 웹서버 ‘13.13.30.3’에 접근하는 것을 차단하여라.
(목적: 이 규칙은 특정 출발지 네트워크('13.13.20.0/24')에서 내부 로컬 웹서버('13.13.30.3')로의 접근을 차단하여, 서버가 무단 접근이나 잠재적인 공격으로부터 보호되도록 합니다. 이는 웹 서버의 데이터 보안과 운영 안정성을 유지하는 데 중요합니다.)


R3는 위에 조건을 제외한 나머지 트래픽은 허용한다.
(목적: 이 규칙은 위에 명시된 조건을 제외한 모든 트래픽을 허용합니다. 이는 네트워크가 필요한 정상적인 트래픽을 차단하지 않으면서 보안을 유지할 수 있도록 합니다. 이는 네트워크의 연결성과 기능성을 보장하는 동시에 필수적인 보안 조치를 유지합니다.)

명령어

 

conf t
(R3 외부 트래픽 중 출발지 네트워크 ‘13.13.10.0/24’인 트래픽이 내부 로컬 네트워크 ‘13.13.30.0/24’로 Telnet 접근 차단)
access-list 110 deny tcp 13.13.10.0 0.0.0.255 13.13.30.0 0.0.0.255 eq23

(R3 HTTP/FTP 서버는 외부로부터 ICMP 공격을 받고 있는 상태. 외부로 수신하는 ICMP를 차단하여 공격을 방지 단, 서버는 외부로 Ping이 가능도록 설정) access-list 110 deny icmp any host 13.13.30.3 echo

(R3 외부에서 오는 트래픽 중 출발지 네트워크가 ‘13.13.20.0/24’인 트래픽이 내부 로컬 웹서버 ‘13.13.30.3’에 접근하는 것을 차단) access-list 110 deny tcp 13.13.20.0 0.0.0.255 host 13.13.30.3 eq 80

(위에 조건을 제외한 나머지 트래픽은 허용) access-list 110 permit ip any any
!
(위의 조건을 구성할때에는 최대한 간결하게 ACL를 구성하며, ACL을 R1 Serial 1/1 에 적용)
int s1/1
ip access-group 110 in
  1. Telnet 접근 차단 (출발지 네트워크 '13.13.10.0/24'에서 '13.13.30.0/24'로):
    설명: 이 단계에서는 '13.13.10.0/24' 네트워크에서 '13.13.30.0/24' 네트워크로의 Telnet 접근을 차단하는 ACL 규칙을 설정합니다. 이는 무단 접근을 막아 네트워크의 보안을 강화하는 데 중요합니다.
    명령어: access-list 110 deny tcp 13.13.10.0 0.0.0.255 13.13.30.0 0.0.0.255 eq 23

  2. ICMP 공격 방지 (HTTP/FTP 서버 '13.13.30.3'로의 ICMP 수신 차단):
    설명: 이 단계는 R3에 위치한 HTTP/FTP 서버를 ICMP 공격으로부터 보호합니다. 외부에서 서버로의 ICMP 메시지를 차단하되, 서버가 외부로 Ping을 할 수 있도록 설정합니다.
    명령어: access-list 110 deny icmp any host 13.13.30.3 echo

  3. 특정 트래픽 차단 (출발지 네트워크 '13.13.20.0/24'에서 웹서버 '13.13.30.3'로의 접근 차단):
    설명: 이 규칙은 '13.13.20.0/24' 네트워크에서 내부 로컬 웹서버 '13.13.30.3'으로의 접근을 차단합니다. 특정 네트워크 소스로부터의 웹 트래픽을 제한하여 서버 보안을 강화합니다.
    명령어: access-list 110 deny tcp 13.13.20.0 0.0.0.255 host 13.13.30.3 eq 80

  4. 나머지 트래픽 허용:
    설명: 이 규칙은 위에 나열된 조건을 제외한 모든 트래픽을 허용합니다. ACL은 위에서 아래로 규칙을 평가하므로, 맨 마지막에 'permit' 규칙을 두어 그 이외의 모든 트래픽을 통과시킵니다.
    명령어: access-list 110 permit ip any any
  •  

확인

show ip access-lists

패킷 트레이서 예제 파일

18_ACL 트래픽 필터링 예제-2.pkt
0.11MB

ACL이란?

ACL 트래픽 필터링 실습 #1

ACL 트래픽 필터링 실습 #2


궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

이웃 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

 

반응형
반응형
ACL 트래픽 필터링 실습

 

이 실습은 확장 ACL(Extended Access Control List)을 사용하여 네트워크 보안을 강화하는 방법에 대해 다룹니다.

확장 ACL은 IP 헤더의 출발지 주소, 목적지 주소, 프로토콜 등을 검사하여 패킷의 허용 또는 차단을 결정합니다.

 

ACL 접근 제어 목록

(Access Control List)

허가되지 않은 이용자가 라우터나 네트워크의 특정 자원에 접근하려고 하는 것을 차단하는 기능입니다.

 

ACL에 대한 자세한 개념은 아래 글을 참고해 주세요!

https://jdcyber.tistory.com/17

 

ACL (Access Control List) 이란? ACL 구성 가이드: 네트워크 보안 강화를 위한 필수 지침 (쉬운 설명, 예

ACL (Access Control List) 정의 및 개념 ACL (Access Control List) 은 네트워크 보안의 핵심 구성 요소로, 네트워크 장비에서 데이터 패킷의 흐름을 제어하는 데 사용되는 일련의 지침입니다. 이 규칙들은 특

jdcyber.tistory.com

 

R1에서 조건에 맞게 Extended ACL를 구성해 봅시다.

(IP Header의 Source Address, Destination Address, Protocol 등을 검사하여 분류한 , 결과에 따라 패킷 출력을 결정)

조건
출발지 네트워크가 ‘13.13.30.0/24’인 트래픽이 내부 로컬 네트워크 ‘13.13.10.1’로 Telnet 접근을 차단하여라.
(목적: 이 규칙의 주요 목적은 내부 네트워크 '13.13.10.1'로의 무단 Telnet 접근을 차단하는 것입니다. Telnet 프로토콜은 암호화되지 않은 통신을 사용하기 때문에, 민감한 데이터가 노출될 위험이 있습니다. 따라서, 특정 출발지 네트워크 '13.13.30.0/24'에서 오는 Telnet 트래픽을 차단함으로써, 무단 접근과 데이터 유출을 방지하고 네트워크 보안을 강화합니다.)
명령어: access-list 110 deny tcp 13.13.30.0 0.0.0.255 host 13.13.10.1 eq 23

외부에서 내부 서버 ’13.13.10.100’으로 Ping이 되는 것을 차단하여라. 단, '13.13.10.100' 서버는 외부로 Ping이 되어야 한다.
(목적: 이 규칙은 외부에서 내부 서버 '13.13.10.100'으로의 Ping(즉, ICMP 'echo' 요청)을 차단하여, 서버가 네트워크 서비스 거부(DoS) 공격이나 다른 형태의 네트워크 공격에 노출되는 것을 방지합니다. 동시에, 서버가 외부로 Ping을 보낼 수 있도록 설정하여 네트워크 연결 상태를 확인할 수 있게 합니다.)
명령어: access-list 110 deny icmp any host 13.13.10.100 echo

출발지 네트워크가 ‘13.13.20.0/24’인 트래픽이 내부 로컬 웹서버 ‘13.13.10.100’으로 접근하는 것을 차단하여라.
목적: 이 설정은 '13.13.20.0/24' 네트워크에서 오는 트래픽이 내부 로컬 웹서버 '13.13.10.100'으로의 접근을 차단합니다. 이는 웹 서버를 무단 접근과 잠재적인 공격으로부터 보호하며, 웹 서버의 데이터 보안과 안정성을 유지하는 데 중요합니다.
명령어: access-list 110 deny tcp 13.13.20.0 0.0.0.255 host 13.13.10.100 eq 80

위에 조건을 제외한 나머지 트래픽은 허용한다.

 

위의 조건을 구성할 때에는 최대한 간결하게 ACL를 구성하며, ACL을 R1 Serial 1/0에 적용하여라.

명령어
conf t
(출발지 네트워크가 ‘13.13.30.0/24’인 트래픽이 내부 로컬 네트워크 ‘13.13.10.1’로 Telnet 접근을 차단)
access-list 110 deny tcp 13.13.30.0 0.0.0.255 host 13.13.10.1 eq 23

(외부에서 내부 서버 ’13.13.10.100’으로 Ping이 되는 것을 차단. 단, '13.13.10.100' 서버는 외부로 Ping 가능하도록 설정)
access-list 110 deny icmp any host 13.13.10.100 echo

(출발지 네트워크가 ‘13.13.20.0/24’인 트래픽이 내부 로컬 웹서버 ‘13.13.10.100’으로 접근하는 것을 차단)
access-list 110 deny tcp 13.13.20.0 0.0.0.255 host 13.13.10.100 eq 80

(위에 조건을 제외한 나머지 트래픽은 허용)
access-list 110 permit ip any any
!
(위의 조건을 구성할때에는 최대한 간결하게 ACL를 구성하며, ACL을 R1 Serial 1/0 에 적용)
int s1/0
ip access-group 110 in

 

확인
show ip access-lists

 

(해당 기능을 통해 아래 ICMP 스마트 공격을 방어할 수 있습니다.)

 

(ICMP 스마트 공격)
SA 13.13.10.100
DA 13.13.30.255

ICMP Echo-Reply
--------------------
SA 13.13.30.X
DA 13.13.10.100

규칙 번호 유형 출발지 주소 목적지 주소 프로토콜 포트 동작
110 Deny 13.13.30.0/24 13.13.10.1 TCP 23 Telnet 접근 차단
110 Deny Any 13.13.10.100 ICMP - 외부에서의 Ping 차단
110 Deny 13.13.20.0/24 13.13.10.100 TCP 80 웹 접근 차단
110 Permit Any Any IP - 모든 트래픽 허용
- Apply ACL - - - - R1 Serial 1/0 인터페이스에 적용

 

이 표는 각 ACL 규칙의 세부 사항을 명확하게 보여줍니다.

각 규칙은 특정 트래픽 유형을 차단하거나 허용하도록 설정되어 있으며,

마지막으로 이러한 규칙들이 R1 라우터의 Serial 1/0 인터페이스에 적용됩니다.


이 실습은 네트워크 보안을 강화하는 데 필수적인 ACL의 구성 및 적용 방법을 보여줍니다. 이를 통해 특정 네트워크의 접근을 제어하고, 민감한 자원을 보호할 수 있습니다. 또한, 위험한 네트워크 트래픽을 효과적으로 차단하여 네트워크의 안전성을 유지할 수 있습니다.


ACL이란?

ACL 트래픽 필터링 실습 #1

ACL 트래픽 필터링 실습 #2

ACL 트래픽 필터링 실습 #3




궁금하신 사항은 댓글에 남겨주세요

댓글에 남겨주신 내용

추후 정리해서 올려드리겠습니다

구독 신청하시면 업로드 시 알려드릴게요!

-

조금이라도 도움이 되셨다면

공감&댓글 부탁드리겠습니다

감사합니다!

반응형

+ Recent posts