Loading...

운영체제

rhel 16 / 1 페이지
Nginx 방식Nginx에는 RewriteRule이 없고 try_files를 사용합니다. 예시:server { listen 80; server_name example.com; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ $uri.php; } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP-FPM 소켓 또는 127.0.0.1:9000 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; }}동작 원리 /test 요청 → try_files가 순서대로 확인: /var/www/html/test (파일) /var/www/html/test/ (디렉토리) /var/www/html/test.php (php 파일) 만약 test.php가 있으면 PHP-FPM으로 전달됨. 따라서 주소창엔 .php 안 붙여도 됩니다.PHP 전용 경로 제한 (보안) 보통 .php를 직접 노출하지 않고 싶다면 .php 요청을 막고 위 규칙만 허용하는 방법도 있습니다:location ~ \.php$ { return 404; # 직접 .php 호출 차단}캐싱 및 SEO 고려 .php 숨기면 URL이 "정적인 URL"처럼 보여서 SEO에도 이점이 있음. 하지만 .php와 .php 없는 버전이 둘 다 접근 가능하다면 중복 콘텐츠가 됩니다. → 해결: .php 직접 접근 시 301 리다이렉트 처리.location ~ \.php$ { if ($request_uri ~ ^(.+)\.php$) { return 301 $1; # .php 빼고 리다이렉트 }}
940 조회
2025.09.09 등록
Apache 방식Apache에서는 보통 이렇게 씁니다 (.htaccess):RewriteEngine OnRewriteCond %{REQUEST_FILENAME}.php -fRewriteRule ^([^/]+)/?$ $1.php [L]
718 조회
2025.09.09 등록
실패한 로그인 시도 확인하는 방법sudo lastb예시 출력:user1 ssh:notty 192.168.1.5 Fri Aug 2 15:14 - 15:14 (00:00) root ssh:notty 203.0.113.8 Thu Aug 1 08:10 - 08:10 (00:00)user1, root: 로그인 시도한 사용자ssh:notty: 로그인 방식IP: 접속 IP시간: 시도한 시간최근 N개만 보기sudo lastb | head -n 20특정 아이디 제외한 최근 20건 보기lastb | grep -v '^root' | head -n 20
789 조회
2025.09.07 등록
1. ipset 셋 생성ipset create myblocklist hash:netmyblocklist: set 이름hash:net: IP 대역(CIDR)을 허용하는 타입???? hash:ip은 단일 IP만 저장 가능???? hash:net은 IP 대역 (예: 192.168.0.0/24) 저장 가능2. IP 대역 추가ipset add myblocklist 192.168.100.0/24 ipset add myblocklist 10.10.0.0/163. iptables 또는 firewalld에 적용 iptables 직접 사용하는 경우:iptables -I INPUT -m set --match-set myblocklist src -j DROP 이렇게 하면 myblocklist에 포함된 IP 또는 대역에서 들어오는 요청은 모두 DROP 됩니다. firewalld와 함께 사용하는 경우:firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -m set --match-set myblocklist src -j DROP firewall-cmd --reload ipset 상태 확인ipset list myblocklist 영구 적용을 위해 ipset은 기본적으로 비영구적입니다. 시스템 재부팅 후 유지하려면 수동 저장 및 복원이 필요합니다. 1. 저장ipset save > /etc/ipset.conf 2. 부팅 시 복원 설정 (예: systemd)/etc/systemd/system/ipset-restore.service 예제:[Unit] Description=Restore ipset rules Before=firewalld.service [Service] Type=oneshot ExecStart=/sbin/ipset restore < /etc/ipset.conf [Install]systemctl enable ipset-restore WantedBy=multi-user.target 정리작업명령IP 대역용 set 생성ipset create myblocklist hash:netIP 대역 추가ipset add myblocklist 1.2.3.0/24iptables에 연동iptables -I INPUT -m set --match-set myblocklist src -j DROPfirewalld에 연동firewall-cmd --permanent --direct --add-rule ...저장 및 복원ipset save > /etc/ipset.conf + systemdset 안의 특정 IP 또는 대역 삭제ipset del [set이름] [IP 또는 대역]
844 조회
2025.09.07 등록
Match User sftpuser ChrootDirectory /home/sftpuser ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no기본 개념 SSH는 로그인 + SFTP + 포트포워딩 같은 기능을 모두 포함하고 있음. internal-sftp를 강제로 실행하면 쉘 접근은 막히고, SFTP만 동작함. 여기에 ChrootDirectory를 같이 써서 홈 디렉토리만 접근하도록 제한 가능.Match User : 해당 사용자만 적용ChrootDirectory : 루트 제한 (이 디렉토리는 root:root 소유여야 함)ForceCommand internal-sftp : 쉘 로그인 막고 SFTP만 허용AllowTcpForwarding no, X11Forwarding no : 다른 SSH 기능 차단
815 조회
2025.09.07 등록
예전 Nginx (1.25 이전 버전)listen 443 ssl http2;신규 Nginx (1.25.1 이후)listen ... http2 방식이 deprecated(사용 중단 예정) 되었고, 대신 별도의 지시어 http2; 를 사용해야 합니다.listen 443 ssl;http2 on;
803 조회
2025.09.07 등록
1️⃣ SFTP 전용 그룹 생성# 예: sftpusers 그룹 생성sudo groupadd sftpusersSFTP로 제한할 계정을 이 그룹에 넣습니다:sudo usermod -aG sftpusers username2️⃣ SSHD 설정 변경/etc/ssh/sshd_config 파일 열기:sudo vi /etc/ssh/sshd_config파일 끝에 SFTP 전용 설정 추가:# SFTP 전용 설정Match Group sftpusers ChrootDirectory /home/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding noChrootDirectory /home/%u→ 계정 로그인 시 /home/username 을 루트(/)로 제한합니다.ForceCommand internal-sftp→ SSH 접속을 통한 쉘 사용 금지, SFTP만 허용3️⃣ 디렉토리 권한 설정 Chroot 디렉토리는 root 소유여야 하고, 쓰기 권한은 하위 디렉토리에만 줘야 합니다.# 루트 Chroot 디렉토리 소유자 rootsudo chown root:root /home/usernamesudo chmod 755 /home/username# 업로드/다운로드용 실제 작업 디렉토리 생성sudo mkdir /home/username/datasudo chown username:sftpusers /home/username/datasudo chmod 755 /home/username/data이렇게 하면 사용자는 /home/username 상위 디렉토리에는 쓰기/접근 불가실제 파일 작업은 /home/username/data 에서만 가능4️⃣ SSHD 재시작sudo systemctl restart sshd 5️⃣ 테스트외부 클라이언트에서 SFTP 접속 경로 상위로 접근 불가, 지정한 디렉토리만 접근 가능 pwd 명령으로 /가 실제 계정 홈 디렉토리로 제한되는지 확인요약항목설정접근 제한ChrootDirectory /home/%uSFTP 전용ForceCommand internal-sftp루트 디렉토리 권한root:root, 755실제 작업 디렉토리하위 디렉토리에 사용자 소유권
730 조회
2025.09.07 등록
외부 서버에서 SSH 키 생성외부 서버에서 실행:ssh-keygen -t ed25519 -C "cert-sync"저장 경로: 그냥 엔터 → ~/.ssh/id_ed25519 에 저장됨 passphrase: 그냥 엔터 → 비밀번호 없음 생성된 파일: 공개키: ~/.ssh/id_ed25519.pub 비밀키: ~/.ssh/id_ed25519공개키를 내부 서버에 등록 외부 서버에서 내부 서버로 키 복사:ssh-copy-id -i ~/.ssh/id_ed25519.pub user@내부서버IP접속 테스트외부 서버에서 비밀번호 없이 접속되는지 확인:ssh user@내부서버IP
757 조회
2025.09.07 등록
목표: 외부에서 Host의 65000, 65001 포트로 접속하면, Guest의 FTP 20, 21 포트로 포워딩.iptables (nft 사용 전 방식)# 외부 65000 → 게스트 21iptables -t nat -A PREROUTING -p tcp --dport 65000 -j DNAT --to-destination 192.168.122.100:21# 외부 65001 → 게스트 20iptables -t nat -A PREROUTING -p tcp --dport 65001 -j DNAT --to-destination 192.168.122.100:20# SNAT / MASQUERADEiptables -t nat -A POSTROUTING -o virbr0 -j MASQUERADE방화벽 설정 (firewalld 사용 시)firewall-cmd --permanent --add-forward-port=port=65000:proto=tcp:toaddr=192.168.122.100:toport=21firewall-cmd --permanent --add-forward-port=port=65001:proto=tcp:toaddr=192.168.122.100:toport=20firewall-cmd --reload확인외부 클라이언트에서:ftp -p <host_public_ip> 65000
723 조회
2025.09.07 등록
1. 기본 CORS 원리브라우저는 출발 도메인(aa.aaa.com)과 응답 도메인(aaa.com)이 다르다고 판단 → CORS 헤더 필요. 즉, aaa.com 서버에서 Access-Control-Allow-Origin 등을 내려줘야 함.2. nginx 설정 예시(1) 단일 서브도메인 허용server { listen 443 ssl; server_name aaa.com; location / { # 실제 서비스 처리 proxy_pass http://backend; # CORS 허용 헤더 add_header 'Access-Control-Allow-Origin' 'https://aa.aaa.com' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always; add_header 'Access-Control-Allow-Credentials' 'true' always; # Preflight (OPTIONS) 요청 처리 if ($request_method = OPTIONS) { add_header 'Access-Control-Allow-Origin' 'https://aa.aaa.com' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always; add_header 'Access-Control-Allow-Credentials' 'true' always; return 204; } }}(2) 모든 서브도메인 허용 (정규식 매칭)nginx는 Access-Control-Allow-Origin에 와일드카드(*)를 쓰면 credentials(쿠키, 세션) 허용이 불가능해요. 그래서 보통 Origin 헤더를 읽어서 동적으로 반영합니다.map $http_origin $cors_origin { default ""; "~^https?://([a-z0-9-]+)\.aaa\.com$" $http_origin;}server { listen 443 ssl; server_name aaa.com; location / { proxy_pass http://backend; if ($cors_origin != "") { add_header 'Access-Control-Allow-Origin' $cors_origin always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always; add_header 'Access-Control-Allow-Credentials' 'true' always; } if ($request_method = OPTIONS) { return 204; } }}3. 체크리스트 프론트엔드 요청 코드: fetch나 axios 요청 시 credentials: 'include' 필요 여부 확인. SSL: 반드시 HTTPS 환경에서 테스트 (특히 크롬). OPTIONS 요청이 제대로 처리되는지 확인 (nginx에서 빠뜨리면 405 에러).
667 조회
2025.09.07 등록
특정작업을 반복해야되는데 수동으로 하기에는 힘든점이 많다.이때 실행파일을 만든후 크론을 이용하여 등록하는 예제/usr/local/bin/call_urls.sh#!/bin/bash# 호출할 주소 목록urls=( "https://a.com" "https://b.com" "https://c.com" "https://d.com")for url in "${urls[@]}"; do curl -s -o /dev/null "$url"done:wqchmod +x /usr/local/bin/call_urls.sh/////////////////////////////////////////////////////////crontab -e0 23 * * * /usr/local/bin/call_urls.sh:Wq
763 조회
2025.09.06 등록
Failed to load module script: Expected a JavaScript-or-Wasm module script but the server responded with a MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.이 에러 메시지는 브라우저가 <script type="module">로 불러온 자바스크립트 파일의 MIME 타입이 올바르지 않아서 발생합니다. 브라우저는 ES 모듈을 로드할 때 반드시 text/javascript MIME 타입이 필요하며, 서버에서 application/octet-stream으로 내려주면 로딩을 거부합니다.보통 /etc/nginx/mime.types 파일에text/javascript mjs; 추가javascript 파일은application/javascript js;mjs 즉 javascript module 파일은text/javascript mjs;
846 조회
2025.09.06 등록
이 오류는 빌드한 환경의 glibc 버전이 실행할 환경보다 신버전이기 때문에 발생합니다. 즉, 실행 머신의 glibc가 2.34 미만인데, 컴파일러가 2.34 이상의 심볼을 링크해버린상태.결 방법 (현실적으로 가능한 선택지)1. 하위 버전 glibc 환경에서 빌드 가장 확실한 방법은 실행할 서버와 동일하거나 더 낮은 리눅스 배포판에서 Lazarus/FPC를 설치하고 빌드하는 것입니다. 예) 실행 서버가 CentOS 7(glibc 2.17)이면 CentOS 7 Docker 컨테이너에서 빌드.2. musl libc 사용 (glibc 의존도 제거) Free Pascal은 glibc 대신 musl을 이용해서 빌드 가능. musl-gcc를 설치한 후 fpc.cfg에 cross-binutils 지정. 이렇게 빌드하면 glibc 버전 문제 없이 더 이식성 높은 실행 파일을 얻을 수 있습니다. 3. Static linking (정적 링크) 일부 경우 -static 옵션을 사용해서 glibc를 정적으로 링크할 수 있지만, glibc는 완전 정적링크를 권장하지 않습니다(문제 생길 수 있음). 대신 musl libc 정적 링크가 안전합니다. 4. fpc 옵션에서 libc 버전 낮추기 → 불가능 FPC 자체에는 glibc 버전을 낮추는 옵션은 없습니다. 이유: glibc 심볼을 선택하는 것은 링커와 시스템의 libc에 의존하기 때문입니다. 즉, "컴파일러 옵션으로 glibc 버전 낮춤"은 할 수 없고, 반드시 낮은 glibc 환경에서 빌드해야 합니다. glibc는 일반적으로 하위 호환성(backward compatibility) 을 유지합니다.즉, 옛날에 빌드된 프로그램은 새 glibc에서 잘 돌아가는 경우가 많습니다.
746 조회
2025.09.06 등록
crontab 시간 설정법Desc기본적으로 아래와 같이 공백(space)으로 5개 값을 구분하여 설정한다. 1 11 3 * * <SHELL_PATH> 분 시 일 월 요일 쉘스크립트경로1번째분(minute)을 의미, 몇 분에 실행 할 것인지 설정한다.ex) 1 11 3 * * <SHELL_PATH>XX일 XX시 '01분'에 실행*을 설정할 경우, 매분(1분 마다) 실행을 의미2번째시간(hour)을 의미, 몇 시에 실행 할 것인지 설정한다.ex) 1 11 3 * * <SHELL_PATH>XX일 '11시' 01분에 실행*을 설정할 경우, 매시간(1시간 마다) 실행을 의미3번째일(day of month)을 의미, 몇 일에 실행 할 것인지 설정한다.ex) 1 11 3 * * <SHELL_PATH>'3일' 11시 01분에 실행*을 설정할 경우, 매일 실행을 의미4번째월(month)을 의미, 몇 월에 실행 할 것인지 설정한다.ex) 1 11 3 5 * <SHELL_PATH>'5월' 3일 11시 01분에 실행*을 설정할 경우, 매월 실행을 의미5번째요일(day of week)을 의미, 무슨 요일에 실행 할 것인지 설정한다.0 ~ 6 사이의 값을 설정 (0: 일요일, 6: 토요일)ex) 1 11 3 * 3 <SHELL_PATH>매달 3일 11시 01분 수요일에 실행*을 설정할 경우, 매일 실행을 의미ExamplesExpressionsDesc* * * * *매일 1분마다 실행5 * * * *매일 매시간 05분에 실행 (1시간 간격으로 실행)*/5 * * * *매일 5분마다 실행*/10 * * * *매일 10분마다 실행0,10,20,30,40,50 * * * *매일 10분마다 실행0 18 * * *매일 18시 00분에 실행45 22 * * *매일 22시 45분에 실행28 03 * * *매일 03시 28분에 실행* 1 * * *매일 01시 00분 ~ 01시 59분 사이에 1분 간격으로 실행0 */1 * * *매일 1시간 간격으로 실행 (매시간 00분)0 */12 * * *매일 12시간마다 실행0 6,12 * * *매일 06시, 12시에 실행10 2-5 * * *매일 02시 ~ 05시 사이 매시간 10분에 실행(02시 10분, 03시 10분, 04시 10분, 05시 10분)5 8-20/3 * * *매일 08시 ~ 20시 사이 3시간 간격으로 05분에 실행(08시 05분, 11시 05분, 14시 05분, 17시 05분, 20시 05분)42 4 10 * *매달 10일 04시 42분에 실행30 5 1,15 * *매달 1일과 15일 05시 30분에 실행0-10 17 1 * *매달 1일 17시 00분 ~ 17시 10분까지 1분 단위로 실행0 17 * * 1매주 월요일 17시 00분에 실행0,10 17 * * 0,2,3매주 일, 화, 수요일 17시 00분과 17시 10분에 실행0 0 1,15 * 1매달 1일과 15일 그리고 월요일 24시 00분에 실행0 6,12 * * 0,3수, 일요일마다 06시, 12시에 실행0 21 * * 1-6월 ~ 토 21시 00분에 실행
798 조회
2025.08.31 등록
RHEL9 Selinux 활성화방법selinux는 보안관련으로 실제 사용시 해제 하지 않고 사용하기////////////////////////////////////////////////////////////////vi /etc/selinux/configSELINUX=enforcing:wq////////////////////////////////////////////////////////////////sudo grubby --update-kernel ALL --remove-args selinux
739 조회
2025.08.30 등록
홈으로 전체메뉴
전체 검색
회원가입