Community

게시판

자유롭게 글을 작성하고, 지식을 공유하며 소통하는 공간입니다.

지식 공유

폐쇄망에서 웹서버(Apache) 구성하기

## Docker OS 컨테이너 준비 1. 이미지를 받는다. [rocky linux 8.10] docker pull rockylinux/rockylinux:8.10 2. 편하게 작업 할 컨테이너를 하나 띄우고 쉘로 접근한다. docker run -it --name rocky-localrepo rockylinux/rockylinux:8.10 /bin/bash ## 어떤 패키지를 오프라인에서 설치하게 만들지 정한다. 우리가 미리 받아오는 RPM 목록이 곧 그쪽이 쓸 수 있는 설치 가능 목록이 된다. 예시로 httpd, mod\_ssl, php, openssl, vim, 이런 식으로 결정한다고 하자. 참고로 Rocky Linux에서 의존성까지 같이 받아오려면 dnf download를 쓴다. 1. 필요한 유틸 설치 dnf install -y dnf-plugins-core createrepo tar * dnf-plugins-core 안에 dnf download 들어있다. * createrepo는 로컬 리포지토리 메타데이터 만드는 툴. * tar는 마지막에 묶어서 전달 2. RPM들을 모아 둘 디렉토리 생성 mkdir -p /repo/base cd /repo/base 3. 의존성 가져오기 dnf download --resolve httpd * --resolve를 붙이면 httpd가 필요로 하는 의존 라이브러리까지 전부 rpm 파일로 같이 떨어진다. 원하는 다른 패키지도 계속 추가로 긁어올 수 있다. * dnf download --resolve mod\_ssl * dnf download --resolve php * dnf download --resolve openssl * dnf download --resolve vim-enhanced ## 핵심 요약 1. Windows에서: * docker run -it rockylinux:8.10 * 컨테이너 안에서 dnf install -y dnf-plugins-core createrepo tar * /repo/base 폴더 만들고 dnf download --resolve * createrepo /repo/base * /repo/local-httpd.repo 만들어두기 * tar czvf /repo\_bundle.tgz /repo * docker cp로 호스트로 꺼냄 2. 폐쇄망 Rocky 서버에서: * /opt/localrepo 에 압축 풀기 * /etc/yum.repos.d/ 에 .repo 복사 * dnf install 테스트 # 리버스 프록시 설정 ### httpd.conf LoadModule proxy\_module modules/mod\_proxy.so LoadModule proxy\_http\_module modules/mod\_proxy\_http.so LoadModule ssl\_module modules/mod\_ssl.so ServerName otp.pola.or.kr ``` SSLEngine on SSLCertificateFile /path/to/otp.pola.or.kr.crt SSLCertificateKeyFile /path/to/otp.pola.or.kr.key SSLCertificateChainFile /path/to/chain.pem # ↑ DMZ 웹서버가 직접 HTTPS를 종료(terminate)해야 하니까 인증서는 DMZ에 있어야 해 # 클라이언트가 /sln/... 으로 들어온 요청을 내부망 sso.pola.or.kr로 프록시 ProxyPreserveHost On ProxyPass /sln/ https://sso.pola.or.kr/sln/ ProxyPassReverse /sln/ https://sso.pola.or.kr/sln/ # (선택) 특정 URI만 보낼 수도 있음. 예: /sln/pola/user/regist/step 만 # ProxyPass /sln/pola/user/regist/step https://sso.pola.or.kr/sln/pola/user/regist/step # ProxyPassReverse /sln/pola/user/regist/step https://sso.pola.or.kr/sln/pola/user/regist/step # 보안 헤더 같은 것도 보통 여기서 달아줌 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s RequestHeader set X-Forwarded-Host %{HOST}s ```

지식 공유

WEB(Apache) WAS(Tomcat) Reserve Proxy 방식 연동하기

## 기본 개념 1. 사용자는 https://example.com (80/443, Apache로 진입) 2. Apache가 받아서 내부의 Tomcat으로 대신 요청을 보내줌 (http://127.0.0.1:8080) 3. Apache는 Tomcat 응답을 다시 클라이언트에게 전달 *** ## Tomcat 준비 conf/server.xml안에 설정 ``` ``` ## Apache httpd 모듈 켜기 리눅스 계열(예: Rocky/Ubuntu 등)은 보통 /etc/httpd 또는 /etc/apache2 아래 있고, 윈도우면 Apache24/conf/httpd.conf 안에 모듈 로드하는 라인이 있다. ``` LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule headers_module modules/mod_headers.so ``` mod\_headers는 나중에 Server 헤더 같은 거 숨길 때 쓸 거라 같이 켜두는 게 좋다. ## Apache 가상호스트(or httpd.conf)에 Reserve Proxy 설정 이제 Apache에게 "들어온 요청 그냥 Tomcat:8080으로 보내라" 라고 알려주면 끝. HTTP만 (80포트)인 경우 예시 아파치 설정 파일 어딘가(VirtualHost 블록) 혹은 그냥 httpd.conf에 아래 설정 추가 ``` ServerName mysite.local # 외부에서 접속할 도메인/호스트명 (없어도 돌아가긴 함) # 클라이언트 -> Apache -> Tomcat ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ # (선택) Tomcat 서버 정보 숨기기 Header unset Server Header unset X-Powered-By # (선택) 정적 파일은 Apache가 직접 서빙하고 싶으면 이런 식으로 location(Directory) 따로 줄 수도 있음 # Alias /static/ "D:/web/static/" ``` 이렇게 하면: - 사용자가 http://mysite.local/board/list 로 접근 - Apache가 내부적으로 http://127.0.0.1:8080/board/list 로 요청 넘김 - 응답을 그대로 돌려줌 HTTPS까지 (443포트, SSL 인증서 Apache에 적용) 하는 경우 ``` ServerName mysite.local SSLEngine on SSLCertificateFile "C:/Apache24/conf/ssl/mysite.crt" SSLCertificateKeyFile "C:/Apache24/conf/ssl/mysite.key" # 필요하면 중간체(체인) cert도 SSLCertificateChainFile 등으로 설정 ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ Header unset Server Header unset X-Powered-By ``` ## Apache 재시작 리눅스 (RHEL/Rocky/CentOS 계열 예): ``` sudo systemctl restart httpd ``` Ubuntu 계열은: ``` sudo systemctl restart apache2 ```

지식 공유

간단하게 DB 암호화 함수 만들기

**설명** 이 함수는 Base64로 인코딩하고, 복호화 하는 함수 입니다. 운영 서버에 DB암호화 기능이 있을 때 로컬에는 제공을 안해주니 불편하실 때 참고하셔서 사용하시면 좋을 것 같아 공유 합니다. ## 인코딩 함수 만들기 ```CREATE OR REPLACE FUNCTION pls_encrypt_b64_id ( p_input VARCHAR2, -- Base64 문자열로 인코딩 p_dummy NUMBER DEFAULT 101 -- 의미 없는 파라미터, 인터페이스 유지용 ) RETURN VARCHAR2 IS BEGIN RETURN UTL_ENCODE.TEXT_ENCODE(p_input, 'UTF8', UTL_ENCODE.BASE64); END; ``` ## 디코딩 함수 만들기 ```jsx CREATE OR REPLACE FUNCTION pls_decrypt_b64_id ( p_input VARCHAR2, p_dummy NUMBER DEFAULT 101 -- 의미 없는 파라미터, 인터페이스 유지용 ) RETURN VARCHAR2 IS l_raw RAW(32767); BEGIN -- Base64 decode(문자셋 변환 없이 처리) l_raw := UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(p_input)); -- RAW -> VARCHAR2 RETURN UTL_I18N.RAW_TO_CHAR(l_raw, 'UTF8'); END; ``` ## 함수 생성 시 잘 생성 되었는지 확인 하기 ```jsx SELECT object_name, object_type, status FROM all_objects WHERE object_name = UPPER(’함수명'); ``` ## 함수 삭제 ```jsx DROP FUNCTION 함수명; ``` ## ERROR 확인 ```jsx SELECT * FROM USER_ERRORS WHERE NAME = UPPER('함수명') AND TYPE = 'FUNCTION'; ``` ## 인코딩 예시 ```jsx SELECT pls_encrypt_b64_id('123123', 101) FROM dual; ``` ## 디코딩 예시 ```jsx SELECT pls_decrypt_b64_id('MTIzMTIz', 101) FROM dual; ```