<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>VoidNoble IT Zone</title>
    <link>https://itzone.tistory.com/</link>
    <description>컴퓨터,프로그래밍,데이터베이스,웹,Javascript,jquery,css,디자인,php,asp,mysql,mssql,node,android,ios</description>
    <language>ko</language>
    <pubDate>Tue, 23 Jun 2026 20:31:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>공허공자</managingEditor>
    <image>
      <title>VoidNoble IT Zone</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2241CE47548E3AED36</url>
      <link>https://itzone.tistory.com</link>
    </image>
    <item>
      <title>라이믹스 인증 폼 Captcha 나타나지 않을때 스킨에 강제 추가</title>
      <link>https://itzone.tistory.com/768</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 페이지에서 Captcha 사용 설정 했는데&lt;br /&gt;로그인 페이지에서 나타나지 않을때&lt;br /&gt;스킨 html 파일에 강제 추가하는 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Captcha 서비스 중 Cloudflare Turnstile 적용 사례 :&lt;/p&gt;
&lt;pre id=&quot;code_1749792085236&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{@
    $captcha_class = 'Rhymix\\Modules\\Spamfilter\\Captcha\\Turnstile';
    $config = ModuleModel::getModuleConfig('spamfilter') ?: new stdClass();
    $captcha_class::init($config-&amp;gt;captcha);
    $captcha = new $captcha_class();
    $target_actions = [
        'dispMemberLoginForm',
        'procMemberLogin',
        'dispMemberSignUpForm',
        'procMemberSignUp',
        'dispMemberFindAccount',
        'procMemberFindAccount',
    ];
    $captcha-&amp;gt;setTargetActions($target_actions);
    $captcha-&amp;gt;addScripts();
    Context::set('captcha', $captcha);
}

&amp;lt;div class=&quot;control-group captcha&quot; cond=&quot;isset($captcha)&quot;&amp;gt;
    {$captcha}
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹프로그래밍/PHP</category>
      <category>CAPTCHA</category>
      <category>rhymix</category>
      <category>라이믹스</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/768</guid>
      <comments>https://itzone.tistory.com/768#entry768comment</comments>
      <pubDate>Fri, 13 Jun 2025 14:26:05 +0900</pubDate>
    </item>
    <item>
      <title>CrowdSec 방화벽 다중 서버 셋팅</title>
      <link>https://itzone.tistory.com/767</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;crowdsec_logo.jpg&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czaCWX/btsOsQI7NLB/VvUzb1wQ3Elfgds6Kg0se0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czaCWX/btsOsQI7NLB/VvUzb1wQ3Elfgds6Kg0se0/img.jpg&quot; data-alt=&quot;CrowdSec logo&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czaCWX/btsOsQI7NLB/VvUzb1wQ3Elfgds6Kg0se0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczaCWX%2FbtsOsQI7NLB%2FVvUzb1wQ3Elfgds6Kg0se0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2312&quot; height=&quot;1561&quot; data-filename=&quot;crowdsec_logo.jpg&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CrowdSec logo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본 지식&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오픈소스 보안 솔루션&lt;/li&gt;
&lt;li&gt;분산형 - 다중 서버에서 IP 차단 및 허용 규칙 공유&lt;/li&gt;
&lt;li&gt;fail2ban의 단일서버 커버리지 단점의 대안&lt;/li&gt;
&lt;li&gt;에이전트-커맨드센터 구성으로, 여러 서버들의 위협 감지를 한곳에서 가능하게&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구성요소&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Collection&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파서 + 시나리오 + 포스트 오버플로우 &lt;b&gt;묶음&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Crowdsec Hub에서 다양한 컬렉션을 찾아 설치 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파서 (Parsers):&lt;/b&gt; Fail2ban의 패턴 매칭과 유사하게 로그 파일을 필터링하는 역할을 합니다. SSH 서비스의 경우, 실패한 로그인 시도만 골라내는 식입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시나리오 (Scenarios):&lt;/b&gt; 특정한 상황을 나타내는 임계값 역할을 합니다. 예를 들어 SSH 서비스에서 60초 동안 10번의 로그인 실패가 있을 경우, 무차별 대입 공격으로 간주하는 시나리오를 설정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;포스트 오버플로우 (Postoverflows):&lt;/b&gt; 컬렉션에 포함될 수 있는 목록입니다.&lt;/li&gt;
&lt;li&gt;종류 사례
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;crowdsecurity/sshd SSH를 보호하는 데 필요한 모든 것&lt;/li&gt;
&lt;li&gt;crowdsecurity/nginx 웹 서버 보호&lt;/li&gt;
&lt;li&gt;crowdsecurity/linux 일반적인 Linux 로그 및 동작&lt;/li&gt;
&lt;li&gt;crowdsecurity/wordpress WordPress 관련 공격을 감지합니다.&lt;/li&gt;
&lt;li&gt;crowdsecurity/mysql MySQL 서비스를 보호합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Decision&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐지된 악성 IP 주소, 범위, 사용자 등에 대해 취해지는 조치&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ip decision의 경우 ipset (iptable 개선판) 차단 및 허용 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Bouncer&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결정을(조치를) 실행&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에이전트로부터 결정을 받아 해당 IP 주소의 접근을 차단하거나 Captcha를 제시하는 등의 대응 수행&lt;/li&gt;
&lt;li&gt;CrowdSec 커뮤니티에서 공유된 IP 평판 데이터베이스를 활용하여 악성 IP 주소를 사전에 차단&lt;/li&gt;
&lt;li&gt;종류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Firewall Bouncer&lt;/b&gt;: iptables, nftables, ipset, pf 등의 방화벽과 연동하여 IP 주소 차단.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Traefik Bouncer&lt;/b&gt;: Traefik 리버스 프록시와 연동하여 악성 IP의 접근 제어.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nginx Bouncer&lt;/b&gt;: Nginx와 연동하여 Lua 스크립트를 통해 IP 주소를 검사하고 차단.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cloudflare Bouncer&lt;/b&gt;: Cloudflare 방화벽과 연동하여 Cloudflare에서 악성 트래픽 차단.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Metric&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 로그들을 수집하는가 - 측정 획득 조회&amp;nbsp;&lt;/li&gt;
&lt;li&gt;yaml 설정 파일에 설정된 사례
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li class=&quot;stata&quot;&gt;&lt;code&gt;file:/var/log/auth.log&lt;/code&gt;&lt;/li&gt;
&lt;li class=&quot;stata&quot;&gt;&lt;code&gt;file:/var/log/nginx.access.log
&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다중 서버 설정&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;개요&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;172.26.0.0/16 Private Network
├── lapi (172.26.0.10) - LAPI 서버 (중앙 집중식)
├── web1 (172.26.0.11) - Agent + Bouncer
└── web2 (172.26.0.12) - Agent + Bouncer
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lapi 서버가 중앙 LAPI 서버 역할을 하고, &lt;br /&gt;web1과 web2는 에이전트로 LAPI 서버에 알림을 전송하며, &lt;br /&gt;모든 서버에 동일한 차단 룰을 공유.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;공통 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CrowdSec 설치&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# CrowdSec 저장소 추가 및 설치
curl -s https://install.crowdsec.net | sudo sh &amp;amp;&amp;amp; \
command -v cscli &amp;amp;&amp;amp; \
cscli status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 또는 관리사무실의 WAN IP를 whitelist 결정으로 등록&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;sudo cscli decisions add --ip &amp;lt;관리자IP&amp;gt; --type whitelist
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 허용 목록 생성하고 허용할 IP들 추가&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo cscli allowlist create my_allowlist -d 'created from the docs' &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist 192.168.0.0/16 &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist 172.16.0.0/12 &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist 10.0.0.0/8 &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist &amp;lt;관리자IP&amp;gt;/32 &amp;amp;&amp;amp; \
sudo cscli allowlist inspect my_allowlist &amp;amp;&amp;amp; \
sudo systemctl restart crowdsec &amp;amp;&amp;amp; \
sudo systemctl status crowdsec --no-pager --full&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;LAPI 서버 설정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;/etc/crowdsec/config.yaml&lt;/span&gt; 파일을 편집하여 모든 인터페이스에서 수신하도록 설정&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;api:
  server:
    listen_uri: 0.0.0.0:8080
    trusted_ips:
      - 127.0.0.1
      - ::1
      - 172.26.0.0/16  # Allow private network
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;CrowdSec 서비스 시작&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo systemctl enable crowdsec &amp;amp;&amp;amp; \
sudo systemctl start crowdsec &amp;amp;&amp;amp; \
sudo systemctl enable crowdsec-firewall-bouncer &amp;amp;&amp;amp; \
sudo systemctl start crowdsec-firewall-bouncer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LAPI 상태 확인&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;sudo cscli lapi status
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바운서 추가&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;sudo cscli bouncers add WebBouncer
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 바운서 API Key는 &lt;br /&gt;각 web 서버들의 &lt;span style=&quot;color: #ef5369;&quot;&gt;/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml&lt;/span&gt; 파일 항목 중&amp;nbsp;&lt;br /&gt;api_key 값으로 아래에서 지정 예정이므로 별도 기록해두기&lt;/p&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;API key for 'WebBouncer':

   ulOPOSWxLcD8LaNmOMKOkYaG7AQYY+qZ2ho7pPyCAIU

Please keep this key since you will not be able to retrieve it!
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;ls -al /etc/crowdsec/bouncers/
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바운서 구성 파일 확인 &lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;1&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;1&quot;&gt;etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;api_url: http://127.0.0.1:8080/
api_key: &amp;lt;lapi-bouncer에서 생성된 API 키&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;web1 서버 설정 (Agent + Bouncer)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CrowdSec 설치&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo apt install -y crowdsec-firewall-bouncer-iptables &amp;amp;&amp;amp; \
sudo cscli allowlist inspect my_allowlist &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist 127.0.0.1 &amp;amp;&amp;amp; \
sudo cscli allowlist inspect my_allowlist &amp;amp;&amp;amp; \
sudo cscli metrics show acquisition &amp;amp;&amp;amp; \
sudo cscli console enroll -e context cmbiut885000bju0871etz588 &amp;amp;&amp;amp; \
sudo cscli allowlist inspect my_allowlist &amp;amp;&amp;amp; \
sudo systemctl restart crowdsec &amp;amp;&amp;amp; \
sudo systemctl status crowdsec --no-pager --full&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo cscli collections list &amp;amp;&amp;amp; \
sudo cscli collections install crowdsecurity/whitelist-good-actors &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist 10.0.0.0/8 &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist 172.26.0.0/16 &amp;amp;&amp;amp; \
sudo cscli allowlist add my_allowlist 192.168.0.0/16 &amp;amp;&amp;amp; \
sudo systemctl reload crowdsec &amp;amp;&amp;amp; \
sudo systemctl status crowdsec --no-pager --full&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;sudo cscli metrics show decisions
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Agent 구성 (LAPI 비활성화)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;/etc/crowdsec/config.yaml&lt;/span&gt;에서 로컬 API 서버 섹션을 제거하거나 비활성화&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;api:
  server:
    enable: false    # Add this
    listen_uri: 127.0.0.1:8080
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;로컬 API 자격 증명 구성&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;/etc/crowdsec/local_api_credentials.yaml&lt;/span&gt; 파일 편집&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;url: http://172.26.0.10:8080
login: web1
password: &amp;lt;설정된 대로 놔두기, 수정하지 마시오&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;방화벽 바운서 설치 및 구성&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;sudo apt install -y crowdsec-firewall-bouncer-iptables
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo vim /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml&lt;/span&gt;&amp;nbsp;파일의 api_url 값을 LAPI 서버로 지정&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;api_url: http://172.26.0.10:8080/
api_key: &amp;lt;LAPI 머신 bouncer에 지정되어 있는 API 키&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 시작&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo systemctl enable crowdsec &amp;amp;&amp;amp; \
sudo systemctl start crowdsec &amp;amp;&amp;amp; \
sudo systemctl status crowdsec --no-pager --full &amp;amp;&amp;amp; \
sudo systemctl enable crowdsec-firewall-bouncer &amp;amp;&amp;amp; \
sudo systemctl start crowdsec-firewall-bouncer &amp;amp;&amp;amp; \
sudo systemctl status --no-pager --full&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LAPI 서버에 web 서버 등록&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo cscli lapi register --machine web1 --url &quot;http://172.26.0.10:8080&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;web2 서버 설정 (Agent + Bouncer)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;web1&lt;/b&gt;과 동일한 과정을 반복하되, 머신 이름을를 &lt;b&gt;web2&lt;/b&gt;로 수행&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LAPI 서버에서 머신 승인&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 에이전트가 등록을 요청한 후, log 서버에서 승인:&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 머신 목록 조회
sudo cscli machines list

# 머신 승인
sudo cscli machines validate web1
sudo cscli machines validate web2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설정 확인 및 테스트&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;각 서버에서 상태 확인&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# CrowdSec 상태 확인
sudo systemctl status crowdsec --no-pager --full

# 메트릭 확인
sudo cscli metrics
sudo cscli metrics show acquisition

# 결정 목록 확인
sudo cscli decisions list

# 바운서 상태 확인
sudo cscli bouncers list

# 컬렉션 목록 조회
sudo cscli collections list

# 수집 시나리오 목록 조회
sudo cscli scenarios list&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;차단 테스트&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lapi 서버에서 테스트 IP 차단 추가&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 테스트 IP 차단 (5분간)
sudo cscli decisions add -t ban -d 5m -i 1.2.3.4
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 서버에서 차단 룰 동기화 확인&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 각 서버에서 실행
sudo cscli decisions list &amp;amp;&amp;amp; \
sudo ipset list | grep 1.2.3.4&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로그 모니터링 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서버에서 적절한 로그 파일 모니터링 설정&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;web1, web2 서버&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #eb5757;&quot; data-token-index=&quot;0&quot;&gt;/etc/crowdsec/acquis.yaml&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;filenames:
  - /var/log/nginx/access.log
  - /var/log/nginx/error.log
  - /var/log/apache2/access.log
  - /var/log/apache2/error.log
labels:
  type: nginx
---
filenames:
  - /var/log/auth.log
  - /var/log/syslog
labels:
  type: syslog
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;업데이트&amp;nbsp;자동화&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정기적인 상태 확인 및 업데이트를 위해&lt;br /&gt;모든 서버에서 정기적으로 실행 스케쥴링&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;0 4 * * * cscli hub update &amp;amp;&amp;amp; cscli hub upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;선택사항&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;대시보드&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;LAPI 서버에서 Metabase 대시보드 설정&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;sudo cscli dashboard setup -l 0.0.0.0 -p 3000 --password your-dashboard-password
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;WordPress 특화 설정 (web1, web2)&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;WordPress 서버에 특화된 컬렉션 설치&lt;/p&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo cscli hub update &amp;amp;&amp;amp; \
sudo cscli collections install -y crowdsecurity/wordpress &amp;amp;&amp;amp; \
sudo systemctl reload crowdsec&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고&lt;/span&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1749524328104&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CrowdSec: The Open-Source IPS That Fights Back Against Real-World Attacks | by Muhammed Dhulkifli k - Freedium&quot; data-og-description=&quot;  Index 1. What Is CrowdSec? 2. How to Install CrowdSec on Ubuntu 3. What Are CrowdSec Bouncers? 4. How to Install the iptables Bouncer 5. Official Documentation 6. How CrowdSec Detects Threats: Parsers, Scenarios &amp;amp; Collections 7. Understanding acquis.y&quot; data-og-host=&quot;freedium.cfd&quot; data-og-source-url=&quot;https://freedium.cfd/https://medium.com/@muhammeddhulkiflik/crowdsec-the-open-source-ips-that-fights-back-against-real-world-attacks-704b7992fcc1&quot; data-og-url=&quot;https://freedium.cfd/https://medium.com/@muhammeddhulkiflik/crowdsec-the-open-source-ips-that-fights-back-against-real-world-attacks-704b7992fcc1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/19kEJ/hyY784vfS5/h3pKDYnfYnfhdbho7iE5F1/img.png?width=700&amp;amp;height=427&amp;amp;face=0_0_700_427,https://scrap.kakaocdn.net/dn/cKZw8x/hyY5cN4thV/kBe9Sv6n2NJjsOjEl9n8E1/img.png?width=700&amp;amp;height=425&amp;amp;face=0_0_700_425,https://scrap.kakaocdn.net/dn/Apro8/hyY4bV7gUo/EtSOZ3lamMosK3PCfnFGF1/img.png?width=635&amp;amp;height=353&amp;amp;face=0_0_635_353&quot;&gt;&lt;a href=&quot;https://freedium.cfd/https://medium.com/@muhammeddhulkiflik/crowdsec-the-open-source-ips-that-fights-back-against-real-world-attacks-704b7992fcc1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://freedium.cfd/https://medium.com/@muhammeddhulkiflik/crowdsec-the-open-source-ips-that-fights-back-against-real-world-attacks-704b7992fcc1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/19kEJ/hyY784vfS5/h3pKDYnfYnfhdbho7iE5F1/img.png?width=700&amp;amp;height=427&amp;amp;face=0_0_700_427,https://scrap.kakaocdn.net/dn/cKZw8x/hyY5cN4thV/kBe9Sv6n2NJjsOjEl9n8E1/img.png?width=700&amp;amp;height=425&amp;amp;face=0_0_700_425,https://scrap.kakaocdn.net/dn/Apro8/hyY4bV7gUo/EtSOZ3lamMosK3PCfnFGF1/img.png?width=635&amp;amp;height=353&amp;amp;face=0_0_635_353');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CrowdSec: The Open-Source IPS That Fights Back Against Real-World Attacks | by Muhammed Dhulkifli k - Freedium&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Index 1. What Is CrowdSec? 2. How to Install CrowdSec on Ubuntu 3. What Are CrowdSec Bouncers? 4. How to Install the iptables Bouncer 5. Official Documentation 6. How CrowdSec Detects Threats: Parsers, Scenarios &amp;amp; Collections 7. Understanding acquis.y&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;freedium.cfd&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1749524323601&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;About multi-server setup | CrowdSec&quot; data-og-description=&quot;Introduction&quot; data-og-host=&quot;docs.crowdsec.net&quot; data-og-source-url=&quot;https://docs.crowdsec.net/u/user_guides/multiserver_setup/&quot; data-og-url=&quot;https://docs.crowdsec.net/u/user_guides/multiserver_setup&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ftgkk/hyY4bBPyjO/KWkwtMUa9Ko53RjyHMkqYk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ceTNuD/hyY73B7UbD/I8lHZhWa4j5kCUxhe8xYTK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/nr00O/hyY45uCgE5/PdBnHGkJ7uDTdjpoYRFSi1/img.png?width=2312&amp;amp;height=1561&amp;amp;face=0_0_2312_1561&quot;&gt;&lt;a href=&quot;https://docs.crowdsec.net/u/user_guides/multiserver_setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.crowdsec.net/u/user_guides/multiserver_setup/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ftgkk/hyY4bBPyjO/KWkwtMUa9Ko53RjyHMkqYk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/ceTNuD/hyY73B7UbD/I8lHZhWa4j5kCUxhe8xYTK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/nr00O/hyY45uCgE5/PdBnHGkJ7uDTdjpoYRFSi1/img.png?width=2312&amp;amp;height=1561&amp;amp;face=0_0_2312_1561');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;About multi-server setup | CrowdSec&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Introduction&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.crowdsec.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>보안</category>
      <category>crowdsec</category>
      <category>fail2ban</category>
      <category>Firewall</category>
      <category>ipset</category>
      <category>iptable</category>
      <category>Linux</category>
      <category>Security</category>
      <category>방화벽</category>
      <category>보안</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/767</guid>
      <comments>https://itzone.tistory.com/767#entry767comment</comments>
      <pubDate>Mon, 9 Jun 2025 17:45:28 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu Nginx 웹서버 기본 보안 설정</title>
      <link>https://itzone.tistory.com/766</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;개발용으로 셋팅하는데 귀찮으니 안해야지&quot;&lt;br /&gt;라는 생각을 가지면 오만임.&lt;br /&gt;&lt;br /&gt;운영레벨로 승격하지 않은 개발이나 스테이징 서버에서&amp;nbsp;&lt;br /&gt;알수없는 트래픽과 CPU 스파이크를 경험하게 될 것이고&amp;nbsp;&lt;br /&gt;웹서버 액세스 로그를 보면&amp;nbsp;&lt;br /&gt;해킹 스캔 기록이 엄청나게 발생하는것을 목도하게 될 것.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Ubuntu OS 기반에 Nginx 웹서버 선택하여 진행함.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정 요소들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx 웹서버, WAF, UFW 방화벽, Fail2Ban, Ubuntu 자동 업데이트&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Nginx 가상호스트 설정&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;http {
    #......

    # Declare 단일 클라이언트 ip 주소의 모든 페이지에 대해 1초에 5건의 요청 처리로 제한
    limit_req_zone $binary_remote_addr zone=badbot:10m rate=10r/s;
    limit_req_status 444;
  
    # Declare 각 클라이언트 IP 주소의 모든 페이지에 대해 동시 연결 제한
    ## 10m == 10MB의 메모리를 할당하여 대략 16만 개의 IP 주소 저장
    limit_conn_zone $binary_remote_addr zone=ddos:10m;

	server {
	  listen 80;
	  listen [::]:80;
	
	  server_name _;
	
      # https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker
      # 참고하여 include &quot;nginx-ultimate-bad-bot-blocker.conf&quot;      
	
      # request method 제한
	  add_header Allow &quot;GET, POST, HEAD&quot; always;
	  if ( $request_method !~ ^(GET|POST|HEAD|PUT|PATCH)$ ) { return 405; }
	
	  # Limit the size of POST requests
	  client_max_body_size 1M;
	
	  # Timeout settings defend Slowloris attack
	  client_body_timeout 12s;
	  client_header_timeout 12s;
	  keepalive_timeout 5s 5s;
	  send_timeout 10s;
	
		location / {
		    #......
		    
		    # limit_req_zone 선언 사용
		    ## burst: 초과 허용량 설정. 초과 요청이 즉시 거부되지 않고 대기열에 들어간 다음 지정된 요청 비율에 따라 처리될 수 있음을 의미
		    ## nodelay: 선언시 초과 요청들은 지정된 비율에 따라 대기열에 들어가지 않고 즉시 처리. burst 값 이내의 요청은 추가 지연 없이 처리
		    limit_req zone=badbot burst=5 nodelay;
		    
		    # 각 클라이언트 IP 주소의 모든 페이지에 대해 동시 10개 이하의 연결만 열도록 제한
		    limit_conn ddos 10;
        
            #......
		}
		
		location /admin {
			# 관리자 IP만 접속 허용
		    allow xxx.xxx.xxx.xxx/32;
            allow 192.168.1.0/24;
		    deny all;
		    
		    #......
		}
		
		#......
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Nginx ultimate bad bot blocker&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker&quot;&gt;https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;IP 차단 자동화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Fail2ban&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정한 기간동안 IP 차단 자동화&lt;/li&gt;
&lt;li&gt;차단시 iptables 사용하니 셋팅 되어 있어야 함.&lt;/li&gt;
&lt;li&gt;ubuntu는 ufw 사용하는게 제어가 쉬움
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ufw는 명령어가 쉽도록 간략화한 iptables wrapper cli repl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Fail2ban 설치&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; \
sudo apt install -y ufw fail2ban &amp;amp;&amp;amp; \
sudo systemctl start fail2ban &amp;amp;&amp;amp; \
sudo systemctl enable fail2ban &amp;amp;&amp;amp; \
sudo systemctl status fail2ban --no-pager --full &amp;amp;&amp;amp; \
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local &amp;amp;&amp;amp; \
sudo vi /etc/fail2ban/jail.local&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 172.16.0.0/12 192.168.0.0/16 xxx.xxx.xxx.xxx/32
bantime = 7d
findtime = 1d
maxretry = 2
banaction = ufw
banaction_allports = ufw&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo systemctl restart fail2ban &amp;amp;&amp;amp; \
sudo fail2ban-client status&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo ufw default deny incoming &amp;amp;&amp;amp; \
sudo ufw default allow outgoing &amp;amp;&amp;amp; \
sudo ufw allow in 80/tcp &amp;amp;&amp;amp; \
sudo ufw allow in 443/tcp &amp;amp;&amp;amp; \
sudo ufw allow out 80/tcp &amp;amp;&amp;amp; \
sudo ufw allow out 443/tcp &amp;amp;&amp;amp; \
sudo ufw allow in 22/tcp &amp;amp;&amp;amp; \
sudo ufw limit 22/tcp comment 'Allow 6 connections over 30 seconds' &amp;amp;&amp;amp; \
sudo ufw allow out 53/udp &amp;amp;&amp;amp; \
sudo ufw allow out 25/tcp &amp;amp;&amp;amp; \
sudo ufw enable &amp;amp;&amp;amp; \
sudo ufw status verbose&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo ufw delete allow in 22/tcp &amp;amp;&amp;amp; \
sudo ufw allow from 192.168.0.0/16 to any port 22 proto tcp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;sudo vi /etc/rsyslog.d/20-ufw.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# Log kernel generated UFW log messages to file
:msg,contains,&quot;[UFW &quot; /var/log/ufw.log

# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging kernel generated UFW log messages to the file
# normally containing kern.* messages (eg, /var/log/kern.log)
&amp;amp; stop
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo touch /var/log/ufw.log &amp;amp;&amp;amp; \
sudo chown syslog:adm /var/log/ufw.log &amp;amp;&amp;amp; \
sudo chmod o-r /var/log/ufw.log &amp;amp;&amp;amp; \
sudo systemctl restart rsyslog&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo ls -alt /etc/fail2ban/filter.d/nginx*
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo bash -c 'cat &amp;gt; /etc/fail2ban/filter.d/nginx-sslerror.conf &amp;lt;&amp;lt;EOF
[Definition]
failregex = SSL_do_handshake\(\) failed .+ while SSL handshaking, client: &amp;lt;HOST&amp;gt;, server: .+

ignoreregex =

datepattern = {^LN-BEG}%%ExY(?P&amp;lt;_sep&amp;gt;[-/.])%%m(?P=_sep)%%d[T ]%%H:%%M:%%S(?:[.,]%%f)?(?:\s*%%z)?
^[^\[]*\[({DATE})
{^LN-BEG}
EOF' &amp;amp;&amp;amp; \
sudo bash -c 'cat &amp;gt; /etc/fail2ban/filter.d/nginx-4xx.conf &amp;lt;&amp;lt;EOF
[Definition]
failregex = ^&amp;lt;HOST&amp;gt;.*&quot;(GET|POST).*&quot; (404|444|403|400) .*$

ignoreregex = .*(robots.txt|favicon.ico|jpg|png)
EOF' &amp;amp;&amp;amp; \
sudo bash -c 'cat &amp;gt; /etc/fail2ban/filter.d/nginx-forbidden.conf &amp;lt;&amp;lt;EOF
[Definition]
failregex = directory index of .+ is forbidden, client: &amp;lt;HOST&amp;gt;, server: .+
ignoreregex =

EOF' &amp;amp;&amp;amp; \
sudo bash -c 'cat &amp;gt; /etc/fail2ban/filter.d/ufw.conf &amp;lt;&amp;lt;EOF
[Definition]
failregex = [UFW BLOCK].+SRC=&amp;lt;HOST&amp;gt; DST
ignoreregex =
EOF'&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo bash -c 'cat &amp;gt; /etc/fail2ban/jail.d/custom.conf &amp;lt;&amp;lt;EOF
[sshd]
enabled = true

[nginx-4xx]
enabled = true
port     = http,https
filter   = nginx-4xx
logpath  = %(nginx_access_log)s

[nginx-http-auth]
enabled = true
port     = http,https
filter   = nginx-http-auth
logpath  = %(nginx_access_log)s

[nginx-botsearch]
enabled = true
port     = http,https
filter   = nginx-botsearch
logpath  = %(nginx_access_log)s

[nginx-forbidden]
enabled = true
port    = http,https
filter  = nginx-forbidden
logpath = %(nginx_access_log)s

[nginx-sslerror]
enabled = false
port    = http,https
filter  = nginx-sslerror
logpath = %(nginx_access_log)s

[ufw]
enabled = true
filter  = ufw
logpath = /var/log/ufw.log
EOF'&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo systemctl restart fail2ban &amp;amp;&amp;amp; \
sudo systemctl status fail2ban --no-pager --full &amp;amp;&amp;amp; \
sudo fail2ban-client status&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cd ~ &amp;amp;&amp;amp; \
vi fail2ban-status.sh&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#!/usr/bin/env bash

for jail in $(sudo fail2ban-client status | grep 'Jail list:' | sed 's/.*://;s/,//g'); do
  echo &quot;Jail: $jail&quot;;
  sudo fail2ban-client status $jail | grep 'Banned IP';
done&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;chmod +x fail2ban-status.sh &amp;amp;&amp;amp; \
./fail2ban-status.sh&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리눅스 자동 업데이트&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo apt install -y unattended-upgrades &amp;amp;&amp;amp; \
sudo dpkg-reconfigure --priority=low unattended-upgrades &amp;amp;&amp;amp; \
sudo systemctl status unattended-upgrades --no-pager --full&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confirm 선택 화면 뜨면 YES 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://scalastic.io/en/ufw-fail2ban-nginx/&quot;&gt;https://scalastic.io/en/ufw-fail2ban-nginx/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mytory.net/archives/13142&quot;&gt;https://mytory.net/archives/13142&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://linuxhandbook.com/ufw-logs/&quot;&gt;https://linuxhandbook.com/ufw-logs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.fernvenue.com/archives/ufw-with-fail2ban/&quot;&gt;https://blog.fernvenue.com/archives/ufw-with-fail2ban/&lt;/a&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;/var/log/ufw.log 나중에 생기는 문제 예방 가이드&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;/etc/fail2ban/filter.d/ufw.conf 없어서 발생하는 경고 해결 가이드&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gist.github.com/bartosjiri/f7e2e6a6c8890be7f5992470ac4c9350&quot;&gt;https://gist.github.com/bartosjiri/f7e2e6a6c8890be7f5992470ac4c9350&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webdock.io/en/docs/how-guides/security-guides/configuring-ufw-and-fail2ban-mitigate-basic-ddos-attacks&quot;&gt;https://webdock.io/en/docs/how-guides/security-guides/configuring-ufw-and-fail2ban-mitigate-basic-ddos-attacks&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>보안</category>
      <category>EC2</category>
      <category>lightsail</category>
      <category>Linux</category>
      <category>nginx</category>
      <category>Security</category>
      <category>ubuntu</category>
      <category>vm</category>
      <category>가상머신</category>
      <category>보안</category>
      <category>서버</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/766</guid>
      <comments>https://itzone.tistory.com/766#entry766comment</comments>
      <pubDate>Wed, 4 Jun 2025 00:49:38 +0900</pubDate>
    </item>
    <item>
      <title>Nginx + 무료 웹방화벽 Modsecurity 3.x 조합 Docker 셋팅</title>
      <link>https://itzone.tistory.com/765</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx 웹프록시를 주로 사용하는데 &lt;br /&gt;AWS에서 PoC 운영중이던 서비스를 &lt;br /&gt;비용 절감 위해 오라클 클라우드 무료 서버로 옮기고 &lt;br /&gt;Whatap 모니터링 걸어놓고 놔뒀는데 &lt;br /&gt;트래픽이 없을게 확실한 서버에서 이상하게도 CPU 로드 Whatap Alert이 간간히 발생하여 &lt;br /&gt;Nginx access 로그를 확인해보니 &lt;br /&gt;해커 스캔봇이 열심히 활동하여 &lt;br /&gt;쓸데없고 보안에 해로운 트래픽을 유발시키고 있었음. &lt;br /&gt;하여, WAF(웹어플리케이션 방화벽) 도입을 검토하게 되었고 &lt;br /&gt;리서치 후 사용 비용이 없는 Modsecurity로 결정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Modsecurity를 Apache 웹서버는 매우 쉽게 붙일 수 있는데 그에 비해 Nginx는 번거롭고 정리된 최근 레퍼런스 너무 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx + Modsecurity 조합을 &lt;br /&gt;로컬 개발 환경인 macOS에도 구축하고 &lt;br /&gt;Ubuntu 서버에 그대로 셋팅하려니 번거로워서 docker 기반 구성 결정함.&lt;/p&gt;
&lt;h1&gt;docker compose 구성&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Modsecurity 도커 이미지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ docker hub에서 Modsecurity 검색해보면 &lt;a href=&quot;https://hub.docker.com/r/owasp/modsecurity&quot;&gt;https://hub.docker.com/r/owasp/modsecurity&lt;/a&gt; 뜨는데 deprecated&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OWASP CRS 컨테이너 이미지 (&lt;a href=&quot;https://hub.docker.com/r/owasp/modsecurity-crs&quot;&gt;https://hub.docker.com/r/owasp/modsecurity-crs&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;image: owasp/modsecurity-crs:nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 이미지로 하나의 (도커) 서비스를 구성하고 별도로 nginx를 해야 되나 궁금했는데 nginx와 통합된 이미지였음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;expose 포트를 host 80포트에 binding 하면 mac에서 웹서비스에 http로 엑세스 할 수 있을거라는 추측 가능.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;services:
  # 리버스프록시+웹방화벽
  nginx:
    image: owasp/modsecurity-crs:nginx
    container_name: nginx
    hostname: nginx
    labels:
      - dev.orbstack.domains=cashdab.orb.local
    restart: always
    # &amp;lt;https://github.com/coreruleset/modsecurity-crs-docker?tab=readme-ov-file#common-env-variables&amp;gt;
    environment:
      - TZ=Asia/Seoul
      # nginx proxy_pass 정의
      - BACKEND=http://web:8000
      - ERRORLOG=/var/log/nginx/error.log
      #- SERVER_NAME=_
      # &amp;lt;https://github.com/coreruleset/modsecurity-crs-docker?tab=readme-ov-file#nginx-env-variables&amp;gt;
      # 앞단에 Cloudflare 사용시 실제 IP 정의
      - REAL_IP_HEADER=CF-Connecting-IP
    ports:
      # 호스트 : 도커 컨테이너 내부에서 expose된 포트
      - &quot;80:8080&quot;
    volumes:
      - ./docker/modsecurity/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf:/etc/modsecurity.d/owasp-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
      - ./docker/modsecurity/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf:/etc/modsecurity.d/owasp-crs/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
    networks:
      - shared_network
    links:
      - web:web
    depends_on:
      - web
    # 로그 로테이션: 로그 크기 자동 관리
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;10m&quot;
        max-file: &quot;5&quot;

networks:
  shared_network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Modsecurity 설정&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;규칙 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 페이지 경로, 특정 IP 및 대역만 가능하게&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;# Restrict /health and not in ip range
SecRule REQUEST_URI &quot;@beginsWith /health&quot; &quot;id:1000,phase:1,deny,status:403,log,msg:'Access to /health denied for non-authorized IP %{REMOTE_ADDR}',chain&quot;
    SecRule REMOTE_ADDR &quot;!@ipMatch 127.0.0.1,10.0.0.0/8,172.16.0.0/16,192.168.0.0/16&quot; &quot;t:none&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹브라우저나 curl 사용하여 /admin 접속해서 테스트.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ModSecurity 룰셋 메뉴얼 &lt;a href=&quot;https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-%28v3.x%29&quot;&gt;Reference Manual (v3.x)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ModSecurity-CRS-Docker
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coreruleset/modsecurity-crs-docker?tab=readme-ov-file#common-env-variables&quot;&gt;GitHub - coreruleset/modsecurity-crs-docker: Official ModSecurity Docker + Core Rule Set (CRS) images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ModSecurity 공용 환경변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coreruleset/modsecurity-crs-docker?tab=readme-ov-file#common-env-variables&quot;&gt;https://github.com/coreruleset/modsecurity-crs-docker?tab=readme-ov-file#common-env-variables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nginx 환경변수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coreruleset/modsecurity-crs-docker#nginx-env-variables&quot;&gt;https://github.com/coreruleset/modsecurity-crs-docker#nginx-env-variables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;docker-compose.yml 샘플
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coreruleset/modsecurity-crs-docker/blob/main/docker-compose.yaml&quot;&gt;https://github.com/coreruleset/modsecurity-crs-docker/blob/main/docker-compose.yaml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>보안</category>
      <category>modsecurity</category>
      <category>nginx</category>
      <category>Security</category>
      <category>WAF</category>
      <category>방화벽</category>
      <category>보안</category>
      <category>웹방화벽</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/765</guid>
      <comments>https://itzone.tistory.com/765#entry765comment</comments>
      <pubDate>Thu, 29 May 2025 17:50:54 +0900</pubDate>
    </item>
    <item>
      <title>Nginx 무료 에디션 위한 무료 WAF(웹방화벽)</title>
      <link>https://itzone.tistory.com/764</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;Nginx access.log 확인 해서 .env 또는 .git 등 해커의 스캔 기록 있다면 반드시 적용을 권장함.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SafeLine&lt;/h2&gt;
&lt;figure id=&quot;og_1748446994323&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - chaitin/SafeLine: SafeLine is a self-hosted WAF(Web Application Firewall) / reverse proxy to protect your web apps from&quot; data-og-description=&quot;SafeLine is a self-hosted WAF(Web Application Firewall) / reverse proxy to protect your web apps from attacks and exploits. - chaitin/SafeLine&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/chaitin/SafeLine&quot; data-og-url=&quot;https://github.com/chaitin/SafeLine&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/72sT0/hyY0iGM4xS/OM2KkMYZhjWmpq4zkTMHIK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/mjrSf/hyYYu2QP7l/O8x8kh32FXmVNuw5a3KH10/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://github.com/chaitin/SafeLine&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/chaitin/SafeLine&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/72sT0/hyY0iGM4xS/OM2KkMYZhjWmpq4zkTMHIK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/mjrSf/hyYYu2QP7l/O8x8kh32FXmVNuw5a3KH10/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - chaitin/SafeLine: SafeLine is a self-hosted WAF(Web Application Firewall) / reverse proxy to protect your web apps from&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SafeLine is a self-hosted WAF(Web Application Firewall) / reverse proxy to protect your web apps from attacks and exploits. - chaitin/SafeLine&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Github Star: 16.6K (2025-05 기준)&lt;/li&gt;
&lt;li&gt;중국인 메인테이너&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ly.safepoint.cloud/laA8asp&quot;&gt;홈페이지&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://ly.safepoint.cloud/hSMd4SH&quot;&gt;데모&lt;/a&gt;, &lt;a href=&quot;https://ly.safepoint.cloud/w2AeHhb&quot;&gt;문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;쉬운 설치 지원 - 터미널 명령 한줄&lt;/li&gt;
&lt;li&gt;웹관리자 지원&lt;/li&gt;
&lt;li&gt;DB 서버 조합으로 무거운 인프라 구성
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹서버 인스턴스 외 별도 서버로 구성해야 하므로 비용을 더 써야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ModSecurity&lt;/h2&gt;
&lt;figure id=&quot;og_1748447095866&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - owasp-modsecurity/ModSecurity: ModSecurity is an open source, cross platform web application firewall (WAF) engine for &quot; data-og-description=&quot;ModSecurity is an open source, cross platform web application firewall (WAF) engine for Apache, IIS and Nginx. It has a robust event-based programming language which provides protection from a rang...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/owasp-modsecurity/ModSecurity&quot; data-og-url=&quot;https://github.com/owasp-modsecurity/ModSecurity&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IAyUD/hyY09vYnnX/OoITadv1lV8Fg7KlvGHk4K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ceGEOi/hyY0s3IBUA/voJILmGscUdnE7jPuq4kMk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/owasp-modsecurity/ModSecurity&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/owasp-modsecurity/ModSecurity&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IAyUD/hyY09vYnnX/OoITadv1lV8Fg7KlvGHk4K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ceGEOi/hyY0s3IBUA/voJILmGscUdnE7jPuq4kMk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - owasp-modsecurity/ModSecurity: ModSecurity is an open source, cross platform web application firewall (WAF) engine for&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ModSecurity is an open source, cross platform web application firewall (WAF) engine for Apache, IIS and Nginx. It has a robust event-based programming language which provides protection from a rang...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Github Star:&lt;span&gt; 8.9K&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2025-05 기준)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;매우 유명 - 검증되었다 그리고 오래되었다&lt;/li&gt;
&lt;li&gt;룰 설정을 conf 파일에 하므로 가벼운 인프라 구성
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가난한 개인이나 회사라면 이 프로그램 선택해야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Patterns&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/fabriziosalmi/patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/fabriziosalmi/patterns&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748570559026&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - fabriziosalmi/patterns: Automated OWASP CRS and Bad Bot Detection for Nginx, Apache, Traefik and HaProxy&quot; data-og-description=&quot;Automated OWASP CRS and Bad Bot Detection for Nginx, Apache, Traefik and HaProxy - fabriziosalmi/patterns&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/fabriziosalmi/patterns&quot; data-og-url=&quot;https://github.com/fabriziosalmi/patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9L7cz/hyY1jr2ir5/7WPEwHb3JttMkMVOZNHrPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/qZzSY/hyY1dSTl9N/TA2ze4lQ0cv5lPMKkgCBh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/fabriziosalmi/patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/fabriziosalmi/patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9L7cz/hyY1jr2ir5/7WPEwHb3JttMkMVOZNHrPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/qZzSY/hyY1dSTl9N/TA2ze4lQ0cv5lPMKkgCBh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - fabriziosalmi/patterns: Automated OWASP CRS and Bad Bot Detection for Nginx, Apache, Traefik and HaProxy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Automated OWASP CRS and Bad Bot Detection for Nginx, Apache, Traefik and HaProxy - fabriziosalmi/patterns&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Github Star:&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;278&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2025-05 기준)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;룰 설정을 conf 파일에 하므로 가벼운 인프라 구성&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;러닝커브 낮음 - nginx conf 지식만 있다면&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;설치 제일 간편
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nginx conf에 include 후 systemctl&amp;nbsp;reload&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;nginx&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;nginx외에도 Apache, Traefik, Haproxy 지원&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Caddy는 동일 메인테이너의 별도 프로젝트 &lt;a href=&quot;https://github.com/fabriziosalmi/caddy-waf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/fabriziosalmi/caddy-waf&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BunkerWeb&lt;/h2&gt;
&lt;figure id=&quot;og_1748447152180&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - bunkerity/bunkerweb:  ️ Open-source and next-generation Web Application Firewall (WAF)&quot; data-og-description=&quot; ️ Open-source and next-generation Web Application Firewall (WAF) - bunkerity/bunkerweb&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/bunkerity/bunkerweb&quot; data-og-url=&quot;https://github.com/bunkerity/bunkerweb&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brx3Gf/hyY1iNevff/tn9AiDu2Gwe3DWOOjYQ381/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/Pa4d8/hyYYFDiHic/LNmyHgRbPSjsBeBPPfLMbK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://github.com/bunkerity/bunkerweb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/bunkerity/bunkerweb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brx3Gf/hyY1iNevff/tn9AiDu2Gwe3DWOOjYQ381/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/Pa4d8/hyYYFDiHic/LNmyHgRbPSjsBeBPPfLMbK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - bunkerity/bunkerweb:  ️ Open-source and next-generation Web Application Firewall (WAF)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt; ️ Open-source and next-generation Web Application Firewall (WAF) - bunkerity/bunkerweb&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Github Star:&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; 8K&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2025-05 기준)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bunkerweb.io/?utm_campaign=self&amp;amp;utm_source=github&quot;&gt;홈페이지&lt;/a&gt;, &lt;a href=&quot;https://demo.bunkerweb.io/?utm_campaign=self&amp;amp;utm_source=github&quot;&gt;데모&lt;/a&gt;, &lt;a href=&quot;https://docs.bunkerweb.io/?utm_campaign=self&amp;amp;utm_source=github&quot;&gt;문서&lt;/a&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;레퍼런스, 포럼 잘 준비되어 있음&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;웹관리자 지원&lt;/li&gt;
&lt;li&gt;플러그인도 있고 구성이 다양하고 유연함.&lt;/li&gt;
&lt;li&gt;Anti-exploit, anti-bot, rate-limiting 기능 없음.&lt;/li&gt;
&lt;li&gt;DB 서버 조합으로 무거운 인프라 구성
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹서버 인스턴스 외 별도 서버로 구성해야 하므로 비용을 더 써야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;aaWAF&lt;/h2&gt;
&lt;figure id=&quot;og_1748447230524&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - aaPanel/aaWAF: 堡塔云WAF，宝塔免费(free)的私有云网站应用防火墙(firewall)，基于docker/nginx/lua开&quot; data-og-description=&quot;堡塔云WAF，宝塔免费(free)的私有云网站应用防火墙(firewall)，基于docker/nginx/lua开发 - aaPanel/aaWAF&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/aaPanel/aaWAF&quot; data-og-url=&quot;https://github.com/aaPanel/aaWAF&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xbof5/hyY1bAyZ2r/5WIxbwtYH6gkoXvnVJwMPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/c5193x/hyY1jeiCwN/uYFSA9NbLjnHfLcZwZ1UpK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/aaPanel/aaWAF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/aaPanel/aaWAF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xbof5/hyY1bAyZ2r/5WIxbwtYH6gkoXvnVJwMPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/c5193x/hyY1jeiCwN/uYFSA9NbLjnHfLcZwZ1UpK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - aaPanel/aaWAF: 堡塔云WAF，宝塔免费(free)的私有云网站应用防火墙(firewall)，基于docker/nginx/lua开&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;堡塔云WAF，宝塔免费(free)的私有云网站应用防火墙(firewall)，基于docker/nginx/lua开发 - aaPanel/aaWAF&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Github Star:&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; 472&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2025-05 기준)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;중국인 메인테이너&lt;/li&gt;
&lt;li&gt;영문 설치 메뉴얼 &lt;a href=&quot;https://github.com/aaPanel/aaWAF/blob/main/english.md&quot;&gt;https://github.com/aaPanel/aaWAF/blob/main/english.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;홈페이지(&lt;a href=&quot;https://www.bt.cn/new/btwaf.html&quot;&gt;https://www.bt.cn/new/btwaf.html&lt;/a&gt;) &lt;a href=&quot;https://btwaf-demo.bt.cn:8379/c0edce7a&quot;&gt;데모 보기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;쉬운 설치 지원 - 터미널 명령 한줄&lt;/li&gt;
&lt;li&gt;웹관리자 지원
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Attack map - 세계 지도에서 패킷이 날아오는 에니메이션 지원하는 비쥬얼 인상적
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aaPanel/aaWAF/blob/main/img/wafMap.png&quot;&gt;https://github.com/aaPanel/aaWAF/blob/main/img/wafMap.png&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;무료버젼 제한사항
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클러스터 보호 모드 없음&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;주로 중국어 지원이라 국제화가 아쉬움&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;uuWAF&lt;/h2&gt;
&lt;figure id=&quot;og_1748447267798&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Safe3/uuWAF: An industry-leading free, high-performance, AI and semantic technology Web Application Firewall and API Se&quot; data-og-description=&quot;An industry-leading free, high-performance, AI and semantic technology Web Application Firewall and API Security Gateway (WAAP) - UUSEC WAF. - Safe3/uuWAF&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Safe3/uuWAF&quot; data-og-url=&quot;https://github.com/Safe3/uuWAF&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Lklr4/hyYYuBLQVf/UvaZrCdKK87ZvVWuYkpKg0/img.png?width=1881&amp;amp;height=897&amp;amp;face=0_0_1881_897,https://scrap.kakaocdn.net/dn/c21qDL/hyY0tauGvl/RUJz7jYAL3gvkLDn7K9f6k/img.png?width=1881&amp;amp;height=897&amp;amp;face=0_0_1881_897&quot;&gt;&lt;a href=&quot;https://github.com/Safe3/uuWAF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Safe3/uuWAF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Lklr4/hyYYuBLQVf/UvaZrCdKK87ZvVWuYkpKg0/img.png?width=1881&amp;amp;height=897&amp;amp;face=0_0_1881_897,https://scrap.kakaocdn.net/dn/c21qDL/hyY0tauGvl/RUJz7jYAL3gvkLDn7K9f6k/img.png?width=1881&amp;amp;height=897&amp;amp;face=0_0_1881_897');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Safe3/uuWAF: An industry-leading free, high-performance, AI and semantic technology Web Application Firewall and API Se&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An industry-leading free, high-performance, AI and semantic technology Web Application Firewall and API Security Gateway (WAAP) - UUSEC WAF. - Safe3/uuWAF&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Github Star:&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;span&gt; 1.1K&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2025-05 기준)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;중국인 메인테이너&lt;/li&gt;
&lt;li&gt;홈페이지 : &lt;a href=&quot;https://uuwaf.uusec.com/&quot;&gt;https://uuwaf.uusec.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;커뮤니티 에디션이 무료 오픈소스&lt;/li&gt;
&lt;li&gt;쉬운 설치 지원 - 터미널 명령 몇줄&lt;/li&gt;
&lt;li&gt;웹관리자 지원&lt;/li&gt;
&lt;li&gt;Mysql 서버 조합으로 무거운 인프라 구성
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹서버 인스턴스 외 별도 서버로 구성해야 하므로 비용을 더 써야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;업그레이드 이슈 : 부분 업그레이드 지원 안되고 전체 재설치 해야 함.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>보안</category>
      <category>modsecurity</category>
      <category>nginx</category>
      <category>WAF</category>
      <category>무료</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/764</guid>
      <comments>https://itzone.tistory.com/764#entry764comment</comments>
      <pubDate>Thu, 29 May 2025 01:01:23 +0900</pubDate>
    </item>
    <item>
      <title>로컬 컴퓨터에서 LLM  실행 방법들</title>
      <link>https://itzone.tistory.com/763</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Ollama, LMStudio, vLLM, LamaCPP&lt;/p&gt;
&lt;h1&gt;1. Ollama&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 실행할 수 있는 오픈소스 LLM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 명령:&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;curl -sSfL https://ollama.com/download.sh | sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 실행 명령:&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;ollama run &amp;lt;모델명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널 명령 다양한 옵션 지원되니 모델을 여러 옵션으로 커스터마이징 실행하기 좋아하는 유저에 추천.  &lt;/p&gt;
&lt;h1&gt;2. LMStudio&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GUI 기반 LLM 실행 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 명령:&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/LMStudio/LMStudio.git
cd LMStudio
npm install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 명령:&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GUI 환경으로 사용이 편리하므로 모든 유저에 추천.  &lt;/p&gt;
&lt;h1&gt;3. vLLM&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고성능 LLM을 위한 경량화된 솔루션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 명령:&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install vllm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 명령:&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;vllm run &amp;lt;모델명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 사용량을 최소화하면서도 빠른 속도가 장점이니 성능충에 추천.  &lt;/p&gt;
&lt;h1&gt;4. LamaCPP&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ 기반의 LLM 실행 환경으로, 성능이 뛰어남&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 명령:&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;git clone https://github.com/LamaCPP/LamaCPP.git
cd LamaCPP
mkdir build &amp;amp;&amp;amp; cd build
cmake ..
make&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 명령:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;./LamaCPP &amp;lt;모델명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 최적화가 잘 되어 있어서, 대규모 모델을 효율적으로 실행 가능하며 C++에 익숙한 사용자에게 추천.  &lt;/p&gt;</description>
      <category>AI</category>
      <category>ai</category>
      <category>Lama</category>
      <category>lamacpp</category>
      <category>LLM</category>
      <category>lmstudio</category>
      <category>ollama</category>
      <category>vllm</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/763</guid>
      <comments>https://itzone.tistory.com/763#entry763comment</comments>
      <pubDate>Tue, 27 May 2025 20:27:50 +0900</pubDate>
    </item>
    <item>
      <title>AI MCP 개인적 요약</title>
      <link>https://itzone.tistory.com/762</link>
      <description>&lt;h1&gt;Model Context Protocol&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 앱과 연결할때 통신 규약&lt;/p&gt;
&lt;h1&gt;MCP Client&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://claude.ai/&quot;&gt;https://claude.ai/&lt;/a&gt; 채팅 사이트에 &lt;b&gt;웹브라우저&lt;/b&gt;로 접속 했을때&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹브라우저가 Client이다.&lt;/li&gt;
&lt;li&gt;웹브라우저가 LLM 서버의 Client이다.&lt;/li&gt;
&lt;li&gt;웹브라우저가 LLM 서버의 채팅 Client이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;MCP Server&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM이 못하는 기능들을 LLM 명령에 따라 수행하는 서버.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Client에 채팅창에 https fetch 해서 학습 뒤 어떤 답변해달라 프롬프팅&lt;/li&gt;
&lt;li&gt;LLM 자체는 말만 알아듣고 위 URL의 문서를 fetch하는 기능은 하지 못하기에
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요즘은 LLM 채팅에서 URL fetch 기능도 수행 하지만...&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;LLM의 명령을 받아 URL fetch 기능을 수행하는 Server를 만들고
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이 서버가 MCP 서버&lt;/li&gt;
&lt;li&gt;이 서버에 LLM 명령 프로토콜(MCP)로 입력하고 출력받음&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;LLM에 MCP fetch server 연결해두면 LLM이 해당 서버에 fetch 명령 내리고 응답 받아옴&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어, LLM 채팅창에 아래와 같이 프롬프트 명령 내렸다 가정 :&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;장고 사이트를 만드려고 하는데 코딩시 Django 문서(&amp;lt;https://docs.djangoproject.com/ko/5.2/&amp;gt;)를 참고해서 아래 Instruction에 따라 만들어줘.

# Instruction
1. bla bla bla bla bla
2. bla bla bla bla bla
3. bla bla bla bla bla
......
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 없이 LLM에 질문했을때의 답변은 &lt;br /&gt;'URL에 연결할 수 없습니다.', &lt;br /&gt;'bla.py 소스 코드는 다음과 같습니다'라는 식으로 소스 코드를 알려주고 끝남.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch 기능이 있는 MCP 연결 상태에서라면&amp;nbsp;&lt;br /&gt;Django URL 문서를 fetch하고 조회하고&amp;nbsp;&lt;br /&gt;bla bla 작업에 반영함.&lt;/p&gt;</description>
      <category>AI</category>
      <category>ai</category>
      <category>LLM</category>
      <category>mcp</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/762</guid>
      <comments>https://itzone.tistory.com/762#entry762comment</comments>
      <pubDate>Mon, 5 May 2025 21:30:19 +0900</pubDate>
    </item>
    <item>
      <title>macOS 로컬 HTTPS 위한 TLS/SSL 인증서 쉽게 만들기</title>
      <link>https://itzone.tistory.com/761</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;터미널 명령 실행&lt;/p&gt;
&lt;pre id=&quot;code_1746111099907&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install mkcert

mkcert -key-file key.pem -cert-file cert.pem localhost

mkcert -install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS-서버-서비스/macOS</category>
      <category>https</category>
      <category>local</category>
      <category>Mac</category>
      <category>macos</category>
      <category>ssl</category>
      <category>tls</category>
      <category>로컬</category>
      <category>인증서</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/761</guid>
      <comments>https://itzone.tistory.com/761#entry761comment</comments>
      <pubDate>Thu, 1 May 2025 23:54:37 +0900</pubDate>
    </item>
    <item>
      <title>VSCode에서 Gemini AI API 바이브 코딩 사용 리뷰 - 429 오류 응답</title>
      <link>https://itzone.tistory.com/760</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Studio Code에서 Roo code 플러그인으로 요즘 유행중인 AI 바이브 코딩이었는데&lt;br /&gt;두번째 프롬프트 명령 내린 후 수행이 좀 되다가 아래 스샷과 같이 429 상태 오류 응답 발생함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gemini-api-response-429-error.png&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;2632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLYhrY/btsNAP5av5s/eLiTll7jdmAKy35WoUe6X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLYhrY/btsNAP5av5s/eLiTll7jdmAKy35WoUe6X1/img.png&quot; data-alt=&quot;Gemini AI API Request Failed. got status 429 Too Many Requests error.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLYhrY/btsNAP5av5s/eLiTll7jdmAKy35WoUe6X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLYhrY%2FbtsNAP5av5s%2FeLiTll7jdmAKy35WoUe6X1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2066&quot; height=&quot;2632&quot; data-filename=&quot;gemini-api-response-429-error.png&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;2632&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini AI API Request Failed. got status 429 Too Many Requests error.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI API 호출을 너무 여러번 숨쉴 틈 없이 하는게 부하를 줘서 그런가보다~ 추측하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Root Code 설정 중 Rate limit을 30초로 늘려보았으나&amp;nbsp;&lt;br /&gt;AI API 요청을 간격 위 설정과 관계없이&amp;nbsp;&lt;br /&gt;바로 바로 해버려서 동일 오류 계속 발생!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책은?&lt;/p&gt;</description>
      <category>개발 옆차기</category>
      <category>429</category>
      <category>ai</category>
      <category>cline</category>
      <category>Gemini</category>
      <category>roocode</category>
      <category>vibe coding</category>
      <category>Visual Studio Code</category>
      <category>Vive</category>
      <category>VSCode</category>
      <category>바이브 코딩</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/760</guid>
      <comments>https://itzone.tistory.com/760#entry760comment</comments>
      <pubDate>Sun, 27 Apr 2025 23:34:36 +0900</pubDate>
    </item>
    <item>
      <title>macOS의 Spotlight, Alfred, Raycast 에서 한글 파일명 검색 안될때</title>
      <link>https://itzone.tistory.com/759</link>
      <description>&lt;pre id=&quot;code_1745761309298&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo -i
mdutil -Ea
mdutil -ai off
mdutil -ai on&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별안간 어느날 갑자기&lt;br /&gt;Sportlight에서 파일 검색이 되지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 인덱스가 문제라 짐작하고&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;터미널에서 시스템 문제 해결 보고자 하는&lt;span&gt; &lt;/span&gt;&lt;/span&gt;습성에 따라 &lt;br /&gt;해결에 필요한 커맨드를 구글링하고 아래와 같이 터미널 명령 수행함.&lt;/p&gt;
&lt;pre id=&quot;code_1745761384406&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo -i
mdutil -Ea
mdutil -ai off
mdutil -ai on&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나, 영문 파일들은 검색이 되는데 한글 파일이 검색되지 않았음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결법 요약 :&lt;/b&gt; GUI 시스템 설정의 Spotlight 설정의 개인정보 보호 폴더로 지정했다가 해제.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-27 오후 10.30.19.png&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6Bzhb/btsNBwjnOfA/GkuAN7SQGbKIr6Hj1lxu21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6Bzhb/btsNBwjnOfA/GkuAN7SQGbKIr6Hj1lxu21/img.png&quot; data-alt=&quot;Spotlight(또는 Raycast 등)에서 시스템 설정 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6Bzhb/btsNBwjnOfA/GkuAN7SQGbKIr6Hj1lxu21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6Bzhb%2FbtsNBwjnOfA%2FGkuAN7SQGbKIr6Hj1lxu21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1490&quot; height=&quot;512&quot; data-filename=&quot;스크린샷 2025-04-27 오후 10.30.19.png&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Spotlight(또는 Raycast 등)에서 시스템 설정 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-27 오후 10.31.03.png&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;1422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccohWQ/btsNA5GIa42/FtJulfkIMC95z9Egsd9RNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccohWQ/btsNA5GIa42/FtJulfkIMC95z9Egsd9RNK/img.png&quot; data-alt=&quot;시스템 설정 창의 Spotlight 메뉴 클릭 후 오른쪽 아래 검색 개인정보 보호 버튼 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccohWQ/btsNA5GIa42/FtJulfkIMC95z9Egsd9RNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccohWQ%2FbtsNA5GIa42%2FFtJulfkIMC95z9Egsd9RNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1418&quot; height=&quot;1422&quot; data-filename=&quot;스크린샷 2025-04-27 오후 10.31.03.png&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;1422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시스템 설정 창의 Spotlight 메뉴 클릭 후 오른쪽 아래 검색 개인정보 보호 버튼 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-27 오후 10.32.09.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt3aRA/btsNA2iNxCw/aCKbMbKPfy7xnhwXw9oJAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt3aRA/btsNA2iNxCw/aCKbMbKPfy7xnhwXw9oJAk/img.png&quot; data-alt=&quot;개인정보 보호 모달창의 + 버튼 클릭 후 한글 검색 필요한 폴더 추가 후 10초 기다린 뒤 추가했던 폴더를 - 버튼 클릭하여 제거&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt3aRA/btsNA2iNxCw/aCKbMbKPfy7xnhwXw9oJAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt3aRA%2FbtsNA2iNxCw%2FaCKbMbKPfy7xnhwXw9oJAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1408&quot; height=&quot;1418&quot; data-filename=&quot;스크린샷 2025-04-27 오후 10.32.09.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개인정보 보호 모달창의 + 버튼 클릭 후 한글 검색 필요한 폴더 추가 후 10초 기다린 뒤 추가했던 폴더를 - 버튼 클릭하여 제거&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Spotlight 단축키로 호출하고 시스템 설정 검색하고 항목에 뜨면 선택하여 실행.&lt;/li&gt;
&lt;li&gt;좌측 메뉴에서 Sportlight 선택.&lt;/li&gt;
&lt;li&gt;오른쪽 아래로 스크롤 후 '검색 개인정보 보호' 버튼 클릭.&lt;/li&gt;
&lt;li&gt;한글 검색 안되는 디스크 또는 폴더를 개인정보 보호 목록으로 드래그 또는 추가(+) 버튼을 클릭하고 선택.&lt;/li&gt;
&lt;li&gt;몇 초간 기다린 후 추가했던 디스크 또는 폴더를 선택 후 제거(-) 버튼을 클릭. (재인덱싱 시작됨)&lt;/li&gt;
&lt;li&gt;검색 재인덱싱 시작되는데 정보의 양에 따라 시간이 다소 걸릴 수 있으니 기다렸다가.&lt;/li&gt;
&lt;li&gt;한글 파일 검색 테스트!&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>OS-서버-서비스/macOS</category>
      <category>alfred</category>
      <category>Mac</category>
      <category>maos</category>
      <category>Raycast</category>
      <category>search</category>
      <category>spotlight</category>
      <category>검색</category>
      <category>맥북</category>
      <category>한글</category>
      <category>한글파일</category>
      <author>공허공자</author>
      <guid isPermaLink="true">https://itzone.tistory.com/759</guid>
      <comments>https://itzone.tistory.com/759#entry759comment</comments>
      <pubDate>Sun, 27 Apr 2025 22:55:41 +0900</pubDate>
    </item>
  </channel>
</rss>