Oracle Cloud Console 접근을 위한 Proxy 설정하기 - mitmproxy
Console 접근을 위한 방화벽에 등록할 주소 찾기
OCI Documentation 기준으로 외부 인터넷 접근을 통제하는 곳에서 Console 접근을 위해서는 방화벽 또는 Proxy Server 아래 주소에 아래 주소를 등록하여, 인터넷 접근이 허용되도록 하여야 합니다.
-
OCI Documentation - Allowing Access to the Console from Your Network
-
OCI Console과 통신은 HTTP (80), HTTPS (443) 사용
*.oracle.com *.oraclecloud.com *.oracleinfinity.io oracle.112.2o7.net consent.trustarc.com (Console cookie preferences)
2. mitmproxy Server 테스트
mitmproxy Server 설치하기
-
Compute VM을 생성합니다.
-
mitmproxy Server를 설치합니다.
wget https://downloads.mitmproxy.org/12.2.3/mitmproxy-12.2.3-linux-x86_64.tar.gz -o mitmproxy.tar.gz tar -xzf mitmproxy.tar.gz sudo mv mitmproxy /usr/local/bin/ sudo mv mitmdump /usr/local/bin/ sudo mv mitmweb /usr/local/bin/ -
사용하는 포트를 방화벽에서 개방합니다.
sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload -
Security List에서도 Ingress에 해당 포트를 등록합니다.
-
서버 시작 및 활성화
mitmdump
테스트 클라이언트(Windows) 설정
-
Window Server로 Compute VM을 생성합니다.
-
현재는 모든 웹이 접속이 가능한 상태입니다.
-
Setting > Network & Internet > Proxy 으로 이동하여 설정합니다.
-
Automatically detect settings: Off
-
Use a proxy server: On
-
Address: mitmproxy Server의 IP
-
Port: 기본 포트 8080
-
-
다시 브라우저로 접속해 보면 동일하게 모두 접속되지만, mitmproxy를 거쳐가는 로그가 보입니다.
[opc@mitmproxy ~]$ mitmdump [09:24:10.417] HTTP(S) proxy listening at *:8080. [09:24:13.204][10.0.0.17:62409] client connect [09:24:13.211][10.0.0.17:62409] server connect www.bing.com:443 (203.251.233.234:443) 10.0.0.17:62409: GET https://www.bing.com/qbox?query=&language=en-US&pt=EdgBox&cvid=8f26b4ea75734f34bf32593d149da57b&oit=0&ri… HTTP/2.0 ... -
브라우저에서 https://mitm.it 에 접속합니다. 상단에 인증서 오류가 난 것을 알 수 있습니다.
-
사이트가 뜨면, 링크를 클릭하여 인증서를 다운로드 받습니다. 이후 Manual Installation에 따라 인증서를 설치합니다.
-
다운로드 받는 P12 파일을 더블클릭하여 실행합니다.
-
저장 위치를 선택합니다.
-
패스워드를 빈값 그대로 합니다.
-
인증서 저장소로 Trusted Root Certification Authories를 선택합니다.
-
mitm.it 사이트를 재접속하면, 아래와 같이 https로 인증서 오류없이 접속된 것을 확인할 수 있습니다.
-
Addon을 통해 필터링하기
따로 설정하지 않는 경우, 모두 연결이 허용되는 것을 확인하였습니다.
Console 접근을 위한 방화벽에 등록할 주소들을 ignore_hosts 옵션을 통해 바이패스하도록 지정해도 됩니다. 하지만, 실제 사용하는 tenant에 한정하여 접근하도록 요구하는 경우에는 Addon 개발 방법을 사용하여 추가 파이썬 코드를 작성하여, 코드내에서 처리해야합니다. 여기서는 이 방법을 알아봅니다.
-
mitmproxy가 실행중인 서버에 whitelist.py 파일은 작성합니다. 코드내에 ALLOWED_TENANTS에 허용한 테넌트 이름을 입력합니다.
import re import logging from urllib.parse import urlparse from mitmproxy import http logger = logging.getLogger(__name__) # 허용할 tenant ALLOWED_TENANTS = { "demo-tenant", } ALLOWED_EXACT = { "oracle.112.2o7.net", "consent.trustarc.com", } ALLOWED_SUFFIXES = ( ".oracle.com", ".oraclecloud.com", ".oracleinfinity.io", ".ocir.io", ) LOGIN_HOST_PATTERN = re.compile( r"^login\.[^.]+\.oraclecloud\.com$", re.IGNORECASE ) logger = logging.getLogger(__name__) def allowed(host: str) -> bool: host = host.lower() return host in ALLOWED_EXACT or any(host.endswith(s) for s in ALLOWED_SUFFIXES) def http_connect(flow: http.HTTPFlow): host = flow.request.host.lower() if not allowed(host): flow.response = http.Response.make(403, b"Blocked") def request(flow: http.HTTPFlow): host = flow.request.host.lower() if not allowed(host): flow.response = http.Response.make(403, b"Blocked") return # Query String 제외 path = urlparse(flow.request.url).path # 정확히 이 로그인 authorize 요청일 때만 tenant 검사 if ( LOGIN_HOST_PATTERN.match(host) and path == "/v1/oauth2/authorize" and flow.request.query.get("action") == "login" and flow.request.query.get("client_id") == "iaas_console" ) or ( LOGIN_HOST_PATTERN.match(host) and path == "/v2/ui/domains" and flow.request.query.get("action") == "login" and flow.request.query.get("client_id") == "iaas_console" ): tenant = flow.request.query.get("tenant") logger.info(f"##### tenant: {tenant}") if tenant not in ALLOWED_TENANTS: flow.response = http.Response.make( 403, b"Forbidden tenant", {"Content-Type": "text/plain"}, ) return -
작성한 Addon을 사용하도록 mitmproxy 재시작
mitmdump -s whitelist.py -
http://cloud.oracle.com 에 접속해 Cloud Account Name을 ALLOWED_TENANTS에 없는 이름으로 접속을 시도합니다. 아래와 같이 403 오류가 발생합니다.
-
ALLOWED_TENANTS에 있는 이름으로 접속을 시도합니다. 로그인 페이지로 잘 이동하는 것을 볼 수 있습니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.