<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ISMS-P &amp;amp; 보안실무 노트</title>
    <link>https://ismsp-case.tistory.com/</link>
    <description>ISMS-P, 개인정보보호, 정보보안 실무를 기록하는 블로그입니다.

가상 시나리오를 활용한 ISMS-P 모의심사 분석부터 보안 취약점 점검, 시스템&amp;middot;네트워크 보안, 보안 운영과 트러블슈팅까지 실무에서 활용할 수 있는 내용을 다룹니다.</description>
    <language>ko</language>
    <pubDate>Mon, 5 Oct 2026 18:48:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>보안실무자J</managingEditor>
    <image>
      <title>ISMS-P &amp;amp; 보안실무 노트</title>
      <url>https://tistory1.daumcdn.net/tistory/8933196/attach/d355037c43114b12a96ebeff6c923ea9</url>
      <link>https://ismsp-case.tistory.com</link>
    </image>
    <item>
      <title>개인정보처리방침</title>
      <link>https://ismsp-case.tistory.com/pages/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8</link>
      <description>&lt;h1&gt;개인정보처리방침&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P Case(이하 &quot;본 블로그&quot;)는 방문자의 개인정보를 중요하게 생각하며, 개인정보 보호 관련 법령 및 서비스 운영정책을 준수하기 위해 노력하고 있습니다.&lt;/p&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;티스토리(Tistory) 플랫폼을 이용하여 운영되는 개인 블로그&lt;/b&gt;이며, 별도의 회원가입, 상품 판매, 결제, 뉴스레터 신청 또는 개인정보 입력 양식을 직접 운영하고 있지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행일: 2026년 9월 29일&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개인정보의 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 방문자의 개인정보를 별도의 데이터베이스에 직접 수집하여 관리하는 서비스를 운영하고 있지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 블로그 이용 과정에서 티스토리 플랫폼의 기능 또는 방문자가 직접 입력하는 댓글 및 방명록 등을 통해 개인정보가 처리될 수 있습니다.&lt;/p&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;댓글 작성 시 입력하는 닉네임 및 댓글 내용&lt;/li&gt;
&lt;li&gt;방명록 작성 시 입력하는 닉네임 및 작성 내용&lt;/li&gt;
&lt;li&gt;방문자가 댓글이나 방명록에 자발적으로 입력하는 기타 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;댓글이나 방명록에 개인정보를 직접 입력하는 경우 해당 내용이 다른 방문자에게 공개될 수 있으므로, 전화번호, 주소, 이메일 주소, 계좌정보, 주민등록번호 등 불필요한 개인정보를 입력하지 않으시기를 권장합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 티스토리 및 카카오 서비스에서 처리되는 정보&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 티스토리 서비스를 이용하여 운영되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 서비스 이용 과정에서는 서비스의 정상적인 제공 및 운영을 위해 IP 주소, 쿠키, 방문 일시, 서비스 이용 기록, 기기 정보 등의 정보가 자동으로 생성되거나 처리될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 정보의 구체적인 처리 항목, 처리 목적, 보유기간 및 이용자의 권리 등에 관한 사항은 티스토리 서비스를 제공하는 카카오의 개인정보처리방침 및 관련 정책에 따릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그 운영자는 티스토리 및 카카오가 서비스 운영을 위해 보유하거나 처리하는 개인정보 전체에 직접 접근하거나 이를 별도로 관리하지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 개인정보의 처리 목적&lt;/h2&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;게시글에 대한 의견 및 피드백 확인&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그 운영자는 댓글이나 방명록에 작성된 개인정보를 위 목적과 관계없는 용도로 임의로 이용하지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 개인정보의 보유 및 삭제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그 운영자가 직접 관리할 수 있는 댓글 및 방명록의 내용은 게시물의 운영 및 관리에 필요한 범위에서 처리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성자가 직접 삭제할 수 있는 게시물은 티스토리에서 제공하는 기능을 이용하여 삭제할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보와 관련된 삭제 요청이 필요한 경우에는 본 블로그의 방명록을 통해 운영자에게 요청하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 티스토리 및 카카오의 시스템에서 처리되는 회원정보, 접속기록, 쿠키 및 서비스 이용기록 등의 보유 및 삭제 기간은 해당 서비스 제공자의 개인정보처리방침 및 관련 법령에 따릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;법령에 따라 보존이 필요한 정보는 해당 법령에서 정한 기간 동안 보존될 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 개인정보의 제3자 제공&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그 운영자는 방문자가 제공한 개인정보를 원칙적으로 제3자에게 판매하거나 제공하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 다음의 경우에는 예외로 할 수 있습니다.&lt;/p&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;li&gt;수사기관 또는 관계기관이 법령에 따른 적법한 절차에 따라 요청하는 경우&lt;/li&gt;
&lt;li&gt;티스토리&amp;middot;카카오 등 플랫폼 서비스의 정상적인 제공을 위해 해당 서비스 제공자가 개인정보를 처리하는 경우&lt;/li&gt;
&lt;li&gt;Google AdSense 등 외부 광고 서비스를 이용하는 경우 해당 서비스의 운영에 필요한 정보가 관련 사업자의 시스템을 통해 처리되는 경우&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 및 카카오 서비스에서 처리되는 개인정보에 대해서는 해당 서비스 제공자의 개인정보처리방침이 적용됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Google Analytics 및 쿠키 이용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그는 방문자의 이용 현황을 분석하고 콘텐츠 및 블로그 운영을 개선하기 위해 Google Analytics를 이용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Analytics는 방문자가 본 블로그를 이용하는 과정에서 다음과 같은 정보를 수집&amp;middot;처리할 수 있습니다.&lt;/p&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;페이지 조회 및 사이트 이용 기록&lt;/li&gt;
&lt;li&gt;브라우저 및 기기 관련 정보&lt;/li&gt;
&lt;li&gt;대략적인 지역 정보&lt;/li&gt;
&lt;li&gt;쿠키 또는 이에 준하는 식별자를 통해 수집되는 이용 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Analytics는 웹사이트 방문자와 세션을 구분하고 이용 통계를 산출하기 위해 쿠키를 사용할 수 있습니다. Google Analytics의 기본 설정에서는 _ga 쿠키 등이 사용될 수 있으며, 실제 수집 항목과 쿠키 사용 여부는 설정 및 기능 적용 상태에 따라 달라질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수집된 정보는 방문 통계 확인, 콘텐츠 이용 현황 분석 및 블로그 운영 개선을 위한 목적으로 이용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google Analytics를 통해 수집&amp;middot;처리되는 정보에 관한 자세한 사항은 Google의 개인정보처리방침 및 Google Analytics 관련 안내를 참고하시기 바랍니다.&lt;/p&gt;
&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://policies.google.com/privacy?hl=ko&quot;&gt;Google 개인정보처리방침&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/analytics/answer/11593727?hl=ko&quot;&gt;Google Analytics 데이터 수집 안내&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/analytics/answer/6004245?hl=ko&quot;&gt;Google Analytics 개인정보 보호 안내&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문자는 웹브라우저의 설정을 통해 쿠키를 제한하거나 삭제할 수 있습니다. 또한 Google에서 제공하는 &lt;a href=&quot;https://tools.google.com/dlpage/gaoptout&quot;&gt;Google Analytics 차단 브라우저 부가기능&lt;/a&gt;을 이용하여 Google Analytics에 의한 측정을 차단할 수 있습니다. 쿠키 또는 측정을 차단하는 경우 일부 서비스의 이용이나 통계 수집에 영향을 줄 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Google AdSense 및 광고 쿠키&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 본 블로그는 Google AdSense 심사를 진행하고 있습니다. 향후 광고가 게재되는 경우 Google 및 제3자 광고 사업자가 광고 제공, 광고 성과 측정 또는 맞춤형 광고 제공 등을 위해 쿠키나 유사한 기술을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고가 실제로 게재되면 광고 서비스의 적용 상태와 관련 정책에 맞게 본 항목을 업데이트하겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 외부 사이트 및 링크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그의 게시글에는 국가법령정보센터, 개인정보보호위원회, 한국인터넷진흥원(KISA), 보안 솔루션 및 제조사 사이트, GitHub, YouTube 등 외부 웹사이트로 연결되는 링크가 포함될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 웹사이트로 이동한 이후의 개인정보 처리, 쿠키 사용 및 기타 개인정보 보호에 관한 사항은 해당 웹사이트의 개인정보처리방침 및 운영정책에 따릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그 운영자는 외부 웹사이트의 개인정보 처리 방식이나 개인정보 보호 수준을 직접 관리하지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 개인정보의 안전성 확보&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그 운영자는 직접 관리하는 개인정보가 있는 경우 개인정보 보호를 위해 필요한 범위에서 안전하게 관리하도록 노력하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 티스토리 및 카카오 플랫폼에서 처리되는 개인정보의 기술적&amp;middot;관리적 보호조치는 해당 서비스 제공자의 보안정책 및 개인정보처리방침에 따릅니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 이용자의 권리 및 개인정보 관련 문의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문자는 본인이 작성한 댓글이나 방명록과 관련하여 가능한 범위에서 수정 또는 삭제를 요청할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 처리와 관련된 문의 또는 삭제 요청이 있는 경우 본 블로그의 방명록을 통해 운영자에게 요청하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 방명록은 다른 방문자에게 공개될 수 있으므로 개인정보 관련 문의를 작성하실 때에는 전화번호, 주소, 주민등록번호, 계좌번호, 비밀번호 등의 개인정보를 입력하지 않도록 주의하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 경우 운영자는 요청 내용 확인을 위해 최소한의 추가 정보를 요청할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 개인정보처리방침의 변경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 개인정보처리방침은 관련 법령, 티스토리 서비스 정책, 블로그 운영 방식 또는 광고&amp;middot;통계 서비스의 변경에 따라 수정될 수 있습니다.&lt;/p&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;시행일: 2026년 9월 29일&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. 관련 정책&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 블로그에서 이용하는 티스토리 및 외부 서비스와 관련된 개인정보 처리 사항은 각 서비스 제공자의 개인정보처리방침 및 관련 정책을 함께 확인하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 개인정보처리방침은 본 블로그의 운영 방식에 따라 작성되었으며, 향후 블로그에서 새로운 개인정보 처리 기능이나 외부 서비스를 사용하는 경우 해당 내용을 반영하여 업데이트할 예정입니다.&lt;/p&gt;</description>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/pages/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8</guid>
      <pubDate>Tue, 29 Sep 2026 13:28:15 +0900</pubDate>
    </item>
    <item>
      <title>ISMS-P와 정보보안 실무를 기록하는 공간</title>
      <link>https://ismsp-case.tistory.com/pages/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%86%8C%EA%B0%9C</link>
      <description>&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그는 정보보호 관리체계(ISMS-P), 개인정보보호, 보안 취약점 점검, 시스템 보안 운영과 관련된 실무 내용을 기록하는 공간이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보보호 업무를 수행하면서 접하게 되는 인증기준, 보안 점검 항목, 시스템 운영 과정에서 발생하는 다양한 상황을 기술적인 관점과 정보보호 관리 관점에서 정리하고 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 콘텐츠&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ISMS-P 실무&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P 인증기준을 실제 정보보호 업무에서 어떻게 이해하고 적용할 수 있는지 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 인증기준의 문구를 설명하는 데 그치지 않고, 심사 과정에서 어떤 자료를 확인할 수 있는지, 담당자 인터뷰에서는 어떤 내용을 확인하는지, 운영 현황과 증적을 어떻게 연결해서 판단할 수 있는지를 중심으로 다룬다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보안 실무 및 트러블슈팅&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows, Linux, 네트워크, 서버, 보안 솔루션 등의 운영 과정에서 발생하는 문제와 해결 과정을 기록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 폐쇄망이나 제한된 네트워크 환경처럼 일반적인 인터넷 연결 환경과 다른 조건에서 발생할 수 있는 운영 사례와 점검 방법을 함께 다룬다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보안 취약점 점검 및 자동화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버와 시스템의 보안 설정을 점검하고 결과를 정리하는 과정에서 활용할 수 있는 Bash, PowerShell, Python 등의 자동화 방법을 다룬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복적인 점검 업무를 자동화하고 점검 결과를 일관된 형식으로 수집하는 방법, 실제 운영환경에서 발생할 수 있는 예외 상황과 오탐 가능성도 함께 기록한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인정보보호 및 데이터 보안&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보의 수집&amp;middot;이용&amp;middot;보관&amp;middot;파기 과정에서 발생할 수 있는 기술적&amp;middot;관리적 통제 이슈를 다룬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스, Data Lake, 클라우드 환경 등 다양한 데이터 처리 환경에서 개인정보를 어떻게 보호하고 관리할 것인지 실무적인 관점에서 정리한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;콘텐츠 작성 원칙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그에서는 정보보안과 관련된 내용을 작성할 때 다음 원칙을 중요하게 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 가능한 한 공식적인 인증기준, 법령 및 기술자료를 확인하고 내용을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 특정 시스템이나 환경에서만 적용되는 내용을 일반적인 사실처럼 단정하지 않도록 구분한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, 기술적인 설명에서는 실제 운영환경에서 발생할 수 있는 제약사항과 예외 상황을 함께 고려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, ISMS-P 모의심사나 교육을 목적으로 구성한 가상 사례는 실제 기업의 심사 결과나 실제 사고 사례와 혼동되지 않도록 가상 시나리오임을 명확하게 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다섯째, 하나의 보안 주제를 단순한 개념 설명으로 끝내기보다 실제 점검, 증적 확인, 원인 분석, 대응 및 검증이라는 업무 흐름에서 이해할 수 있도록 정리하는 것을 목표로 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이 블로그에서 다루는 정보&lt;/h2&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;ISMS-P 인증기준 및 인증심사 실무&lt;/li&gt;
&lt;li&gt;개인정보보호 및 개인정보 처리 통제&lt;/li&gt;
&lt;li&gt;서버 보안 설정 및 취약점 점검&lt;/li&gt;
&lt;li&gt;Windows Server / Linux 보안&lt;/li&gt;
&lt;li&gt;네트워크 및 시스템 보안&lt;/li&gt;
&lt;li&gt;보안 로그 분석 및 모니터링&lt;/li&gt;
&lt;li&gt;보안 점검 자동화&lt;/li&gt;
&lt;li&gt;Bash / PowerShell / Python을 활용한 업무 자동화&lt;/li&gt;
&lt;li&gt;클라우드 및 데이터 보안&lt;/li&gt;
&lt;li&gt;보안 운영 과정의 트러블슈팅&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;운영 목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보보호 업무는 문서에 작성된 기준만으로 이해하기 어려운 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 인증기준이라도 실제 시스템의 구성, 업무 프로세스, 데이터 흐름, 담당자의 역할에 따라 확인해야 할 사항이 달라질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그에서는 이러한 차이를 기록하고, 정보보호 담당자와 시스템 운영자가 실제 업무에서 참고할 수 있는 자료를 지속적으로 정리하는 것을 목표로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 단순히 정답을 제시하기보다는 왜 해당 내용을 확인해야 하는지, 어떤 증적을 통해 판단할 수 있는지, 운영환경에서는 어떤 예외가 발생할 수 있는지를 함께 설명하는 콘텐츠를 만들어가고 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가상 시나리오에 대한 안내&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 ISMS-P 관련 글에서는 인증심사 학습과 교육을 위해 가상의 기업, 시스템 환경, 인터뷰 내용 및 증적을 구성하여 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 글에 등장하는 기업명, 담당자, 시스템 구성, 수치 및 문서 등은 교육과 학습을 목적으로 구성한 가상의 내용이며 특정 기업이나 실제 인증심사 결과를 의미하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 법령이나 인증기준을 다루는 글에서는 작성 시점의 공식 자료를 기준으로 내용을 확인하고, 적용 범위나 해석에 따라 달라질 수 있는 부분은 별도로 구분하여 설명한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;운영자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보보호 및 보안 운영 업무를 수행하면서 경험한 내용을 바탕으로 이 블로그를 운영하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보보호 관리체계, 개인정보보호, 서버 및 시스템 보안, 보안 점검 자동화 등 업무에서 활용할 수 있는 내용을 지속적으로 정리하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그의 자료가 정보보호 담당자, 시스템 운영자, 보안 엔지니어 및 ISMS-P 인증을 준비하는 사람들에게 실무적인 참고자료가 되기를 바란다.&lt;/p&gt;</description>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/pages/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%86%8C%EA%B0%9C</guid>
      <pubDate>Tue, 29 Sep 2026 13:18:25 +0900</pubDate>
    </item>
    <item>
      <title>백업에 남아 있는 개인정보, 5년 보관해도 될까?</title>
      <link>https://ismsp-case.tistory.com/136</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;&lt;img style=&quot;text-align: center; caret-color: transparent; color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dna/bff56U/dJMcafO4E1W/AAAAAAAAAAAAAAAAAAAAAOOadEU3IlVNC1YDYtmpRc1w9VAtw1qIWKUqYbXTmn7o/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1790780399&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=y85lW4lXm5jVr4aOhG78xivs6%2Fo%3D&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot; data-filename=&quot;bb.png&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;백업에 남아 있는 개인정보, 5년 보관해도 될까?&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;mdash; ISMS-P 3.4.1 관점에서 보는 클라우드 백업 개인정보 파기&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 본 글은 ISMS-P 인증기준을 이해하기 위한 가상의 심사 시나리오다. 기업명, 담당자, 문서, 수치 및 설정값은 교육 목적으로 구성했으며 실제 기업의 심사 결과나 특정 기업의 운영사례가 아니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1. 들어가며&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 파기 업무를 점검하다 보면 다음과 같은 답변을 자주 접하게 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;운영 DB에서는 이미 삭제했습니다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 클라우드 환경에서는 운영 DB만 확인해서는 부족할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 주문 데이터가 다음과 같이 여러 시스템으로 복제될 수 있기 때문이다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;운영 DB
   │
   ├── 백업
   ├── 스냅샷
   ├── 로그 저장소
   ├── 분석용 저장소
   └── 외부 연계 시스템
&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;문제는 운영 DB의 개인정보가 파기된 이후에도 백업본에 동일한 개인정보가 남아 있을 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 백업 데이터는 운영 DB와 동일한 시점에 개인별로 삭제해야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 백업이라는 이유만으로 5년, 10년 동안 보관해도 될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 단순히 &quot;백업 데이터도 즉시 삭제해야 한다&quot;라고 판단해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 개인정보가 실제로 파기 대상인지, 백업본의 보존 목적과 기간에 근거가 있는지, 복구 시 파기된 개인정보가 다시 살아나지 않도록 통제하고 있는지&lt;/b&gt;를 함께 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서는 AWS S3 기반 백업 스토리지에 주문&amp;middot;배송 개인정보가 저장되고 있으며, 운영 DB에서는 파기 처리가 이루어지고 있지만 백업 데이터에는 5년의 일괄 보존기간이 적용되고 있는 상황을 살펴본다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 기업 개요 및 가상 운영 시나리오&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기업명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서비스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패션 전문 인터넷쇼핑몰&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서비스 규모&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원 약 350만 명&lt;/li&gt;
&lt;li&gt;의류 및 잡화 이커머스 플랫폼&lt;/li&gt;
&lt;li&gt;최근 3개월 내 외부 풀필먼트 파트너사 API 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인프라 환경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS EC2&lt;/li&gt;
&lt;li&gt;AWS RDS MySQL&lt;/li&gt;
&lt;li&gt;AWS S3 Backup Storage&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;외부 풀필먼트 API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 담당자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터플랫폼팀 김 과장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;김 과장은 데이터 분석과 백업&amp;middot;보존 정책 관리를 담당하고 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. 외부 풀필먼트 API 연동 과정&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 배송 속도를 개선하기 위해 외부 풀필먼트 파트너사의 API를 신규 도입하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문 처리 과정에서 다음과 같은 데이터가 연동되고 있었다.&lt;/p&gt;
&lt;pre class=&quot;dns&quot;&gt;&lt;code&gt;고객 주문
   &amp;darr;
A사 주문 DB
   &amp;darr;
풀필먼트 API
   &amp;darr;
배송 처리
&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;/p&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;수취인 연락처&lt;/li&gt;
&lt;li&gt;배송지 주소&lt;/li&gt;
&lt;li&gt;주문 관련 정보&lt;/li&gt;
&lt;li&gt;API 원본 Payload&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 단순한 시스템 로그가 아니라 &lt;b&gt;개인정보가 포함된 주문 데이터의 복제본&lt;/b&gt;이 별도 스토리지에 존재하는 구조였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. 운영 DB에서는 정상적으로 파기하고 있었다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사의 운영 DB에서는 회원 탈퇴 및 보유기간 경과 데이터를 정기적으로 처리하고 있었다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
운영 DB 개인정보 삭제
   &amp;darr;
파기 결과 기록

마케팅 동의 철회
   &amp;darr;
해당 목적 관련 처리 중단 및 데이터 정제
&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;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 현장 인터뷰&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[인터뷰 - 업무 관행 확인]&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;심사원&lt;/b&gt;&lt;/p&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 탈퇴 시 메인 DB의 개인정보는 삭제하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 수신동의 철회도 매일 밤 배치 프로그램을 통해 정제하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업은 전체 스냅샷 형태로 보관하고 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;심사원&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 스토리지에 저장된 개별 이용자의 주문 및 배송정보도 운영 DB의 파기 주기와 동일하게 처리하고 있습니까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;김 과장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업은 재해복구를 위해 스토리지 레벨에서 일정 기간 전체를 보관하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 개인의 데이터를 백업본에서 선택적으로 삭제하는 것은 기술적으로 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 백업 보존기간을 5년으로 설정해 두었으며 기간이 지나면 자동으로 삭제되도록 구성했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 현장 수집 증적&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;증적 1. 백업 스토리지 보존 정책&lt;/h2&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;backup_policy_version&quot;: &quot;v2.4_external_logistics_sync&quot;,
  &quot;storage_target&quot;: &quot;s3://a-mall-prod-backup-archive/logistics/&quot;,
  &quot;retention_rules&quot;: {
    &quot;default_snapshot_retention_days&quot;: 1825,
    &quot;automatic_purge_enabled&quot;: true,
    &quot;exclude_paths&quot;: [
      &quot;/order_history_raw/&quot;,
      &quot;/api_payload_archive/&quot;
    ],
    &quot;target_data_types&quot;: [
      &quot;shipping_recipient_name&quot;,
      &quot;shipping_recipient_phone&quot;,
      &quot;delivery_address&quot;
    ],
    &quot;note&quot;: &quot;물류 API 연동 초기 장애 분석 및 통계 산출을 위해 원본 페이로드 아카이브는 5년간 보존 적용 중&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 증적에서 중요한 부분은 automatic_purge_enabled가 true라는 사실만이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 문제는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;자동 삭제 기능 있음
        &amp;darr;
그러나 특정 경로 제외
        &amp;darr;
order_history_raw
api_payload_archive
        &amp;darr;
5년 보존
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 자동화가 존재하더라도 &lt;b&gt;파기 대상 개인정보가 자동화 범위에서 제외되어 있다면 파기 통제로서 충분하지 않을 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 증적 2. 개인정보 파기 관리대장&lt;/h1&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[202X년 상반기 개인정보 파기 결과 보고]

1. 대상 기간
202X.01.01 ~ 202X.06.30

2. 파기 대상
총 142,500건

3. 처리 결과

- 운영 DB 회원 테이블
  &amp;rarr; 물리적 삭제 완료

- 마케팅 활용 동의 철회 고객 DB
  &amp;rarr; 가명처리 및 분리 보관 완료

- 백업 스토리지
  &amp;rarr; 재해복구 및 물류 시스템 연동 검증용 스냅샷 보존
  &amp;rarr; 보존기간 5년
  &amp;rarr; 개별 이용자 요청에 따른 백업 데이터 선별 파기 미적용
&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;운영 DB에서는 파기가 완료되었다고 기록하고 있지만, 동시에 백업 스토리지에서는 해당 개인정보가 계속 보관되고 있다는 사실을 명시하고 있기 때문이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. ISMS-P 기준을 어떻게 연결할 것인가&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서는 &lt;b&gt;3.4.1 개인정보 파기&lt;/b&gt;를 핵심 기준으로 보는 것이 적절하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P는 개인정보 처리 단계별 요구사항에서 3.2를 개인정보 보유 및 이용 시 보호조치, 3.4를 개인정보 파기 시 보호조치로 구분하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 개인정보 보호법 제21조는 보유기간 경과, 처리 목적 달성 등 개인정보가 불필요하게 된 경우 지체 없이 파기하도록 하고 있으며, 다른 법령에 따라 보존해야 하는 경우에는 다른 개인정보와 분리하여 저장&amp;middot;관리하도록 규정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이번 사례에서는 다음과 같이 판단하는 것이 적절하다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;3.2.1 개인정보 현황관리
        │
        ├─ 백업 스토리지의 개인정보 현황 파악
        ├─ 처리 목적 및 보유기간 관리
        └─ 실제 데이터 흐름과 현황의 일치 여부
                 │
                 ▼
3.4.1 개인정보 파기
        │
        ├─ 보유기간 경과 여부
        ├─ 파기 대상 식별
        ├─ 파기 범위
        └─ 파기 결과 검증
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;3.2.1은 개인정보 현황 및 보유기간 관리 측면의 보조 기준&lt;/b&gt;, &lt;b&gt;3.4.1은 실제 파기 통제의 핵심 기준&lt;/b&gt;으로 보는 것이 자연스럽다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 현장 심사 지적 사항&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[결함 1] 보유기간 경과 개인정보의 백업 스토리지 장기 보관&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;관련 기준&lt;/td&gt;
&lt;td&gt;&lt;b&gt;3.4.1 개인정보 파기&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보조 검토 기준&lt;/td&gt;
&lt;td&gt;3.2.1 개인정보 현황관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영현황&lt;/td&gt;
&lt;td&gt;외부 풀필먼트 API 연동 과정에서 주문&amp;middot;배송 개인정보가 S3 백업 스토리지에 복제되어 보관되고 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;확인내용&lt;/td&gt;
&lt;td&gt;운영 DB에서는 파기 처리가 이루어지고 있으나 백업 스토리지의 특정 경로는 자동 파기 대상에서 제외되어 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 문제&lt;/td&gt;
&lt;td&gt;해당 백업 데이터에 대한 5년 보존의 필요성&amp;middot;근거와 파기 시점 관리가 충분히 확인되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;조치방향&lt;/td&gt;
&lt;td&gt;개인정보별 보유기간 및 보존 근거를 재검토하고, 파기 대상 개인정보에 대한 백업 보존&amp;middot;삭제 정책 및 검증체계를 정비해야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결함 판단의 핵심&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &quot;백업 데이터가 운영 DB와 동시에 삭제되지 않았다&quot;는 사실만으로 결함을 확정하는 것은 적절하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b&gt;왜 5년 동안 보관해야 하는지&lt;/b&gt;를 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 5년 보관이라는 설정만으로는 충분한 근거가 되지 않는다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증적에는 다음과 같이 기록되어 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;물류 API 연동 초기 장애 분석 및 통계 산출을 위해 원본 페이로드 아카이브는 5년간 보존&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 여기서 심사원이 추가로 확인해야 할 질문이 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;왜 5년인가?
   &amp;darr;
법령상 근거가 있는가?
   &amp;darr;
업무상 반드시 필요한 기간인가?
   &amp;darr;
5년 동안 원본 개인정보가 필요한가?
   &amp;darr;
개인정보가 아닌 통계&amp;middot;비식별 형태로 대체할 수 있는가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &quot;장애 분석을 위해 필요하다&quot;는 사유만으로 개인정보가 포함된 원본 Payload를 5년 동안 보관해야 한다고 바로 결론 내릴 수는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보존 목적과 기간의 필요성&amp;middot;적정성을 별도로 검토해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. 특히 '마케팅 동의 철회'와 '주문정보 파기'를 구분해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 원문에서 하나 더 주의해야 할 부분이 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;마케팅 활용 목적의 동의 철회 건에 대해 운영 DB에서는 정상적으로 가명처리 및 파기가 수행된다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 마케팅 동의 철회가 발생했다고 해서 &lt;b&gt;주문&amp;middot;배송을 위해 필요한 모든 개인정보까지 즉시 삭제해야 한다고 단정해서는 안 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 하나의 고객 데이터가 다음과 같이 여러 목적에 사용될 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;고객 개인정보
   │
   ├─ 주문 처리
   ├─ 배송
   ├─ 고객지원
   └─ 마케팅
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 목적의 처리에 대한 철회와 주문&amp;middot;배송을 위해 필요한 개인정보의 보유 여부는 별도로 판단해야 한다.&lt;/p&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;마케팅 목적의 처리 중단&lt;/li&gt;
&lt;li&gt;주문&amp;middot;배송 목적의 보유&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구분이 없으면 &lt;b&gt;동의 철회와 개인정보 전체 파기를 동일하게 보는 오류&lt;/b&gt;가 발생할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. 백업 데이터는 무조건 개인별 즉시 삭제해야 하는가?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 이번 사례의 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 시스템은 일반 운영 DB와 구조가 다르기 때문에 특정 개인의 레코드만 선택적으로 삭제하기 어려운 경우가 실제로 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 단순하게 판단해서는 안 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;백업에서 개인별 삭제가 어려우므로 무조건 결함이다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 다음과 같이 판단하는 것도 적절하지 않다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;백업이므로 5년 보관해도 된다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;백업의 목적, 보존주기, 개인정보의 보유 필요성, 접근통제, 복구 방식, 복구 후 파기 처리&lt;/b&gt;를 함께 보는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 백업을 복구했을 때 이미 운영 DB에서 파기한 개인정보가 다시 활성화되지 않도록 하는 절차가 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. 백업 복구 시 개인정보가 다시 살아나는 문제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 상황을 생각할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;2026.01
회원 탈퇴
   &amp;darr;
운영 DB 개인정보 삭제

2026.02
전체 시스템 장애 발생
   &amp;darr;
2025년 12월 백업 복구
   &amp;darr;
탈퇴 회원 개인정보 재생
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 단순히 &quot;백업은 5년 보관한다&quot;는 정책만으로는 충분하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복구 후에는 다음과 같은 처리가 필요할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;백업 복구
   &amp;darr;
최신 탈퇴/파기 대상 목록 확인
   &amp;darr;
보유기간 경과 데이터 재처리
   &amp;darr;
서비스 운영 재개
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 백업 시스템의 개인정보 보호는 &lt;b&gt;백업 시점의 저장뿐 아니라 복구 시점까지 포함하여 설계해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. 실무적 위험성 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 확인되는 위험은 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터 잔존&lt;/td&gt;
&lt;td&gt;운영 DB에서 삭제된 개인정보가 백업본에 계속 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보유기간&lt;/td&gt;
&lt;td&gt;백업 경로에 일괄 5년 보존 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적 적정성&lt;/td&gt;
&lt;td&gt;원본 Payload를 5년 보관해야 하는 근거 확인 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파기 통제&lt;/td&gt;
&lt;td&gt;특정 경로가 자동 파기 대상에서 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복구 위험&lt;/td&gt;
&lt;td&gt;과거 백업을 복구할 경우 이미 파기한 개인정보가 재생될 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;현황관리&lt;/td&gt;
&lt;td&gt;백업 스토리지의 개인정보 현황과 운영 DB의 파기 현황을 별도로 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리 복잡성&lt;/td&gt;
&lt;td&gt;클라우드 백업&amp;middot;스냅샷이 증가할수록 개인정보 저장 위치가 분산될 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이번 사례의 핵심 위험은 단순히 &quot;S3에 개인정보가 남아 있다&quot;는 것이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인정보의 보유기간과 실제 백업 데이터의 보존기간이 서로 연결되어 있지 않다는 점&lt;/b&gt;이 핵심이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 원인 분석&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;직접적인 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 풀필먼트 API 연동 과정에서 생성된 원본 Payload 아카이브에 기존 백업 보존정책을 적용하면서 개인정보 보유기간과 백업 보존기간이 분리되었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기술적 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB의 개인정보 파기 배치와 S3 백업 Lifecycle 정책이 서로 연계되어 있지 않았다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관리적 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 API 연동 과정에서 생성된 개인정보 저장 위치와 보유기간을 기존 개인정보 현황관리 체계에 충분히 반영하지 못했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정책적 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 보존기간을 시스템 장애복구 관점에서 일괄 5년으로 설정했지만, 해당 기간 동안 원본 개인정보를 계속 보유해야 하는지에 대한 별도의 검토가 부족했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;검증 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 결과 확인 시 운영 DB를 중심으로 확인하고, 백업 스토리지의 개인정보 잔존 여부와 보존 근거를 함께 대사하지 않았다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 기술적 조치 방향&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문의 다음 조치는 방향을 조금 수정하는 것이 좋다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;백업 보존기간을 운영 DB 파기 주기와 동기화하여 30일로 단축한다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30일이라는 숫자를 일률적인 정답처럼 제시하기보다는 &lt;b&gt;업무 및 DR 요구사항을 검토하여 백업 보존기간을 재설계한다&lt;/b&gt;고 표현하는 것이 적절하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[개인정보 데이터]
       │
       ├─ 운영 DB
       │     └─ 개인정보 보유기간 기준 적용
       │
       └─ 백업
             ├─ 백업 목적 확인
             ├─ RPO/RTO 확인
             ├─ 백업 보존기간 결정
             ├─ 개인정보 포함 여부 확인
             └─ 보존 종료 후 자동 삭제
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 개선된 백업 정책 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 해당 백업의 실제 DR 요구사항 검토 결과 30일 보존으로 충분하다고 판단했다면 다음과 같이 정책을 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;backup_policy_version&quot;: &quot;v2.5_external_logistics_sync&quot;,
  &quot;storage_target&quot;: &quot;s3://a-mall-prod-backup-archive/logistics/&quot;,
  &quot;retention_rules&quot;: {
    &quot;default_snapshot_retention_days&quot;: 30,
    &quot;automatic_purge_enabled&quot;: true,
    &quot;exclude_paths&quot;: [],
    &quot;target_data_types&quot;: [
      &quot;shipping_recipient_name&quot;,
      &quot;shipping_recipient_phone&quot;,
      &quot;delivery_address&quot;
    ],
    &quot;verification&quot;: {
      &quot;schedule&quot;: &quot;monthly&quot;,
      &quot;check_retention_expired_data&quot;: true,
      &quot;check_lifecycle_execution&quot;: true,
      &quot;check_failed_deletions&quot;: true
    },
    &quot;note&quot;: &quot;DR 요구사항 검토 결과에 따라 백업 보존기간을 설정하고 보존기간 종료 후 자동 삭제되도록 관리&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 &lt;b&gt;30일이라는 숫자 자체가 아니라 그 숫자를 결정한 근거가 존재하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. S3 Lifecycle 정책을 적용할 때 확인할 사항&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 Lifecycle을 적용했다고 해서 개인정보 파기 통제가 자동으로 완성되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 항목을 확인해야 한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Lifecycle Rule
      │
      ├─ 대상 Bucket
      ├─ Prefix / Tag
      ├─ 적용 대상 객체
      ├─ 만료 기준
      ├─ Noncurrent Version
      ├─ Delete Marker
      └─ 실제 실행 결과
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 S3 Versioning이 사용되고 있다면 현재 객체만 삭제하고 이전 버전이 남아 있는지 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 검증이 필요하다.&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;aws s3api get-bucket-versioning \
  --bucket a-mall-prod-backup-archive
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 실제 파기 대상에 대해 객체 및 버전 관리 상태를 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;19. 파기 검증 로그&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 결과는 단순히 &quot;삭제 완료&quot;라고 기록하는 것보다 대상과 결과를 대사할 수 있도록 관리하는 것이 좋다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;deletion_batch_id&quot;: &quot;DEL-202X-0630-001&quot;,
  &quot;target_count&quot;: 142500,
  &quot;operational_db_deleted&quot;: 142500,
  &quot;backup_scope_checked&quot;: true,
  &quot;backup_retention_policy_verified&quot;: true,
  &quot;lifecycle_execution_verified&quot;: true,
  &quot;deletion_failures&quot;: 0,
  &quot;retention_exceptions&quot;: 0,
  &quot;verification_status&quot;: &quot;COMPLETED&quot;
}
&lt;/code&gt;&lt;/pre&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;파기 대상 모집단&lt;/li&gt;
&lt;li&gt;운영 DB 처리 결과&lt;/li&gt;
&lt;li&gt;백업 범위 확인 여부&lt;/li&gt;
&lt;li&gt;Lifecycle 실행 여부&lt;/li&gt;
&lt;li&gt;삭제 실패 건수&lt;/li&gt;
&lt;li&gt;보존 예외 건수&lt;/li&gt;
&lt;li&gt;최종 검증 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 백업 복구 테스트도 함께 확인해야 한다&lt;/h1&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;가 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 복구 테스트에서 다음을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;백업 복구
   &amp;darr;
DB 복원
   &amp;darr;
탈퇴회원 목록 대사
   &amp;darr;
보유기간 경과 데이터 대사
   &amp;darr;
파기 대상 재처리
   &amp;darr;
서비스 운영 전 검증
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 절차가 있으면 백업 복구로 인해 과거 개인정보가 다시 활성화되는 위험을 줄일 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;21. 현장 심사에서 확인할 질문&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개인정보 현황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 풀필먼트 API로 어떤 개인정보가 전송되는가?&lt;/li&gt;
&lt;li&gt;API 연동으로 새롭게 생성된 저장소는 개인정보 현황에 반영되어 있는가?&lt;/li&gt;
&lt;li&gt;S3 백업 스토리지의 개인정보 항목과 보유기간은 관리되고 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;보유기간&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜 5년을 보존하는가?&lt;/li&gt;
&lt;li&gt;법령상 보존근거가 있는가?&lt;/li&gt;
&lt;li&gt;업무상 필요한 기간은 얼마인가?&lt;/li&gt;
&lt;li&gt;장애 분석에 5년치 원본 개인정보가 실제로 필요한가?&lt;/li&gt;
&lt;li&gt;통계 데이터로 대체할 수 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영 DB 파기와 백업 데이터 파기는 어떻게 연계되는가?&lt;/li&gt;
&lt;li&gt;백업 데이터는 언제 삭제되는가?&lt;/li&gt;
&lt;li&gt;Lifecycle 정책의 대상에서 제외된 경로가 있는가?&lt;/li&gt;
&lt;li&gt;파기 실패 건을 어떻게 탐지하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;복구 후 파기 대상 정보를 어떻게 재처리하는가?&lt;/li&gt;
&lt;li&gt;최근 백업 복구 테스트에서 이를 검증했는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;증적&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백업 Lifecycle 실행 로그가 있는가?&lt;/li&gt;
&lt;li&gt;삭제 실패 로그가 있는가?&lt;/li&gt;
&lt;li&gt;파기 대상과 실제 삭제 결과를 대사할 수 있는가?&lt;/li&gt;
&lt;li&gt;백업 보존기간을 결정한 근거가 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;22. 자주 발생하는 잘못된 판단&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 1&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;운영 DB에서 삭제했으므로 파기 완료다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업&amp;middot;복제&amp;middot;분석 저장소 등 실제 개인정보가 저장되는 위치를 함께 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 2&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;백업 데이터는 무조건 운영 DB와 같은 날 삭제해야 한다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 구조와 DR 요구사항을 고려하여 보존기간과 삭제방식을 설계해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 백업이라는 이유만으로 필요 이상 장기간 보관해서는 안 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 3&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;백업은 5년 보관 정책이 있으므로 개인정보도 5년 보관할 수 있다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 보존기간과 개인정보 보유기간은 서로 다른 관점에서 검토해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5년 보존이 필요한 근거가 무엇인지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 4&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;마케팅 동의를 철회했으므로 주문정보도 모두 삭제해야 한다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마케팅 목적의 처리 중단과 주문&amp;middot;배송 등 다른 처리 목적에 필요한 개인정보의 보유 여부를 구분해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 5&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;S3 Lifecycle을 설정했으므로 개인정보 파기는 자동으로 보장된다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lifecycle의 대상 범위, 제외 경로, Versioning, 실행 결과, 실패 여부를 실제 증적으로 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;23. 실무 점검 체크리스트&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개인정보 현황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신규 API 연동으로 생성된 개인정보 저장소를 식별했는가&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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;보존기간의 업무상&amp;middot;법적 근거가 있는가&lt;/li&gt;
&lt;li&gt;불필요하게 긴 기간을 설정하지 않았는가&lt;/li&gt;
&lt;li&gt;보존기간 종료 시 자동 삭제되는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영 DB 파기 대상이 식별되는가&lt;/li&gt;
&lt;li&gt;백업 저장소의 파기 범위를 식별하는가&lt;/li&gt;
&lt;li&gt;Lifecycle 제외 경로를 확인했는가&lt;/li&gt;
&lt;li&gt;S3 Versioning 상태를 확인했는가&lt;/li&gt;
&lt;li&gt;삭제 실패 여부를 확인하는가&lt;/li&gt;
&lt;li&gt;파기 결과를 기록하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;복구 후 최신 파기 대상 목록을 재적용하는가&lt;/li&gt;
&lt;li&gt;DR 테스트에서 개인정보 파기 통제를 검증하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;백업 정책&lt;/li&gt;
&lt;li&gt;Lifecycle Configuration&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;24. 이번 사례의 핵심 포인트&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 중요한 것은 &lt;b&gt;&quot;백업에도 개인정보가 남아 있다&quot;는 사실 하나만으로 결론을 내리는 것이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 세 가지를 순서대로 확인해야 한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;① 정말 파기 대상인가?
        &amp;darr;
② 계속 보관해야 할 근거가 있는가?
        &amp;darr;
③ 보관한다면 기간&amp;middot;분리&amp;middot;접근&amp;middot;복구 통제가 적절한가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 대상이라면:&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;보유기간 경과
      &amp;darr;
파기 대상 확정
      &amp;darr;
운영 DB
      +
백업
      +
복제본
      &amp;darr;
파기 및 결과 검증
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;법령 등에 따라 계속 보존해야 한다면:&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;보존 근거 확인
      &amp;darr;
필요 최소한의 정보로 제한
      &amp;darr;
다른 개인정보와 분리
      &amp;darr;
접근 및 이용 목적 제한
      &amp;darr;
보존기간 종료 후 파기
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조 역시 보유기간 경과나 처리 목적 달성 등으로 개인정보가 불필요해진 경우 지체 없이 파기하도록 하고, 법령에 따라 보존해야 하는 경우에는 다른 개인정보와 분리하여 저장&amp;middot;관리하도록 규정한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;25. 마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서 개인정보 파기는 운영 DB의 삭제 작업만으로 판단하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이커머스 환경에서는 주문 DB에서 생성된 개인정보가 다음과 같이 여러 시스템으로 이동할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;주문 DB
  &amp;darr;
풀필먼트 API
  &amp;darr;
로그 / Payload
  &amp;darr;
S3
  &amp;darr;
백업
  &amp;darr;
스냅샷
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개인정보의 보유기간을 관리할 때는 &lt;b&gt;어디에 저장되어 있는지를 함께 관리해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 가장 중요한 문제는 &quot;백업 데이터는 개인별 삭제가 어렵다&quot;는 기술적 제약 자체가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진짜 문제는 &lt;b&gt;개인정보 보유기간과 백업 보존기간이 별개의 정책으로 운영되고 있으며, 5년이라는 백업 보존기간이 해당 개인정보의 계속 보유 필요성과 연결되어 있지 않다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 마케팅 동의 철회, 회원 탈퇴, 주문&amp;middot;배송 목적의 보유, 법령상 보존은 서로 다른 사유이므로 각각의 처리 목적과 보유 근거를 구분하여 판단해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 실무에서 확인해야 할 핵심은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;운영 DB에서 삭제했는가?&quot;가 아니라 &quot;파기 대상 개인정보가 어디에 존재하며, 그 저장본을 계속 보유할 근거와 기간이 명확하게 관리되고 있는가?&quot;를 확인해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 백업은 장애와 재해에 대비하기 위한 중요한 통제이지만, &lt;b&gt;백업이라는 목적만으로 개인정보를 필요 이상 장기간 보관할 수 있는 것은 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 정책과 개인정보 보유&amp;middot;파기 정책을 연결하고, 백업 복구 시에도 이미 파기한 개인정보가 다시 활성화되지 않도록 관리하는 것이 클라우드 환경의 개인정보 생명주기 관리에서 중요한 부분이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KISA ISMS-P 인증기준 및 인증기준 안내서&lt;/li&gt;
&lt;li&gt;개인정보 보호법 제21조(개인정보의 파기)&lt;/li&gt;
&lt;li&gt;개인정보보호위원회 개인정보 파기 관련 안내&lt;/li&gt;
&lt;li&gt;AWS S3 Lifecycle 및 Versioning 관련 기술문서&lt;/li&gt;
&lt;li&gt;AWS 백업 및 복구 관련 기술문서&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>#ISMS_P #인증심사 #KISA #개인정보현황관리 #3.2.1 #보안결함 #AWS #개인정보처리방침 #보안담당자 #보안설정</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/136</guid>
      <comments>https://ismsp-case.tistory.com/136#entry136comment</comments>
      <pubDate>Thu, 24 Sep 2026 10:00:50 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검] 패치 및 로그 관리 (U-64~U-67) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/141</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;zzzzzzzz.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3agc0/dJMcaidZzWY/uyWfICvM5QZvAkAj33szmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3agc0/dJMcaidZzWY/uyWfICvM5QZvAkAj33szmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3agc0/dJMcaidZzWY/uyWfICvM5QZvAkAj33szmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3agc0%2FdJMcaidZzWY%2FuyWfICvM5QZvAkAj33szmK%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;1376&quot; height=&quot;768&quot; data-filename=&quot;zzzzzzzz.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 시스템의 패치 및 로그 관리 그룹(U-64~U-67)에 대한 자동 진단 스크립트 해설과 실무 조치 방법을 안내해 드립니다. 최신 보안 패치 적용, NTP 시각 동기화, 시스템 로깅 데몬 및 로그 디렉터리 권한 설정을 안전하게 관리하는 방법과 백업 및 조치 절차를 종합적으로 다룹니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 패치 및 로그 관리 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-64&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;주기적 보안 패치 및 벤더 권고사항 적용&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/os-release, 패키지 매니저 로그&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;최신 OS 및 커널 보안 패치 절차가 수립되어 있고 수시 검토/적용되는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-65&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;NTP 및 시각 동기화 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/chrony.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/ntp.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/systemd/timesyncd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;chronyd, ntpd, timesyncd 중 활성화된 데몬이 존재하며 외부 타임 서버가 정상 연동된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-66&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;정책에 따른 시스템 로깅 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/rsyslog.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/systemd/journald.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;rsyslog, syslogd, systemd-journald 등 로깅 데몬이 활성화되어 정상 동작 중인 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-67&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;로그 디렉터리 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/var/log&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/var/log디렉터리의 소유자가 root(또는 syslog)이고 타사용자 쓰기 권한(w)이 제거된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-64] 주기적 보안 패치 및 벤더 권고사항 적용&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;운영체제 및 주요 패키지의 알려진 취약점(CVE)을 악용한 공격을 예방하기 위해 벤더사의 최신 보안 패치를 주기적으로 검토하고 적용하는지 점검합니다. 최신 패치가 적용되지 않은 시스템은 원격 코드 실행(RCE), 권한 상승 등 치명적인 보안 사고에 노출될 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-64 점검 시작 알림
CODE &quot;[ U-64 ] 주기적 보안 패치 및 벤더 권고사항 적용&quot;

OS_RELEASE=&quot;&quot;
# [상세 해설] OS 버전을 확인하기 위해 /etc/os-release 파일 분석
if [ -f /etc/os-release ]; then
    # [상세 해설] PRETTY_NAME 필드에서 OS 명칭과 버전 정보 추출
    OS_RELEASE=$(grep -E &quot;^PRETTY_NAME&quot; /etc/os-release | cut -d= -f2 | tr -d '&quot;')
elif [ -f /etc/redhat-release ]; then
    # [상세 해설] 구형 RHEL 계열 파일에서 OS 정보 추출
    OS_RELEASE=$(cat /etc/redhat-release)
else
    # [상세 해설] 표준 파일이 없을 경우 uname 명령어로 커널 및 시스템 정보 대처
    OS_RELEASE=$(uname -s -r -v)
fi

# [상세 해설] 현재 시스템의 실행 중인 커널 버전 추출
KERNEL_VER=$(uname -r)

# [상세 해설] 수동 점검 대상 안내 및 현재 시스템 정보 출력
INFO &quot;시스템의 최신 보안 패치 및 벤더 권고사항 적용 여부를 주기적으로 수동 점검해야 합니다.&quot; &quot;현재 OS: $OS_RELEASE / 커널: $KERNEL_VER&quot;

LAST_UPDATE=&quot;&quot;
# [상세 해설] YUM 패키지 매니저 존재 여부 확인
if command -v yum &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    # [상세 해설] yum history 명령을 통해 가장 최근에 수행된 패키지 작업 일시 추출
    LAST_UPDATE=$(yum history 2&amp;gt;/dev/null | grep -E -v &quot;ID|---|Loaded|Warning&quot; | head -n 1 | awk '{print $3, $4}')
    if [ -n &quot;$LAST_UPDATE&quot; ]; then
        INFO &quot;YUM 패키지 관리자의 가장 최근 작업(업데이트 등) 일시를 확인했습니다.&quot; &quot;최근 작업 일시: $LAST_UPDATE&quot;
    else
        INFO &quot;YUM 업데이트 이력을 찾을 수 없습니다.&quot; &quot;yum history 확인 불가&quot;
    fi
# [상세 해설] APT 패키지 매니저(Ubuntu/Debian) 존재 여부 확인
elif command -v apt-get &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    # [상세 해설] apt history.log 파일에서 가장 최근 업데이트 시작 시간 추출
    if [ -f /var/log/apt/history.log ]; then
        LAST_UPDATE=$(grep &quot;^Start-Date:&quot; /var/log/apt/history.log | tail -n 1 | cut -d: -f2- | xargs)
        if [ -n &quot;$LAST_UPDATE&quot; ]; then
            INFO &quot;APT 패키지 관리자의 가장 최근 업데이트 일시를 확인했습니다.&quot; &quot;최근 작업 일시: $LAST_UPDATE&quot;
        else
            INFO &quot;APT 업데이트 이력을 찾을 수 없습니다.&quot; &quot;history.log 내역 없음&quot;
        fi
    else
        INFO &quot;/var/log/apt/history.log 파일을 찾을 수 없습니다.&quot; &quot;로그 유실 또는 미사용&quot;
    fi
fi

FINISH &quot;[ U-64 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무자의 실수 및 장애 사례&lt;/span&gt;: 검증되지 않은 패치를 운영 환경에 전체 적용(yum update -y)했다가&lt;span&gt;&amp;nbsp;&lt;/span&gt;glibc나&lt;span&gt;&amp;nbsp;&lt;/span&gt;OpenSSL의 라이브러리 의존성이 깨져 핵심 애플리케이션 데몬이 구동되지 않는 장애가 빈번히 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: 패치 실행 전 업데이트 가능 목록 및 보안 전용 패치 항목만 별도로 시뮬레이션해야 합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# RHEL/CentOS 계열 보안 패치 대상 조회
yum updateinfo list security

# Ubuntu/Debian 계열 업데이트 대상 조회
apt-get --just-print upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;MSA 및 CI/CD 환경에서의 대안 설정&lt;/span&gt;: 컨테이너 기반(Docker/Kubernetes) 또는 불변 인프라(Immutable Infrastructure) 환경에서는 가동 중인 서버에 직접 패치를 수행하지 않습니다. 베이스 이미지를 업데이트하여 신규 이미지로 배포(Blue/Green, Rolling Update)하는 구성을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;패키지 리스트 백업&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# RHEL 계열
rpm -qa &amp;gt; /root/pkg_list_$(date +%Y%m%d).txt

# Debian 계열
dpkg -l &amp;gt; /root/pkg_list_$(date +%Y%m%d).txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;보안 패치 선별 적용&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# RHEL/CentOS 계열 보안 패치만 선택적 적용
yum update --security -y

# Ubuntu 계열 보안 패치 적용
apt-get install --only-upgrade &amp;lt;패키지명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-65] NTP 및 시각 동기화 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 간 시각 불일치로 인한 로그 타임스탬프 오류를 방지하기 위해 표준 타임 서버와의 시각 동기화(NTP) 여부를 점검합니다. 침해사고 발생 시 여러 서버의 로그를 연관 분석하기 위해 정확한 시각 동기화는 필수적입니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-65 점검 시작 알림
CODE &quot;[ U-65 ] NTP 및 시각 동기화 설정&quot;

NTP_RUNNING=&quot;FALSE&quot;
NTP_CONF_SAFE=&quot;FALSE&quot;
REASON_NTP=&quot;&quot;

# [상세 해설] 1. chronyd 데몬의 활성화 및 프로세스 실행 여부 검사 (RHEL 7+ 기본)
if systemctl is-active --quiet chronyd 2&amp;gt;/dev/null || ps -ef | grep -E &quot;chronyd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    NTP_RUNNING=&quot;TRUE&quot;
    # [상세 해설] /etc/chrony.conf 내 외부 타임 서버(server 또는 pool) 설정 존재 여부 확인 (루프백 제외)
    if grep -E -i &quot;^[[:space:]]*(server|pool)&quot; /etc/chrony.conf 2&amp;gt;/dev/null | grep -v &quot;127.127.1.0&quot; &amp;gt;/dev/null; then
        NTP_CONF_SAFE=&quot;TRUE&quot;
        REASON_NTP=&quot;chronyd가 동작 중이며, /etc/chrony.conf에 외부 동기화 서버(server/pool)가 정상 설정됨.&quot;
    else
        REASON_NTP=&quot;chronyd는 동작 중이나, /etc/chrony.conf에 동기화 서버 설정이 누락됨.&quot;
    fi
# [상세 해설] 2. ntpd 데몬의 활성화 및 프로세스 실행 여부 검사 (구형 시스템)
elif systemctl is-active --quiet ntpd 2&amp;gt;/dev/null || ps -ef | grep -E &quot;ntpd|xntpd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    NTP_RUNNING=&quot;TRUE&quot;
    CONF_FILE=$(ls /etc/ntp.conf /etc/inet/ntp.conf 2&amp;gt;/dev/null | head -1)
    if [ -n &quot;$CONF_FILE&quot; ] &amp;amp;&amp;amp; grep -E -i &quot;^[[:space:]]*(server|pool)&quot; &quot;$CONF_FILE&quot; | grep -v &quot;127.127.1.0&quot; &amp;gt;/dev/null; then
        NTP_CONF_SAFE=&quot;TRUE&quot;
        REASON_NTP=&quot;ntpd가 동작 중이며, 설정 파일($CONF_FILE)에 외부 동기화 서버가 정상 설정됨.&quot;
    else
        REASON_NTP=&quot;ntpd는 동작 중이나, 외부 동기화 서버 설정이 누락되거나 설정 파일이 없음.&quot;
    fi
# [상세 해설] 3. systemd-timesyncd 데몬 검사 (Ubuntu 기본)
elif systemctl is-active --quiet systemd-timesyncd 2&amp;gt;/dev/null; then
    NTP_RUNNING=&quot;TRUE&quot;
    if grep -E -i &quot;^[[:space:]]*NTP=&quot; /etc/systemd/timesyncd.conf 2&amp;gt;/dev/null &amp;gt;/dev/null; then
        NTP_CONF_SAFE=&quot;TRUE&quot;
        REASON_NTP=&quot;timesyncd가 동작 중이며, timesyncd.conf에 NTP 동기화 서버가 정상 설정됨.&quot;
    else
        REASON_NTP=&quot;timesyncd는 동작 중이나, timesyncd.conf에 NTP 서버 설정이 누락됨.&quot;
    fi
fi

# [상세 해설] 판정 결과 출력 로직
if [[ &quot;$NTP_RUNNING&quot; == &quot;FALSE&quot; ]]; then
    WARN &quot;시각 동기화(NTP) 서비스가 동작하지 않아 침해사고 시 로그 타임스탬프 분석이 불가능할 수 있습니다.&quot; &quot;ntpd, chronyd, timesyncd 등 관련 데몬 모두 미동작&quot;
elif [[ &quot;$NTP_CONF_SAFE&quot; == &quot;TRUE&quot; ]]; then
    OK &quot;NTP/시각 동기화 서비스가 안전하게 설정되어 동작 중입니다.&quot; &quot;$REASON_NTP&quot;
else
    WARN &quot;시각 동기화 서비스는 동작 중이나, 동기화할 타임 서버(외부 서버) 설정이 미흡합니다.&quot; &quot;$REASON_NTP&quot;
fi
FINISH &quot;[ U-65 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무자의 실수 및 장애 사례&lt;/span&gt;: 아웃바운드 방화벽에서 UDP 123 포트가 차단되어 연동이 불가능하거나, 대규모 시간 차이가 존재하는 상태에서 NTP를 급격히 동기화(ntpdate)하다가 Database 트랜잭션 타임스탬프가 역전되어 데이터가 꼬이는 장애가 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;chronyc tracking&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;chronyc sources&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 통해 실제 시간 동기화 오차(Slew)와 연동 상태를 정밀 확인해야 합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# chrony 동기화 상태 및 오차 확인
chronyc tracking

# 연동 타임 서버 상태 점검
chronyc sources -v&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 대안 설정&lt;/span&gt;: 클라우드(AWS, GCP 등) 환경에서는 외부 인터넷 NTP 대신 인프라 자체 제공 PTP/NTP 서비스(예: AWS Time Sync Service&lt;span&gt;&amp;nbsp;&lt;/span&gt;169.254.169.123)를 설정에 등록하는 것이 네트워크 안정성에 훨씬 유리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/chrony.conf /etc/chrony.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;타임 서버 지정 (/etc/chrony.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;예시)&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 기존 server 항목 수정 또는 신규 추가
server time.bora.net iburst
server ntp.kornet.net iburst&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 재시작 및 동기화 검증&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl restart chronyd
chronyc sources&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-66] 정책에 따른 시스템 로깅 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 보안 이벤트, 침입 시도, 서비스 오류 등을 기록하는 로깅 데몬의 운영 상태를 점검합니다. 로그가 생성되지 않으면 보안 사고 발생 시 원인 파악 및 법적 증거 확보가 불가능해집니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-66 점검 시작 알림
CODE &quot;[ U-66 ] 정책에 따른 시스템 로깅 설정&quot;

# [상세 해설] 현재 시스템에서 동작 중인 주요 로깅 데몬 프로세스 검색
LOG_PROCESS=$(ps -ef | grep -E &quot;rsyslogd|syslogd|systemd-journald&quot; | grep -v &quot;grep&quot;)

if [ -n &quot;$LOG_PROCESS&quot; ]; then
    # [상세 해설] 감지된 프로세스 명칭을 구분하여 변수에 할당
    if echo &quot;$LOG_PROCESS&quot; | grep -q &quot;systemd-journald&quot;; then
        DAEMON_NAME=&quot;systemd-journald&quot;
    elif echo &quot;$LOG_PROCESS&quot; | grep -q &quot;rsyslogd&quot;; then
        DAEMON_NAME=&quot;rsyslogd&quot;
    else
        DAEMON_NAME=&quot;syslogd&quot;
    fi
    
    # [상세 해설] 로깅 데몬이 구동 중인 경우 양호 판정
    OK &quot;시스템 로깅 데몬($DAEMON_NAME)이 정상적으로 동작 중입니다.&quot; &quot;활성화된 로깅 데몬: $DAEMON_NAME&quot;
else
    # [상세 해설] 로깅 데몬 미동작 시 취약 판정 및 조치 가이드 안내
    WARN &quot;시스템 로깅 데몬(rsyslog, syslog, systemd-journald 등)이 동작하지 않아 로그가 기록되지 않습니다.&quot; &quot;관련 데몬 프로세스 미동작&quot;
    INFO &quot;조치 방법: systemctl enable --now rsyslog 또는 systemd-journald 상태 확인&quot; &quot;참고: OS 버전에 맞는 로깅 데몬 활성화 필요&quot;
fi
FINISH &quot;[ U-66 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무자의 실수 및 장애 사례&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;systemd-journald&lt;span&gt;&amp;nbsp;&lt;/span&gt;로그 설정 시 메모리 및 디스크 용량 제한(SystemMaxUse)을 지정하지 않아&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/log/journal&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리가 파티션 전체 용량을 점유하면서 서버 서비스 전체가 멈추는 리소스 고갈 장애가 흔히 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: 설정 파일 수정 후 반드시 구문 검증 명령을 수행해야 합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;vala&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# rsyslog 설정 파일 구문 오류 검사
rsyslogd -N1

# 테스트 로그 생성 및 정상 기록 여부 확인
logger -p authpriv.info &quot;Security Log Test&quot;
tail -n 5 /var/log/secure&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;중앙 집중식 로깅 구성&lt;/span&gt;: 실무 환경에서는 단일 서버의 로그 보관 외에도 SIEM 또는 중앙 로그 서버(Fluentd, Logstash 등)로 로그를 실시간 전송(UDP/TCP 514 포트)하도록 구성하여 로그 위변조 및 유실에 대비해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/rsyslog.conf /etc/rsyslog.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;문법 검사 및 서비스 활성화&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;rsyslogd -N1
systemctl enable --now rsyslog&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 상태 및 동작 확인&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl status rsyslog&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-67] 로그 디렉터리 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 로그 디렉터리(/var/log) 및 로그 파일의 권한을 통제하여 비인가자가 침입 흔적을 삭제하거나 로그 데이터를 위변조하지 못하도록 예방합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-67 점검 시작 알림
CODE &quot;[ U-67 ] 로그 디렉터리 소유자 및 권한 설정&quot;

LOG_DIR=&quot;/var/log&quot;
VULN_LOGS=&quot;&quot;

# [상세 해설] 로그 디렉터리 존재 여부 확인
if [ -d &quot;$LOG_DIR&quot; ]; then
    # [상세 해설] /var/log 디렉터리의 소유자 계정명 추출
    DIR_OWNER=$(ls -ld &quot;$LOG_DIR&quot; | awk '{print $3}')
    # [상세 해설] /var/log 디렉터리의 권한 문자열 추출 (예: drwxr-xr-x)
    DIR_PERMS=$(ls -ld &quot;$LOG_DIR&quot; | awk '{print $1}')
    # [상세 해설] 기타 사용자(Other)의 쓰기 권한 위치(9번째 문자) 추출
    DIR_O_WRITE=$(echo &quot;$DIR_PERMS&quot; | cut -c 9)

    # [상세 해설] 소유자가 root/syslog가 아니거나, 기타 사용자에게 쓰기 권한(w)이 부여된 경우 점검
    if [[ &quot;$DIR_OWNER&quot; != &quot;root&quot; &amp;amp;&amp;amp; &quot;$DIR_OWNER&quot; != &quot;syslog&quot; ]] || [[ &quot;$DIR_O_WRITE&quot; == &quot;w&quot; ]]; then
        WARN &quot;시스템 로그 디렉터리($LOG_DIR)의 소유자 또는 권한이 취약하여 로그 위변조 위험이 있습니다.&quot; &quot;소유자: $DIR_OWNER, 권한: $DIR_PERMS (권고: root 소유, 타사용자 쓰기 방지)&quot;
    else
        OK &quot;시스템 로그 디렉터리($LOG_DIR) 자체의 소유자 및 권한이 안전하게 설정되어 있습니다.&quot; &quot;소유자: $DIR_OWNER, 권한: $DIR_PERMS (타사용자 쓰기 차단됨)&quot;
    fi
    
    # [상세 해설] 하위 개별 로그 파일 권한 점검에 대한 안내 출력
    INFO &quot;/var/log 내 주요 개별 로그 파일(messages, secure, wtmp 등)에 비인가자 쓰기 권한 유무를 수동 확인 바랍니다.&quot; &quot;명령어: find /var/log -type f -perm -002 -ls&quot;
else
    WARN &quot;표준 시스템 로그 디렉터리($LOG_DIR)를 찾을 수 없습니다.&quot; &quot;경로 누락 및 확인 필요&quot;
fi
FINISH &quot;[ U-67 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무자의 실수 및 장애 사례&lt;/span&gt;: 조치 과정에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/log&lt;span&gt;&amp;nbsp;&lt;/span&gt;하위 파일들에 대해 일괄적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;chmod -R 700 /var/log와 같이 과도하게 권한을 제한했다가, 일반 계정 권한으로 실행되는 서비스 데몬(예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;apache,&lt;span&gt;&amp;nbsp;&lt;/span&gt;nginx,&lt;span&gt;&amp;nbsp;&lt;/span&gt;mysql&lt;span&gt;&amp;nbsp;&lt;/span&gt;등)이 로그를 쓰지 못해 데몬이 다운되는 장애가 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: 전체 일괄 변경 대신 타사용자 쓰기 권한(World-Writable)만 선별적으로 제거해야 합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# World-Writable 권한이 부여된 로그 파일 탐색
find /var/log -type f -perm -002 -ls&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 고려사항&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;logrotate&lt;span&gt;&amp;nbsp;&lt;/span&gt;데몬 운영 시 생성되는 신규 로그 파일의 권한 모드가&lt;span&gt;&amp;nbsp;&lt;/span&gt;logrotate.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;내에&lt;span&gt;&amp;nbsp;&lt;/span&gt;create 0640 root utmp&lt;span&gt;&amp;nbsp;&lt;/span&gt;형태로 명시되어 있는지 함께 점검해야 재부팅이나 로그 롤링 후 권한이 다시 취약해지는 것을 방지할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;현재 디렉터리 권한 및 소유관계 백업 확인&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;stata&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;ls -ld /var/log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;로그 디렉터리 및 주요 파일 권한 교정&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;perl&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 디렉터리 소유자 변경 및 타사용자 쓰기 권한 제거
chown root:root /var/log
chmod 755 /var/log

# 하위 파일 중 World-Writable 권한만 제거
chmod -R o-w /var/log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;적용 결과 검증&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;find /var/log -type f -perm -002&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 그룹 스크립트 한계점 및 예외 처리 종합 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;스크립트 한계점 정밀 분석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;분할 설정 디렉터리(*.d/*.conf) 미인식&lt;/span&gt;:&lt;br /&gt;최신 RHEL 8/9 및 Ubuntu 22.04+ 환경에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/chrony.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/rsyslog.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;메인 파일 외에&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/chrony.d/*.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/rsyslog.d/*.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리 내에 분할 설정 파일을 사용하는 경우가 많으나 현재 스크립트는 단일 설정 파일만 점검합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;journald 영속성 저장 모드 검증 누락&lt;/span&gt;:&lt;br /&gt;U-66 항목에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;systemd-journald가 동작하더라도 저장 모드(Storage=volatile)가 휘발성 메모리 전용으로 설정되어 있으면 재부팅 시 로그가 사라지지만, 현 스크립트는 단순 프로세스 존재 여부만 체크하여 양호로 판정합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;개선 로직 코드 스니펫 (Code Snippet)&lt;/h3&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;include 디렉터리까지 포함하여 검사하고 journald의 영속성(persistent) 상태를 정밀 진단하는 개선 로직입니다.&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스크립트] 분할 설정 경로 및 journald 영속성 검사 보완
NTP_CONF_CHECK=$(grep -E -i -h &quot;^[[:space:]]*(server|pool)&quot; /etc/chrony.conf /etc/chrony.d/*.conf 2&amp;gt;/dev/null | grep -v &quot;127.127.1.0&quot;)
JOURNAL_PERSIST=$(grep -E -i &quot;^[[:space:]]*Storage[[:space:]]*=[[:space:]]*persistent&quot; /etc/systemd/journald.conf 2&amp;gt;/dev/null)

if [ -n &quot;$NTP_CONF_CHECK&quot; ]; then
    NTP_CONF_SAFE=&quot;TRUE&quot;
fi

if systemctl is-active --quiet systemd-journald 2&amp;gt;/dev/null &amp;amp;&amp;amp; [ -z &quot;$JOURNAL_PERSIST&quot; ]; then
    INFO &quot;systemd-journald가 동작 중이나 로그 저장소가 휘발성(volatile)일 수 있습니다. /etc/systemd/journald.conf 내 Storage=persistent 설정을 권장합니다.&quot;
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;4. 결론 및 요약&lt;/h2&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;패치 및 로그 관리 그룹(U-64~U-67)은 시스템의 안전성을 유지하고 침해사고 시 원인을 규명하기 위한 인프라 보안의 기초 단계입니다.&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자동 진단 스크립트의 결과를맹신하기보다는, 최신 OS의 분할 설정 디렉터리 특성과 실무 환경의 서비스 영향을 충분히 고려하여 조치해야 합니다. 안내해 드린 안전한 백업 절차와 사전 구문 검증 명령을 통해 인프라 장애 없는 보안 강화를 달성하시기를 권장합니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#보안점검 #리눅스보안 #취약점진단 #패치관리 #로그관리 #시각동기화 #NTP설정 #크로니 #알시스템로그 #시스템로그 #보안가이드 #U64 #U65 #U66 #U67</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/141</guid>
      <comments>https://ismsp-case.tistory.com/141#entry141comment</comments>
      <pubDate>Wed, 23 Sep 2026 10:04:39 +0900</pubDate>
    </item>
    <item>
      <title>클라우드 이관 중 삭제한 개인정보가 백업에 남아 있다면?</title>
      <link>https://ismsp-case.tistory.com/139</link>
      <description>&lt;h1&gt;클라우드 이관 중 삭제한 개인정보가 백업에 남아 있다면?&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;mdash; ISMS-P 3.4.1 개인정보 파기와 클라우드 백업 데이터 관리&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 본 글은 ISMS-P 인증기준을 이해하기 위한 가상의 심사 시나리오다. 기업명, 담당자, 문서번호, 시스템명, 수치 및 설정값은 교육 목적으로 구성했으며 실제 기업의 심사 결과나 특정 기업의 운영사례가 아니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1. 들어가며&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온프레미스 시스템을 클라우드로 이전하는 과정에서는 기존 저장소에 존재하는 데이터를 새로운 환경으로 옮긴 후 레거시 시스템을 폐기하는 작업이 함께 진행된다.&lt;/p&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;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 상황을 생각할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;[레거시 NAS]

고객 문의 티켓
 ├─ 정상 보유 데이터
 ├─ 보유기간 경과 데이터
 └─ 백업 데이터
          │
          │ 클라우드 이관
          ▼
[AWS S3]

정상 데이터 &amp;rarr; 운영 저장소
보유기간 경과 데이터 &amp;rarr; 아카이브
백업 데이터 &amp;rarr; Snapshot / Backup
&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S3 객체&lt;/li&gt;
&lt;li&gt;S3 객체 버전&lt;/li&gt;
&lt;li&gt;삭제 마커&lt;/li&gt;
&lt;li&gt;백업 버킷&lt;/li&gt;
&lt;li&gt;EBS 스냅샷&lt;/li&gt;
&lt;li&gt;AWS Backup 복구 지점&lt;/li&gt;
&lt;li&gt;온프레미스 백업&lt;/li&gt;
&lt;li&gt;다른 리전에 존재하는 복제본&lt;/li&gt;
&lt;li&gt;장기 아카이브&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 클라우드 환경에서 개인정보 파기 여부를 판단할 때는 &lt;b&gt;운영 저장소의 삭제 여부만 확인해서는 충분하지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서는 온프레미스에서 AWS로 시스템을 이전하는 과정에서 보유기간이 경과한 개인정보가 클라우드 백업 영역에 남아 있는 상황을 가정하고, ISMS-P 3.4.1 관점에서 어떻게 판단하고 조치해야 하는지 살펴본다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 기업 개요 및 가상 운영 시나리오&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기업명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서비스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기업용 차세대 방화벽 라이선스 관리 및 원격 관제 서비스&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;운영 규모&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연간 활성 사용자 약 120만 명&lt;/li&gt;
&lt;li&gt;고객사 담당자 개인정보 보유&lt;/li&gt;
&lt;li&gt;고객 지원 포털 운영&lt;/li&gt;
&lt;li&gt;원격 관제 로그 시스템 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인프라 환경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AWS S3&lt;/li&gt;
&lt;li&gt;AWS RDS&lt;/li&gt;
&lt;li&gt;멀티 리전 환경&lt;/li&gt;
&lt;li&gt;온프레미스 레거시 백업 스토리지&lt;/li&gt;
&lt;li&gt;클라우드와 온프레미스가 혼재된 과도기적 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 담당자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드인프라운영팀 김대리&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. 클라우드 전환 과정에서 발생한 문제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 기존 온프레미스 환경에서 운영하던 방화벽 고객 지원 포털과 원격 관제 로그 시스템을 AWS 환경으로 이전하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 레거시 NAS에 저장되어 있던 고객 문의 티켓의 첨부파일을 클라우드 오브젝트 스토리지로 이전하였다.&lt;/p&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;고객사 담당자 정보&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 레거시 스토리지에 &lt;b&gt;보유기간이 이미 경과한 개인정보가 함께 존재했다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 마이그레이션 과정에서 데이터를 신규 클라우드 환경으로 이전한 후 레거시 스토리지를 정리할 계획이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이관 일정이 촉박해지면서 보유기간 경과 데이터와 정상 보유 데이터를 구분하여 파기하는 절차가 충분히 수행되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 운영 파일의 삭제와 별개로 기존 볼륨의 스냅샷과 백업본에 해당 개인정보가 남아 있는 상태가 발생하였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. 현장 인터뷰&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[인터뷰 - 개인정보 파기 및 백업관리]&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;심사원&lt;/b&gt;&lt;/p&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;&lt;/p&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;&lt;/p&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이관 일정이 촉박해서 개별 파일을 구분하여 처리하기보다는 레거시 볼륨 자체를 마운트 해제한 후 스냅샷 형태로 클라우드에 보관했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 대상 파일도 스냅샷 아카이브에 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 해당 영역은 접근권한이 제한되어 있기 때문에 실질적인 노출 가능성은 낮다고 판단했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 별도의 파기 검증은 수행하지 않고 이관 확인서로 갈음했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 현장 수집 증적&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;증적 1. 클라우드 오브젝트 스토리지 이관 로그&lt;/h2&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;migration_batch_id&quot;: &quot;MIG-2023-Q4-STORAGE-09&quot;,
  &quot;execution_timestamp&quot;: &quot;2023-10-15T02:30:00Z&quot;,
  &quot;source_repository&quot;: &quot;legacy-onprem-nas-01:/volume2/support_tickets/&quot;,
  &quot;target_repository&quot;: &quot;s3://a-company-cloud-archive-bucket/expired_data/&quot;,
  &quot;total_objects_processed&quot;: 142050,
  &quot;action_type&quot;: &quot;BLOCK_MIGRATION_AND_UNMOUNT&quot;,
  &quot;secure_deletion_applied&quot;: false,
  &quot;overwrite_pass_count&quot;: 0,
  &quot;status&quot;: &quot;COMPLETED&quot;,
  &quot;note&quot;: &quot;Legacy volume unmounted without separate deletion verification.&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 로그에서 중요한 부분은 secure_deletion_applied: false 자체가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 중요한 것은 &lt;b&gt;보유기간 경과 개인정보가 실제로 어느 저장소로 이동되었고, 이후 해당 저장본에 대해 어떤 파기 또는 보존 판단이 이루어졌는가&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 증적 2. 개인정보 파기 예외 승인 문서&lt;/h1&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;[내부 기안 문서]

문서번호: ARC-2023-1182
기안부서: 클라우드인프라운영팀
제목: 클라우드 이관에 따른 레거시 스토리지 데이터 처리 예외 승인 요청

1. 추진 배경

- 방화벽 관제 시스템 클라우드 전환에 따른 레거시 NAS 철거
- 기존 스토리지에 고객 지원 티켓 및 진단 파일 약 4.2TB 존재

2. 주요 내용

- 대상 데이터:
  고객 지원 티켓 첨부파일 및 네트워크 진단 로그

- 처리 방안:
  레거시 볼륨 스냅샷을 생성하여 클라우드 백업 영역으로 이관

- 예외 사유:
  마이그레이션 일정 및 데이터 정합성 검증 문제

3. 검토 결과

- 보유기간 경과 데이터가 일부 포함되어 있으나
  백업 스토리지에 대한 접근권한을 제한함

- 별도의 개인정보 파기 검증은 수행하지 않음

4. 최종 결재

승인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서에서 심사상 중요한 부분은 &lt;b&gt;CISO가 승인했는지 여부 자체가 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 예외 승인 과정에서 &lt;b&gt;보유기간 경과 개인정보를 계속 보관해야 할 법적&amp;middot;업무상 근거가 있었는지&lt;/b&gt;, 그리고 그렇지 않았다면 파기 대상에서 제외할 수 있는 정당한 근거가 있었는지를 확인하는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. ISMS-P 3.4.1 개인정보 파기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P 3.4.1은 개인정보의 보유기간 및 파기 관련 내부 정책을 수립하고, 보유기간 경과 또는 처리목적 달성 등 파기 시점이 도달한 경우 &lt;b&gt;파기의 안전성 및 완전성이 보장될 수 있는 방법으로 지체 없이 파기&lt;/b&gt;하도록 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이번 사례에서 가장 먼저 확인해야 할 사항은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;개인정보 보유기간 확인
        &amp;darr;
파기 시점 도달 여부 확인
        &amp;darr;
파기 대상 식별
        &amp;darr;
모든 저장 위치 확인
        &amp;darr;
파기 수행
        &amp;darr;
파기 결과 확인
        &amp;darr;
파기 기록 관리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 클라우드 환경에서는 &quot;운영 데이터에서 삭제했는가?&quot;에서 끝나면 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백업&amp;middot;스냅샷&amp;middot;복제본 등 조직이 계속 관리하고 있는 다른 저장본에 동일 개인정보가 존재하는지도 확인해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. 이번 사례의 핵심 결함&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[결함 1] 보유기간 경과 개인정보가 백업&amp;middot;스냅샷 영역에 남아 있는 상태에서 파기 완료로 처리&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관련 기준&lt;/td&gt;
&lt;td&gt;ISMS-P 3.4.1 개인정보 파기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대상&lt;/td&gt;
&lt;td&gt;고객 지원 티켓 첨부파일 및 진단 로그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;확인내용&lt;/td&gt;
&lt;td&gt;보유기간 경과 개인정보가 레거시 스토리지 스냅샷에 포함된 상태로 클라우드 백업 영역에 보관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 문제&lt;/td&gt;
&lt;td&gt;파기 대상 개인정보와 계속 보존해야 할 데이터가 분리되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추가 확인사항&lt;/td&gt;
&lt;td&gt;백업&amp;middot;스냅샷의 보존 필요성 및 법적 근거 확인 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;위험&lt;/td&gt;
&lt;td&gt;파기 대상 개인정보가 운영 종료 후에도 관리 저장소에 계속 존재할 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영현황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 온프레미스 스토리지에 저장되어 있던 고객 지원 티켓 첨부파일을 AWS 환경으로 이전하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 보유기간이 경과한 개인정보가 포함된 레거시 스토리지 볼륨을 스냅샷으로 생성하여 클라우드 백업 영역에 보관하였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결함내역&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보유기간이 경과하여 파기 대상이 된 개인정보가 포함된 저장본에 대해 별도의 파기 대상 식별 및 파기 결과 검증을 수행하지 않고 백업 영역에 계속 보관하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근권한을 제한하는 조치는 적용되어 있었으나, 이는 해당 개인정보를 계속 보존해야 하는 근거가 없는 경우 파기 자체를 대신하는 조치로 보기 어렵다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;근거목록&lt;/h3&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;스냅샷 및 백업 저장 현황&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 중요한 판단 포인트 &amp;mdash; 백업에 남아 있다고 무조건 결함인가?&lt;/h1&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;&quot;운영 데이터에서 삭제했는데 백업에 남아 있으므로 무조건 ISMS-P 3.4.1 결함이다&quot;라고 단순화하면 안 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 다음 사항을 확인해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 실제로 파기 시점이 도래했는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 개인정보가 정말 보유기간 경과 또는 처리목적 달성으로 파기 대상인지 확인해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 다른 법령에 따른 보존 필요성이 있는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 법령 등에 따라 일정 기간 보존해야 하는 개인정보라면 파기 대상이 아닐 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에는 필요한 최소한의 항목으로 제한하고 다른 개인정보와 분리하여 저장&amp;middot;관리하는 방식이 필요하다. ISMS-P 3.4.2가 이 부분을 별도로 다룬다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 백업본의 보존정책이 별도로 존재하는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 데이터가 일정 기간 보존되도록 정책화되어 있고, 그 보존에 필요한 근거와 통제가 존재하는지 확인해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 백업본이 파기대상 개인정보를 계속 포함하고 있는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &quot;스냅샷이 존재한다&quot;는 사실만으로는 부족하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 파기 대상 개인정보가 해당 백업본에 포함되어 있는지를 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 백업과 파기를 함께 관리해야 하는 이유&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 생명주기를 단순하게 보면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;수집
 &amp;darr;
이용
 &amp;darr;
보관
 &amp;darr;
보유기간 경과
 &amp;darr;
파기
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제 클라우드 환경에서는 다음처럼 복잡해진다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;                    ┌─ S3 운영 버킷
                    │
개인정보 ───────────┼─ S3 백업 버킷
                    │
                    ├─ S3 Version
                    │
                    ├─ 다른 Region 복제본
                    │
                    ├─ EBS Snapshot
                    │
                    ├─ AWS Backup
                    │
                    └─ 온프레미스 백업
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 파기 프로세스를 설계할 때는 &lt;b&gt;개인정보가 실제로 존재하는 저장 위치를 데이터 흐름과 함께 관리해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. AWS S3에서는 '삭제'와 '영구 삭제'를 구분해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3에서는 버전 관리 여부를 반드시 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 관리가 활성화된 버킷에서 일반적인 DeleteObject 요청을 수행하면 객체 자체가 즉시 영구 삭제되는 것이 아니라 삭제 마커가 추가될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 객체 버전은 그대로 남아 있을 수 있다. 특정 객체 버전을 영구적으로 삭제하려면 해당 versionId를 지정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 점검이 필요하다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;S3 Object
   │
   ├─ Current Version
   │
   ├─ Noncurrent Version
   │
   └─ Delete Marker
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 검증 과정에서는 단순히 다음 명령의 성공 여부만 확인해서는 부족할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;aws s3api delete-object \
  --bucket a-company-cloud-archive-bucket \
  --key expired_data/customer_001.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 관리가 활성화되어 있다면 실제 삭제 대상 버전과 비현재 버전까지 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS는 버전 관리가 활성화된 S3에서 비현재 버전을 Lifecycle 정책으로 영구 삭제하거나 특정 versionId를 지정하여 삭제하는 방법을 제공한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. Lifecycle 정책도 보유기간 관리와 연결해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대량의 개인정보를 자동 파기해야 하는 환경에서는 S3 Lifecycle을 활용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 다음과 같은 단순 정책은 주의해야 한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;LastModified + 730일
        &amp;darr;
무조건 삭제
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보의 보유기간은 단순히 파일의 마지막 수정일과 항상 일치하는 것은 아니기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 적절한 구조는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;개인정보 보유기간
       &amp;darr;
개별 데이터의 파기 예정일 산정
       &amp;darr;
파기 대상 식별
       &amp;darr;
S3 Object / Version 확인
       &amp;darr;
Lifecycle 또는 자동화 정책 적용
       &amp;darr;
파기 결과 검증
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;AWS의 기술적 삭제 시점과 개인정보의 법적&amp;middot;업무적 보유기간을 연결하는 관리체계&lt;/b&gt;가 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. 스냅샷은 어떻게 관리해야 하는가&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 특히 주의할 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문에서는 다음과 같이 표현되어 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;레거시 스냅샷 볼륨에 대해 zero-fill을 수행하고 삭제한다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 클라우드 환경에서는 이 표현을 그대로 사용하는 것보다 &lt;b&gt;스냅샷의 보존 필요성을 판단하고 해당 복구 지점을 삭제하거나 보존정책에 따라 만료시키는 방식&lt;/b&gt;으로 표현하는 것이 정확하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EBS 스냅샷은 AWS가 관리하는 저장 구조이므로 일반적인 온프레미스 디스크에서 사용하는 shred, dd if=/dev/zero 등의 방식으로 스냅샷 자체를 &quot;제로필&quot;하는 방식으로 설명하면 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 EBS 스냅샷을 삭제하더라도 해당 볼륨 자체에는 영향을 주지 않으며, AWS Backup에서 관리되는 복구 지점은 EC2에서 직접 삭제하는 방식이 아니라 AWS Backup 측의 관리 절차를 따라야 한다.&lt;/p&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;스냅샷 생성 여부&lt;/li&gt;
&lt;li&gt;스냅샷 보존기간&lt;/li&gt;
&lt;li&gt;개인정보 포함 여부&lt;/li&gt;
&lt;li&gt;스냅샷의 업무상 보존 필요성&lt;/li&gt;
&lt;li&gt;AWS Backup 관리 여부&lt;/li&gt;
&lt;li&gt;스냅샷 삭제 또는 만료정책&lt;/li&gt;
&lt;li&gt;백업 복구 지점의 보존정책&lt;/li&gt;
&lt;li&gt;파기 대상 개인정보가 남아 있는지에 대한 확인 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. 기술적 조치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례의 조치는 다음 순서로 진행하는 것이 현실적이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;14.1 파기 대상 개인정보 재식별&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 보유기간 관리 기준을 기준으로 파기 대상 데이터를 다시 식별한다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[개인정보 보유 목록]
        &amp;darr;
보유기간 확인
        &amp;darr;
파기 예정일 확인
        &amp;darr;
파기 대상 확정
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;14.2 저장 위치 추적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확정된 파기 대상 데이터가 어디에 존재하는지 확인한다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Customer Ticket ID
        │
        ├─ S3 Object
        ├─ S3 Version
        ├─ Backup Bucket
        ├─ Cross-Region Replica
        ├─ Snapshot
        └─ On-Prem Backup
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;14.3 운영 데이터 파기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 대상 객체를 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 관리가 적용된 경우에는 객체의 현재 버전뿐 아니라 보존 중인 비현재 버전도 정책에 따라 처리해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;14.4 백업 및 스냅샷 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 대상 개인정보가 포함된 백업본의 보존 필요성을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보존 근거가 없는 경우 해당 백업본의 보존정책에 따라 삭제 또는 만료 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 법령이나 정당한 업무상 근거에 따라 보존해야 한다면 3.4.2 관점에서 최소한의 정보만 분리하여 관리하는 구조를 검토한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 파기 자동화 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3에서는 단순히 &quot;2년 지난 파일을 삭제한다&quot;는 방식보다 &lt;b&gt;파기 예정일을 명시적으로 관리하는 구조&lt;/b&gt;가 더 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 객체에 다음과 같은 메타데이터 또는 관리정보를 연결할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Object Key
customer_001/support/2023-001.log

DataClass
PERSONAL_INFORMATION

RetentionEndDate
2025-10-31

DeletionStatus
PENDING
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 자동화 프로세스를 다음과 같이 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[파기 대상 식별]
       &amp;darr;
[RetentionEndDate 확인]
       &amp;darr;
[법적 보존 예외 확인]
       &amp;darr;
[삭제 대상 확정]
       &amp;darr;
[S3 Object 삭제]
       &amp;darr;
[Version 확인]
       &amp;darr;
[Backup / Snapshot 확인]
       &amp;darr;
[파기 결과 기록]
       &amp;darr;
[담당자 검증]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 파기 검증 로그 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 overwrite_pass_count와 같은 저장매체 저수준 지표보다는 실제 개인정보 파기 범위를 확인할 수 있는 로그가 더 유용하다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;deletion_batch_id&quot;: &quot;DEL-2026-0017&quot;,
  &quot;execution_timestamp&quot;: &quot;2026-09-30T02:30:00Z&quot;,
  &quot;data_subject_scope&quot;: &quot;support_ticket&quot;,
  &quot;target_count&quot;: 142050,
  &quot;s3_objects_processed&quot;: 142050,
  &quot;versioned_objects_checked&quot;: true,
  &quot;backup_repository_checked&quot;: true,
  &quot;snapshot_repository_checked&quot;: true,
  &quot;retention_exception_count&quot;: 0,
  &quot;deletion_result&quot;: &quot;COMPLETED&quot;,
  &quot;verification_status&quot;: &quot;VERIFIED&quot;
}
&lt;/code&gt;&lt;/pre&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;몇 건을 파기 대상으로 선정했는가&lt;/li&gt;
&lt;li&gt;실제 몇 건을 처리했는가&lt;/li&gt;
&lt;li&gt;S3 버전을 확인했는가&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 원인 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례의 원인은 단순히 &quot;삭제 명령을 잘못 실행했다&quot;는 것으로 끝나지 않는다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;원인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;직접 원인&lt;/td&gt;
&lt;td&gt;보유기간 경과 개인정보가 포함된 레거시 스냅샷을 백업 영역에 보관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영 원인&lt;/td&gt;
&lt;td&gt;마이그레이션 과정에서 개인정보 파기와 데이터 이관 절차를 별도로 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기술적 원인&lt;/td&gt;
&lt;td&gt;백업&amp;middot;스냅샷&amp;middot;버전 등 저장본을 포함한 파기 범위 식별이 부족&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리적 원인&lt;/td&gt;
&lt;td&gt;이관 예외 승인 시 개인정보 보유기간과 파기 필요성을 충분히 검토하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;검증 원인&lt;/td&gt;
&lt;td&gt;운영 데이터 삭제 여부만 확인하고 백업 저장본까지 파기 여부를 검증하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;재발 가능성&lt;/td&gt;
&lt;td&gt;향후 클라우드 마이그레이션에서도 동일한 개인정보 잔존 가능성 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. CISO의 예외 승인이 있으면 문제가 없는가?&lt;/h1&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;이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 예외 승인이 있다는 사실만으로 개인정보의 법적 보유기간이나 파기 필요성이 사라지는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 심사에서는 다음과 같이 질문할 필요가 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;왜 보존했는가?
      &amp;darr;
보존할 법적 또는 업무상 근거가 있는가?
      &amp;darr;
필요한 최소 정보만 보존했는가?
      &amp;darr;
다른 개인정보와 분리했는가?
      &amp;darr;
보존 종료시점이 관리되고 있는가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보존 근거가 없다면 &quot;CISO가 승인했다&quot;는 사실보다 &lt;b&gt;왜 파기 대상 개인정보를 계속 보관했는지&lt;/b&gt;가 핵심적인 검토사항이 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;19. 재발 방지 방안&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;19.1 마이그레이션 체크리스트에 개인정보 파기 항목 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 이전 시 다음 항목을 필수 확인하도록 한다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[ ] 개인정보 보유기간 확인
[ ] 파기 대상 데이터 식별
[ ] 법령상 보존 예외 확인
[ ] 운영 데이터 파기
[ ] 백업 데이터 확인
[ ] 스냅샷 확인
[ ] 복제본 확인
[ ] S3 Version 확인
[ ] 파기 결과 검증
[ ] 파기 증적 보관
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;19.2 백업 시스템과 개인정보 관리체계 연계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 파기 시스템과 백업 시스템을 별도로 운영하면 다음과 같은 문제가 발생할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;개인정보 관리 시스템
       │
       └── &quot;파기 완료&quot;

              &amp;ne;

백업 시스템
       │
       └── &quot;개인정보 보관 중&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개인정보의 파기 대상이 확정되면 백업&amp;middot;복제 영역의 보존정책도 함께 확인할 수 있도록 연계하는 것이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 현장 심사에서 확인할 질문&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인정보 보유기간&lt;/h3&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;보유기간 경과 여부를 어떤 시스템에서 판단하는가?&lt;/li&gt;
&lt;li&gt;법령상 별도 보존 대상은 어떻게 구분하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영 데이터&lt;/h3&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;실제 삭제 결과를 어떻게 검증하는가?&lt;/li&gt;
&lt;li&gt;자동 파기 작업의 실패 여부를 어떻게 확인하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;백업&lt;/h3&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;백업본의 보존기간은 어떻게 결정하는가?&lt;/li&gt;
&lt;li&gt;백업 데이터에도 개인정보 파기 정책이 적용되는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클라우드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S3 Versioning이 활성화되어 있는가?&lt;/li&gt;
&lt;li&gt;비현재 버전에 개인정보가 남아 있지 않은가?&lt;/li&gt;
&lt;li&gt;다른 리전에 복제본이 존재하는가?&lt;/li&gt;
&lt;li&gt;AWS Backup 또는 별도 백업 서비스가 존재하는가?&lt;/li&gt;
&lt;li&gt;스냅샷에 파기 대상 개인정보가 포함되어 있지 않은가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;검증&lt;/h3&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;파기 결과를 어떤 형태로 기록하는가?&lt;/li&gt;
&lt;li&gt;최근 개인정보 파기 테스트 또는 검증 결과가 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;21. 자주 발생하는 잘못된 판단&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 1&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;운영 시스템에서 삭제했으므로 개인정보 파기가 완료되었다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 시스템뿐만 아니라 조직이 관리하는 백업&amp;middot;복제&amp;middot;스냅샷 등 관련 저장본의 보존 필요성과 파기 여부를 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 2&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;백업 데이터는 장애복구를 위해 필요한 것이므로 무조건 보관할 수 있다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업이라는 목적만으로 파기 대상 개인정보의 보존 필요성이 자동으로 인정되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 보존정책과 개인정보의 보유기간 및 법적 보존근거를 함께 검토해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 3&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;S3 DeleteObject가 성공했으므로 완전히 삭제되었다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 Versioning이 활성화된 경우 일반적인 DeleteObject는 삭제 마커를 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 객체 버전과 비현재 버전의 존재 여부를 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 4&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;스냅샷을 삭제하기 전에 zero-fill을 수행해야 한다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 관리형 스냅샷을 온프레미스 디스크와 동일한 방식으로 취급해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스냅샷의 보존 필요성, 보존기간, 관리 서비스, 삭제 또는 만료 정책을 확인하는 방식으로 파기 통제를 설계해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 5&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;CISO가 예외를 승인했으므로 파기하지 않아도 된다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;올바른 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외 승인은 관리적 의사결정의 증적일 수 있지만, 개인정보의 보유 및 파기 여부는 별도의 법적&amp;middot;업무적 근거와 함께 검토해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;22. 실무 점검 체크리스트&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;파기 예정일을 식별할 수 있는가&lt;/li&gt;
&lt;li&gt;파기 대상과 보존 대상을 구분하는가&lt;/li&gt;
&lt;li&gt;법령상 보존 예외를 관리하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;파기 작업이 정상적으로 수행되는가&lt;/li&gt;
&lt;li&gt;파기 결과를 검증하는가&lt;/li&gt;
&lt;li&gt;파기 기록을 보관하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;백업 보존기간을 관리하는가&lt;/li&gt;
&lt;li&gt;복제본 존재 여부를 확인하는가&lt;/li&gt;
&lt;li&gt;다른 리전의 저장본을 확인하는가&lt;/li&gt;
&lt;li&gt;백업에도 개인정보 파기 정책이 적용되는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;S3&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Versioning 상태를 확인하는가&lt;/li&gt;
&lt;li&gt;Noncurrent Version을 관리하는가&lt;/li&gt;
&lt;li&gt;Delete Marker를 관리하는가&lt;/li&gt;
&lt;li&gt;Lifecycle 정책을 확인하는가&lt;/li&gt;
&lt;li&gt;Object Lock 적용 여부를 확인하는가&lt;/li&gt;
&lt;li&gt;파기 대상 객체의 실제 삭제 결과를 검증하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Snapshot / Backup&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EBS Snapshot 존재 여부를 확인하는가&lt;/li&gt;
&lt;li&gt;AWS Backup 복구 지점을 확인하는가&lt;/li&gt;
&lt;li&gt;Snapshot 보존기간을 관리하는가&lt;/li&gt;
&lt;li&gt;백업 삭제 권한과 절차를 관리하는가&lt;/li&gt;
&lt;li&gt;복구 테스트 후 불필요한 테스트 데이터가 남지 않는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;이관 후 저장 위치 확인&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;li&gt;파기 결과 최종 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;23. 이번 사례의 핵심 포인트&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 가장 중요한 부분은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인정보 파기는 운영 데이터에서 파일을 삭제하는 작업으로 끝나는 것이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서는 하나의 개인정보가 여러 저장소에 복제될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개인정보 파기 프로세스는 다음과 같이 확장되어야 한다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[파기 대상 식별]
       &amp;darr;
[보유기간 / 법적 보존근거 확인]
       &amp;darr;
[운영 데이터 확인]
       &amp;darr;
[백업 데이터 확인]
       &amp;darr;
[복제본 확인]
       &amp;darr;
[스냅샷 확인]
       &amp;darr;
[S3 Version 확인]
       &amp;darr;
[파기 또는 적정한 보존관리]
       &amp;darr;
[파기 결과 검증]
       &amp;darr;
[증적 보관]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;24. 마무리&lt;/h1&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;이기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 마이그레이션 과정에서는 다음과 같은 문제가 쉽게 발생한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;운영 데이터는 삭제했지만 백업에는 남아 있다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;레거시 시스템은 폐기했지만 스냅샷은 그대로 남아 있다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 상황에서 단순히 저장소 접근권한을 제한했다고 해서 개인정보 파기 문제를 해결했다고 판단해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 해당 개인정보가 실제로 파기 대상인지 확인하고, 법령 등에 따라 보존해야 하는 정보라면 3.4.2에 따라 필요한 최소한의 항목으로 제한하고 다른 개인정보와 분리하여 관리해야 한다. 반대로 보존 근거가 없는 파기 대상이라면 관련 저장본까지 포함하여 파기 범위를 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 환경에서는 특히 &lt;b&gt;S3 Versioning, Noncurrent Version, Backup, Snapshot, Cross-Region Replica&lt;/b&gt; 등을 함께 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3의 경우 단순 DeleteObject가 버전 관리 환경에서는 삭제 마커만 생성할 수 있으므로, 실제 객체 버전이 남아 있는지를 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 클라우드 환경에서 개인정보 파기의 핵심은 다음 한 문장으로 정리할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;삭제 명령을 실행했는가&quot;가 아니라 &quot;파기 대상 개인정보가 더 이상 불필요하게 관리되는 저장본에 남아 있지 않은지를 확인했는가&quot;가 중요하다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISMS-P 인증기준 3.4.1 개인정보 파기&lt;/li&gt;
&lt;li&gt;ISMS-P 인증기준 3.4.2 처리목적 달성 후 보유 시 조치&lt;/li&gt;
&lt;li&gt;개인정보 보호법 및 관련 하위 규정&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;mdash; Deleting objects&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;mdash; Deleting object versions&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;mdash; Versioning&lt;/li&gt;
&lt;li&gt;AWS Amazon EBS &amp;mdash; Delete an EBS snapshot&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>#ISMS_P #인증심사 #KISA #개인정보파기 #3.4.1 #보안결함 #AWS #보안설정 #보안담당자 #보안설정</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/139</guid>
      <comments>https://ismsp-case.tistory.com/139#entry139comment</comments>
      <pubDate>Wed, 23 Sep 2026 09:58:28 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검] 서비스 관리 보안 분야 (U-59 ~ U-63) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/134</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aaaaaaa.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nc155/dJMcacR4Flf/5UDpqPr5nSD0dDkNuNkRd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nc155/dJMcacR4Flf/5UDpqPr5nSD0dDkNuNkRd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nc155/dJMcacR4Flf/5UDpqPr5nSD0dDkNuNkRd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnc155%2FdJMcacR4Flf%2F5UDpqPr5nSD0dDkNuNkRd0%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;1672&quot; height=&quot;941&quot; data-filename=&quot;aaaaaaa.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SNMP 및 접속 정책 관리 그룹(U-59 ~ U-63)의 보안 진단과 안전한 설정 절차를 안내해 드립니다. 본 가이드에서는 SNMP v3 암호화 전환, 커뮤니티 스트링 복잡도, IP 접근 통제, 로그인 배너 및 sudo 권한 오남용 방지를 위한 자동 진단 스크립트 해설과 함께 안전한 조치 및 백업 방법을 상세히 설명합니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. SNMP 및 접속 정책 관리 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.3488%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 43.3721%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.3721%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-59&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;안전한 SNMP 버전 사용&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/snmp/snmpd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 43.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;SNMP 서비스를 미사용하거나, 암호화를 지원하는 SNMPv3를 사용하는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-60&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;SNMP Community String 복잡성 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/snmp/snmpd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 43.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;Community String이 public, private 등 기본값이 아니며 복잡성을 만족하는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-61&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;SNMP Access Control 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/snmp/snmpd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 43.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;SNMP 서비스에 특정 IP 또는 네트워크 대역만 접근 가능하도록 ACL이 설정된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-62&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;로그인 시 경고 메시지 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/motd,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/issue,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/issue.net&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 43.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;서버 접속 전/후 화면에 법적 책임 고지 및 경고 문구가 정상적으로 등록된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-63&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;sudo 명령어 접근 관리&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/sudoers,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/sudoers.d/*&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 43.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;특정 사용자에게 패스워드 없이 모든 권한을 부여하는(NOPASSWD: ALL) 설정이 없는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-59] 안전한 SNMP 버전 사용&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SNMP v1 및 v2c 버전은 커뮤니티 스트링(Community String)과 전송 데이터를 평문(Plaintext)으로 주고받습니다. 네트워크 스니핑을 통해 관리자 문자열이 노출되면 인프라 구성 정보가 유출될 수 있으므로, 인증과 암호화를 지원하는 SNMPv3 사용을 권장합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-59 점검 시작
CODE &quot;[ U-59 ] 안전한 SNMP 버전 사용&quot;

# SNMP 서비스가 구동 중인지 변수 확인
if [[ &quot;$SNMP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    # SNMP 설정 파일 존재 여부 검사
    if [ -f /etc/snmp/snmpd.conf ]; then
        # v1, v2c에서 사용되는 rocommunity, rwcommunity 주석 제외 지시어 검색
        if grep -E -i &quot;^[[:space:]]*r[ow]community&quot; /etc/snmp/snmpd.conf &amp;gt;/dev/null; then
            # 취약한 버전(v1/v2c) 지시어가 발견되면 취약 판정
            WARN &quot;취약한 SNMP 버전(v1, v2c) 설정 지시어(rocommunity 등)가 확인되었습니다.&quot; &quot;snmpd.conf 내에 평문 전송 버전 사용&quot;
        else
            # v3 전용 설정(rouser, rwuser)만 존재할 경우 양호 판정
            OK &quot;취약한 SNMP 버전(v1, v2c) 설정이 발견되지 않았습니다. (SNMPv3 권장)&quot; &quot;snmpd.conf 내에 취약 지시어 없음&quot;
        fi
    else
        INFO &quot;SNMP 서비스는 동작 중이나 설정 파일(/etc/snmp/snmpd.conf)을 찾을 수 없습니다.&quot; &quot;설정 파일 경로 상이&quot;
    fi
else
    # SNMP 데몬이 실행 중이지 않으면 N/A 처리
    OK &quot;SNMP 서비스가 구동되지 않으므로 버전 취약점 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 서비스 미사용&quot;
fi
FINISH &quot;[ U-59 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 기존 NMS(네트워크 관리 시스템)가 v2c 기반으로 동작 중일 때 사전 협의 없이 v1/v2c 지시어를 삭제할 경우, 모니터링 관제 시스템 전체에서 해당 서버의 메트릭 수집이 중단되는 장애가 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: SNMPv3 계정을 생성한 후, 외부 관제 서버에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;snmpwalk&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 통해 v3 암호화 통신이 정상 동작하는지 테스트해야 합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;snmpwalk -v 3 -u [계정명] -l authPriv -a SHA -A [인증키] -x AES -X [암호화키] [서버IP] system&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경Tip&lt;/span&gt;: 레거시 NMS 장비의 제약으로 SNMPv3 도입이 불가능한 경우, 물리적으로 분리된 OAM(운영관리) 전용 망을 통해서만 통신하도록 제한하고 하위 항목(U-60, U-61)의 강화를 병행해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;SNMPv3 사용자 생성 및 설정 (예시)&lt;/span&gt;&lt;br /&gt;/etc/snmp/snmpd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;내 기존&lt;span&gt;&amp;nbsp;&lt;/span&gt;rocommunity&lt;span&gt;&amp;nbsp;&lt;/span&gt;구문을 주석 처리(#)하고, SNMPv3 사용자를 추가합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;n1ql&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# net-snmp-create-v3-user 명령을 사용하거나 설정 파일에 rouser 구문 추가
rouser secuser authpriv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 재시작 및 동작 확인&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl restart snmpd
systemctl status snmpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-60] SNMP Community String 복잡성 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SNMP v1/v2c를 불가피하게 사용해야 할 경우, 기본 설정값인&lt;span&gt;&amp;nbsp;&lt;/span&gt;public&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;private을 그대로 방치하면 무차별 대입 공격(Brute Force)을 통해 서버 시스템 정보가 유출될 위험이 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-60 점검 시작
CODE &quot;[ U-60 ] SNMP Community String 복잡성 설정&quot;

if [[ &quot;$SNMP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    if [ -f /etc/snmp/snmpd.conf ]; then
        # 주석을 제외한 설정 중 public 또는 private 문자열이 사용되었는지 검색
        if grep -E -i &quot;^[[:space:]]*r[ow]community[[:space:]]+(public|private)&quot; /etc/snmp/snmpd.conf &amp;gt;/dev/null; then
            # 기본 커뮤니티 스트링 발견 시 취약 판정
            WARN &quot;SNMP Community String이 기본값(public/private)으로 설정되어 정보 유출 위험이 높습니다.&quot; &quot;snmpd.conf 내 public/private 노출&quot;
        elif grep -E -i &quot;^[[:space:]]*r[ow]community&quot; /etc/snmp/snmpd.conf &amp;gt;/dev/null; then
            # 기본값이 아닌 다른 임의의 문자열이 사용된 경우 양호 판정
            OK &quot;SNMP Community String이 기본값이 아닌 다른 문자열로 변경되어 있습니다.&quot; &quot;snmpd.conf 내 복잡성 부여&quot;
        else
            OK &quot;Community String 방식(v1/v2c)을 사용하지 않습니다. (SNMPv3 사용 등)&quot; &quot;취약 지시어 없음&quot;
        fi
    else
        INFO &quot;설정 파일(/etc/snmp/snmpd.conf)을 찾을 수 없습니다.&quot; &quot;파일 부재&quot;
    fi
else
    OK &quot;SNMP 서비스가 구동되지 않으므로 Community String 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 서비스 미사용&quot;
fi
FINISH &quot;[ U-60 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 서버 측&lt;span&gt;&amp;nbsp;&lt;/span&gt;snmpd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일의 Community String만 변경하고, 중앙 NMS 관제 솔루션의 설정값을 동시에 변경하지 않아 관제 알람이 대량 발생하거나 모니터링 누락이 생기는 경우가 자주 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 변경된 커뮤니티 스트링을 적용한 후, 로컬 및 관제 서버에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;snmpget으로 정상 응답을 받는지 검증합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;snmpget -v 2c -c [신규_커뮤니티_스트링] localhost 1.3.6.1.2.1.1.1.0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대안 설정&lt;/span&gt;: 영문 대소문자, 숫자, 특수문자를 조합하여 최소 8자 이상의 무작위 문자열로 설정해야 합니다. (예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;C0mpL3x_Snmp_2026!)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Community String 변경&lt;/span&gt;&lt;br /&gt;/etc/snmp/snmpd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 수정합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 변경 전: rocommunity public
# 변경 후: rocommunity M3tr!c_S3cur3_Str 192.168.10.0/24&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 재시작&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl reload snmpd || systemctl restart snmpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-61] SNMP Access Control 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Community String을 복잡하게 변경하더라도 IP 접근 통제(ACL)가 설정되지 않으면 전 세계 모든 IP에서 접근 시도가 가능해집니다. 허가된 관제 서버(NMS)의 IP 또는 네트워크 대역으로만 SNMP 조회를 제한해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-61 점검 시작
CODE &quot;[ U-61 ] SNMP Access Control 설정&quot;

if [[ &quot;$SNMP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    if [ -f /etc/snmp/snmpd.conf ]; then
        # rocommunity 지시어 뒤에 IP/서브넷 필드가 누락되었는지 확인 (필드 수가 3개 미만인 구문 추출)
        WEAK_ACL=$(grep -E -i &quot;^[[:space:]]*r[ow]community&quot; /etc/snmp/snmpd.conf | awk '{if (NF &amp;lt; 3) print $0}')
        
        if [ -n &quot;$WEAK_ACL&quot; ]; then
            # ACL이 지정되지 않은 설정이 존재하면 취약 판정
            WARN &quot;SNMP 접근 통제(IP ACL)가 설정되지 않아 모든 IP에서 SNMP 조회가 가능합니다.&quot; &quot;IP 대역 제한이 누락된 설정 발견: [ $WEAK_ACL ]&quot;
        elif grep -E -i &quot;^[[:space:]]*r[ow]community&quot; /etc/snmp/snmpd.conf &amp;gt;/dev/null; then
            OK &quot;SNMP 설정에 특정 IP/네트워크로 접근을 제한하는 ACL이 적용되어 있습니다.&quot; &quot;snmpd.conf에 IP 제한 설정 확인&quot;
        else
            OK &quot;v1/v2c 방식의 community 설정을 사용하지 않습니다.&quot; &quot;해당 없음&quot;
        fi
    else
        INFO &quot;설정 파일(/etc/snmp/snmpd.conf)을 찾을 수 없습니다.&quot; &quot;파일 부재&quot;
    fi
else
    OK &quot;SNMP 서비스가 구동되지 않으므로 접근 통제 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 서비스 미사용&quot;
fi
FINISH &quot;[ U-61 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 서브넷 마스크 단위를 잘못 입력하거나(예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/24를&lt;span&gt;&amp;nbsp;&lt;/span&gt;/32로 지정하여 단일 IP만 허용), 이중화된 NMS 관제 서버의 보조(Secondary) IP를 ACL에 누락시켜 Failover 시 관제가 중단되는 사례가 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 허가된 IP와 비허가된 IP 양쪽에서 패킷 요청을 보내 방화벽 및&lt;span&gt;&amp;nbsp;&lt;/span&gt;snmpd&lt;span&gt;&amp;nbsp;&lt;/span&gt;차단 동작을 확인합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경Tip&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;snmpd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;내의 ACL 외에도 OS 방화벽(firewalld,&lt;span&gt;&amp;nbsp;&lt;/span&gt;iptables) 레벨에서 UDP 161번 포트를 관제 IP 전용으로 2중 차단하는 것이 보안상 매우 안전합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;IP 제한 구문 설정&lt;/span&gt;&lt;br /&gt;/etc/snmp/snmpd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;내에 허용할 IP 대역 지정
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [rocommunity] [커뮤니티스트링] [허용IP 또는 대역]
rocommunity M3tr!c_S3cur3_Str 10.10.10.50/32&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 재시작&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl restart snmpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-62] 로그인 시 경고 메시지 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;서버 접속(SSH, Telnet, 콘솔) 시 법적 책임을 고지하는 경고 메시지를 노출함으로써, 비인가자의 무단 접근을 심리적으로 차단하고 침해사고 발생 시 법적 대응의 근거를 마련합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-62 점검 시작
CODE &quot;[ U-62 ] 로그인 시 경고 메시지 설정&quot;

BANNER_FILES=&quot;/etc/motd /etc/issue /etc/issue.net&quot;
VULN_BANNERS=&quot;&quot;

for f in $BANNER_FILES; do
    # -s 옵션을 사용하여 파일이 존재하지 않거나 내용의 크기가 0(비어있음)인지 점검
    if [ ! -s &quot;$f&quot; ]; then
        VULN_BANNERS=&quot;$VULN_BANNERS $f&quot;
    fi
done

if [ -n &quot;$VULN_BANNERS&quot; ]; then
    # 하나라도 비어있는 배너 파일이 존재하면 취약 판정
    WARN &quot;로그인 전/후에 법적 책임을 고지하는 경고 메시지(Banner)가 설정되지 않았습니다.&quot; &quot;내용이 비어있거나 누락된 파일: [ $VULN_BANNERS ]&quot;
else
    OK &quot;모든 주요 로그인 배너 파일(/etc/motd, /etc/issue 등)에 경고 메시지가 설정되어 있습니다.&quot; &quot;파일 내 내용 확인됨&quot;
fi
FINISH &quot;[ U-62 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 배너 메시지에 OS 버전, 커널 버전, 호스트명 등 내부 시스템 정보(\r,&lt;span&gt;&amp;nbsp;&lt;/span&gt;\m,&lt;span&gt;&amp;nbsp;&lt;/span&gt;\v&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션 사용)를 상세히 포함하면 공격자에게 시스템 취약점 탐색 정보를 제공하는 결과를 초래합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/ssh/sshd_config&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에&lt;span&gt;&amp;nbsp;&lt;/span&gt;Banner /etc/issue.net&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목이 주석 해제되어 활성화되어 있는지 반드시 함께 검증해야 원격 SSH 접속 시 배너가 정상 출력됩니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;배너 문구 작성 가이드&lt;/span&gt;: &quot;인가된 사용자만 접근 가능하며, 모든 작업 내역은 실시간 기록 및 감사됩니다.&quot;와 같이 법적 고지 문구 위주로 구성해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;배너 파일 백업 및 생성&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/motd /etc/motd.bak_$(date +%Y%m%d) 2&amp;gt;/dev/null
cp -p /etc/issue.net /etc/issue.net.bak_$(date +%Y%m%d) 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;경고 문구 입시 적용&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /etc/motd
*************************************************************************
* WARNING: Authorized users only. All activity may be monitored and     *
* reported. Unauthorized access will be prosecuted to the full extent   *
* of the law.                                                            *
*************************************************************************
EOF

cp /etc/motd /etc/issue
cp /etc/motd /etc/issue.net&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;SSH 설정 적용 및 데몬 리로드&lt;/span&gt;&lt;br /&gt;/etc/ssh/sshd_config&lt;span&gt;&amp;nbsp;&lt;/span&gt;내 아래 항목 확인 후 리로드
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;Banner /etc/issue.net&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;sshd -t
systemctl reload sshd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-63] sudo 명령어 접근 관리&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/etc/sudoers&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에 비밀번호 인증 없는 root 권한 행사(NOPASSWD: ALL) 설정이 무분별하게 남용될 경우, 계정 탈취 시 시스템 전체 제어권이 해커에게 넘어가는 심각한 보안 사고로 이어집니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;perl&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-63 점검 시작
CODE &quot;[ U-63 ] sudo 명령어 접근 관리&quot;

if [ -f /etc/sudoers ]; then
    # 주석(#)과 Defaults 설정을 제외하고 NOPASSWD와 ALL 구문이 동시에 존재하는 취약 라인 검색
    WEAK_SUDO=$(grep -E -v &quot;^[[:space:]]*#|^[[:space:]]*Defaults&quot; /etc/sudoers | grep &quot;NOPASSWD&quot; | grep &quot;ALL&quot;)
    
    if [ -n &quot;$WEAK_SUDO&quot; ]; then
        WARN &quot;/etc/sudoers 파일에 패스워드 없이 root 권한을 행사할 수 있는 취약한 설정(NOPASSWD)이 존재합니다.&quot; &quot;발견된 취약 구문: [ $WEAK_SUDO ]&quot;
    else
        OK &quot;/etc/sudoers 파일에 NOPASSWD 구문이 남용되지 않았습니다.&quot; &quot;모든 sudo 실행 시 인증 절차 준수 확인&quot;
    fi
    
    # 수동 점검 대상 안내
    INFO &quot;sudo 권한이 부여된 사용자 및 그룹 목록의 적절성을 시스템 관리자가 주기적으로 수동 점검해야 합니다.&quot; &quot;기본 관리자(root, %wheel) 외 불필요한 sudo 허용 계정 점검&quot;
else
    WARN &quot;/etc/sudoers 파일을 찾을 수 없습니다.&quot; &quot;파일 경로 확인&quot;
fi
FINISH &quot;[ U-63 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/sudoers&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을&lt;span&gt;&amp;nbsp;&lt;/span&gt;vi로 직접 수정하다가 문법 오류(Syntax Error)를 발생시킨 상태에서 세션을 종료하면, 이후 모든 일반 계정의&lt;span&gt;&amp;nbsp;&lt;/span&gt;sudo&lt;span&gt;&amp;nbsp;&lt;/span&gt;실행이 불가능해져 서버 락아웃(Lockout)이 발생하는 대형 장애가 생깁니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 수정 시 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;visudo&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어를 사용하여 자동 문법 검사를 수행하거나, 파일 편집 후 별도의 터미널 창을 열어&lt;span&gt;&amp;nbsp;&lt;/span&gt;sudo -v&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령으로 문법 정상 여부를 검증해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Ansible/CI/CD 환경 대안 설정&lt;/span&gt;: 자동화 배포 계정 등에&lt;span&gt;&amp;nbsp;&lt;/span&gt;NOPASSWD&lt;span&gt;&amp;nbsp;&lt;/span&gt;부여가 불가피한 경우,&lt;span&gt;&amp;nbsp;&lt;/span&gt;ALL&lt;span&gt;&amp;nbsp;&lt;/span&gt;구문을 피하고 서비스 재시작 등 필요한 특정 명령어 파이프라인으로 실행 범위를 제한해야 합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;apache&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 권장 예시: 특정 명령어로 한정
deployer ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;sudoers 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/sudoers /etc/sudoers.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;visudo를 이용한 파일 수정&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;visudo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
취약 구문 수정 또는 주석 처리:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 취약 설정: user01 ALL=(ALL) NOPASSWD: ALL
# 변경 조치: user01 ALL=(ALL) ALL&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;문법 검사 검증&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;visudo -c&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 스크립트 한계점 분석 및 고도화 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.1. 기존 스크립트의 점검 한계점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Include 분할 디렉터리 미인식&lt;/span&gt;: 최신 OS 환경(RHEL 8/9, Ubuntu 22.04/24.04 등)에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/sudoers.d/&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/snmp/snmpd.conf.d/와 같은 분할 설정 디렉터리를 적극 활용합니다. 기존 스크립트는 단일 메인 파일만 검사하므로 분할 디렉터리에 위치한 취약한 설정을 탐지하지 못하는 오탐/미탐 가능성이 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;SSH 배너 미연동 탐지 한계&lt;/span&gt;: U-62 항목에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/issue.net&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에 내용이 존재하더라도, SSH 데몬 설정(/etc/ssh/sshd_config)에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;Banner&lt;span&gt;&amp;nbsp;&lt;/span&gt;지시어가 주석 처리되어 있으면 실제 원격 접속 시 배너가 표시되지 않는 오탐이 발생합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.2. 핵심 개선 로직 스니펫 (3~5줄)&lt;/h3&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫] sudoers.d 분할 디렉터리 포함 NOPASSWD 완벽 검사 로직
SUDO_FILES=&quot;/etc/sudoers $(ls /etc/sudoers.d/* 2&amp;gt;/dev/null)&quot;
WEAK_SUDO_ALL=$(grep -E -v &quot;^[[:space:]]*#&quot; $SUDO_FILES 2&amp;gt;/dev/null | grep &quot;NOPASSWD&quot; | grep &quot;ALL&quot;)
if [ -n &quot;$WEAK_SUDO_ALL&quot; ]; then
    WARN &quot;/etc/sudoers 및 /etc/sudoers.d/ 내에 무제한 NOPASSWD 설정 발견: [ $WEAK_SUDO_ALL ]&quot;
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;4. 마치며&lt;/h2&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SNMP 서비스 및 접속 권한 관련 설정은 시스템 관리의 편의성과 보안성이 팽팽하게 대립하는 영역입니다. 조치 과정에서 관리자 인증 세션 단절이나 관제 시스템 모니터링 중단과 같은 장애가 발생하지 않도록, 반드시 본 가이드에 안내된 사전 백업과 문법 검사 절차를 준수해 주시기 바랍니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #주요정보통신기반시설 #취약점점검 #보안가이드 #서버보안 #SNMP보안 #로그인배너 #권한관리 #접근통제 #시스템보안</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/134</guid>
      <comments>https://ismsp-case.tistory.com/134#entry134comment</comments>
      <pubDate>Mon, 21 Sep 2026 10:04:58 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검] 서비스 관리 보안 분야 (U-54 ~ U-58) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/131</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aaa.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xs59u/dJMcafg6dTk/uXZKXwOSfi8w09Q8uO6VP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xs59u/dJMcafg6dTk/uXZKXwOSfi8w09Q8uO6VP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xs59u/dJMcafg6dTk/uXZKXwOSfi8w09Q8uO6VP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXs59u%2FdJMcafg6dTk%2FuXZKXwOSfi8w09Q8uO6VP0%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;1376&quot; height=&quot;768&quot; data-filename=&quot;aaa.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;서비스 관리 그룹의 핵심 보안인 U-54부터 U-58까지의 항목에 대해 자동 진단 기법과 안전한 조치 및 백업 절차를 안내해 드립니다. FTP 및 SNMP 서비스의 평문 전송 위험, 쉘 제한, 접근 제어 파일 미설정 등의 보안 취약점을 점검하고 장애 없는 인프라 환경을 구축하기 위한 10년 차 엔지니어의 실무 노하우를 전달합니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 서비스 관리 및 암호화 설정 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.3256%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 15.6977%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 48.0233%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.86046%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-54&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;암호화되지 않는 FTP 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 15.6977%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/vsftpd/vsftpd.conf&lt;br /&gt;/etc/proftpd/proftpd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 48.0233%;&quot; data-streamdown=&quot;table-cell&quot;&gt;FTP 서비스가 비활성화되어 있거나, FTPS/SFTP 등 암호화 통신이 적용된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.86046%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-55&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;FTP 계정 Shell 제한&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 15.6977%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/passwd&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 48.0233%;&quot; data-streamdown=&quot;table-cell&quot;&gt;ftp 시스템 계정의 로그인 쉘이&lt;span&gt;&amp;nbsp;&lt;/span&gt;/sbin/nologin&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/bin/false로 설정된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.86046%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-56&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;FTP 서비스 접근 제어 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 15.6977%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/hosts.deny&lt;br /&gt;/etc/vsftpd/vsftpd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 48.0233%;&quot; data-streamdown=&quot;table-cell&quot;&gt;TCP Wrapper(ALL:ALL) 통제 또는 FTP 자체 접근 제한(userlist_enable)이 설정된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.86046%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-57&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;Ftpusers 파일 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 15.6977%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/ftpusers&lt;br /&gt;/etc/vsftpd/ftpusers&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 48.0233%;&quot; data-streamdown=&quot;table-cell&quot;&gt;ftpusers 파일이 존재하며 root 계정이 명시적으로 등록되어 접속이 차단된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.86046%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-58&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;불필요한 SNMP 서비스 구동 점검&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 15.6977%;&quot; data-streamdown=&quot;table-cell&quot;&gt;snmpd.service&lt;br /&gt;프로세스 목록 (ps)&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 48.0233%;&quot; data-streamdown=&quot;table-cell&quot;&gt;NMS 용도로 사용하지 않는 SNMP 서비스(snmpd)가 비활성화되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.86046%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-54] 암호화되지 않는 FTP 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전통적인 FTP 프로토콜(21/tcp)은 계정 정보와 데이터를 평문(Plaintext)으로 전송하므로, 동일 네트워크 내의 스니핑(Sniffing) 공격으로 인해 관리자 자격 증명이 노출될 수 있습니다. 본 점검은 암호화되지 않은 FTP 통신을 차단하고 TLS/SSL을 적용한 FTPS 모드 또는 SSH 기반의 SFTP 모드로 전환되어 있는지 확인하는 것을 목적으로 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] FTP 데몬 프로세스 및 systemd 서비스 활성화 상태 확인
FTP_RUNNING=&quot;FALSE&quot;
if ps -ef | grep -E &quot;vsftpd|proftpd|in.ftpd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null || systemctl is-active --quiet vsftpd 2&amp;gt;/dev/null; then
    FTP_RUNNING=&quot;TRUE&quot;
fi

# [상세 해설] FTP 구동 시 암호화(SSL/TLS) 적용 여부 검증
if [[ &quot;$FTP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    SECURE_FTP=&quot;FALSE&quot;
    REASON_FTP=&quot;&quot;

    # [상세 해설] vsftpd 설정 파일 내 ssl_enable 지시어 점검
    if [ -f /etc/vsftpd/vsftpd.conf ]; then
        if grep -E -i -q &quot;^[[:space:]]*ssl_enable[[:space:]]*=[[:space:]]*YES&quot; /etc/vsftpd/vsftpd.conf; then
            SECURE_FTP=&quot;TRUE&quot;
            REASON_FTP=&quot;vsftpd.conf 에 ssl_enable=YES (FTPS) 설정이 적용되어 있습니다.&quot;
        else
            REASON_FTP=&quot;vsftpd.conf 에 ssl_enable=YES 설정이 누락되어 평문 전송 위험이 있습니다.&quot;
        fi
    # [상세 해설] proftpd 설정 파일 내 TLSProtocol 지시어 점검
    elif [ -f /etc/proftpd/proftpd.conf ] || [ -f /etc/proftpd.conf ]; then
        CONF_FILE=$(ls /etc/proftpd/proftpd.conf /etc/proftpd.conf 2&amp;gt;/dev/null | head -1)
        if grep -E -i -q &quot;^[[:space:]]*TLSProtocol&quot; &quot;$CONF_FILE&quot;; then
            SECURE_FTP=&quot;TRUE&quot;
            REASON_FTP=&quot;proftpd.conf 에 TLSProtocol 통신 설정이 적용되어 있습니다.&quot;
        else
            REASON_FTP=&quot;proftpd.conf 에 TLS 통신 설정이 누락되어 평문 전송 위험이 있습니다.&quot;
        fi
    else
        REASON_FTP=&quot;FTP 구동 중이나 설정 파일 위치를 찾을 수 없습니다 (수동 점검 필요).&quot;
    fi

    if [[ &quot;$SECURE_FTP&quot; == &quot;TRUE&quot; ]]; then
        OK &quot;FTP 서비스가 구동 중이나, 암호화된 통신(SFTP/FTPS)이 설정되어 있습니다.&quot; &quot;$REASON_FTP&quot;
    else
        WARN &quot;암호화되지 않은 FTP 통신(21/tcp)이 동작 중이어서 스니핑 위험이 있습니다.&quot; &quot;$REASON_FTP&quot;
    fi
else
    OK &quot;취약한 일반 FTP 서비스가 비활성화되어 있습니다. (SSH 기반의 SFTP 사용 권장)&quot; &quot;FTP 프로세스 미동작&quot;
fi
FINISH &quot;[ U-54 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FTP 서비스를 비활성화하고 OpenSSH 기반의 SFTP로 일원화하는 조치 절차입니다. FTPS가 반드시 필요한 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;vsftpd.conf를 수정합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;FTP 서비스 완전 비활성화 (SFTP 사용 시 권장)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop vsftpd
systemctl disable vsftpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;FTPS 설정 적용 (vsftpd 사용이 필수적인 경우)&lt;/span&gt;&lt;br /&gt;/etc/vsftpd/vsftpd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일 하단에 다음 설정을 추가 또는 변경합니다.&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1_2=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 검증 및 재시작&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl restart vsftpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 기존 연동 시스템(구형 레거시 API 클라이언트 등)이 TLS를 지원하지 않거나 암호화 핸드셰이크 처리를 못 하여 파일 전송 작업이 일괄 실패하는 장애가 빈번히 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 방법&lt;/span&gt;: 조치 후 클라이언트 측에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;openssl s_client -connect [서버IP]:21 -starttls ftp&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 통해 인증서 및 TLS 핸드셰이크 동작 여부를 미리 확인해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 조언&lt;/span&gt;: Cloud 및 MSA/DevOps 환경에서는 FTP 데몬을 전면 배제하고 AWS S3 SDK 또는 SSH Subsystem 기반 SFTP 전용 인프라를 사용하는 것이 운영 및 보안상 유리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-55] FTP 계정 Shell 제한&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 내&lt;span&gt;&amp;nbsp;&lt;/span&gt;ftp&lt;span&gt;&amp;nbsp;&lt;/span&gt;계정은 익명 접속이나 전용 FTP 데몬 관리를 위해 존재하는 시스템 계정입니다. 해당 계정에 대화형 쉘(Shell) 권한이 부여되어 있으면 대화형 로그인 공격에 악용될 수 있으므로 로그인 불가능한 쉘(/sbin/nologin&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/bin/false)로 제한해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] /etc/passwd 파일에서 ftp 계정의 로그인 쉘(7번째 필드) 추출
FTP_USER_SHELL=$(grep -E &quot;^ftp:&quot; /etc/passwd | awk -F: '{print $7}')

# [상세 해설] ftp 계정 존재 여부 및 쉘 제한(nologin/false/sync) 검증
if [ -n &quot;$FTP_USER_SHELL&quot; ]; then
    if echo &quot;$FTP_USER_SHELL&quot; | grep -E -q &quot;nologin|false|sync&quot;; then
        OK &quot;ftp 시스템 계정에 로그인 불가능한 쉘이 안전하게 부여되어 있습니다.&quot; &quot;/etc/passwd 내 ftp 계정의 쉘: $FTP_USER_SHELL&quot;
    else
        WARN &quot;ftp 시스템 계정에 로그인 가능한 쉘이 부여되어 있어 로컬 접속 악용 위험이 있습니다.&quot; &quot;현재 부여된 쉘: $FTP_USER_SHELL (권고: /sbin/nologin)&quot;
    fi
else
    OK &quot;시스템 내에 ftp 기본 시스템 계정이 존재하지 않습니다.&quot; &quot;/etc/passwd 에 ftp 계정 없음&quot;
fi
FINISH &quot;[ U-55 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;계정 정보 파일 백업&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/passwd /etc/passwd.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;쉘 제한 조치 실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;usermod -s /sbin/nologin ftp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;조치 결과 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;gradle&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;grep -E &quot;^ftp:&quot; /etc/passwd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/shells&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에&lt;span&gt;&amp;nbsp;&lt;/span&gt;/sbin/nologin&lt;span&gt;&amp;nbsp;&lt;/span&gt;경로가 누락되어 일부 서비스 PAM 인증과의 마찰로 FTP 접속 자체가 거부되는 현상이 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 방법&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;cat /etc/shells&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어로 사용 중인 nologin 쉘 경로가 등록되어 있는지 확인하십시오.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대안 환경 조언&lt;/span&gt;: FTP 데몬을 완벽히 격리하려면 OS 기본 계정이 아닌 vsftpd의 Virtual Users(가상 계정) 기능을 적용하여 DB나 별도 인증 파일로만 접속을 처리하는 방식이 안전합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-56] FTP 서비스 접근 제어 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FTP 서비스에 대한 무분별한 접근을 차단하기 위해 IP 기반 통제(TCP Wrapper) 또는 FTP 계정 기반 접근 제어 목록(userlist)을 구성하였는지 검증합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] FTP 동작 시 접근 제어 정책 적용 여부 점검
if [[ &quot;$FTP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    ACL_SAFE=&quot;FALSE&quot;
    REASON_ACL=&quot;&quot;

    # [상세 해설] 1. TCP Wrapper(/etc/hosts.deny)의 ALL:ALL 정책 유무 확인
    if [ -f /etc/hosts.deny ] &amp;amp;&amp;amp; grep -E -q &quot;^[[:space:]]*ALL[[:space:]]*:[[:space:]]*ALL&quot; /etc/hosts.deny; then
        ACL_SAFE=&quot;TRUE&quot;
        REASON_ACL=&quot;/etc/hosts.deny에 ALL:ALL 정책이 적용되어 기본 접근이 통제됨.&quot;
    # [상세 해설] 2. vsftpd 사용자 목록 접근제어(userlist_enable=YES) 확인
    elif [ -f /etc/vsftpd/vsftpd.conf ] &amp;amp;&amp;amp; grep -E -i -q &quot;^[[:space:]]*userlist_enable[[:space:]]*=[[:space:]]*YES&quot; /etc/vsftpd/vsftpd.conf; then
        ACL_SAFE=&quot;TRUE&quot;
        REASON_ACL=&quot;vsftpd.conf에 userlist_enable=YES 가 설정되어 인가된 계정만 통제됨.&quot;
    else
        REASON_ACL=&quot;TCP Wrapper 통제(ALL:ALL) 또는 FTP 자체 접근 제한(userlist)이 명시되어 있지 않습니다.&quot;
    fi

    if [[ &quot;$ACL_SAFE&quot; == &quot;TRUE&quot; ]]; then
        OK &quot;FTP 서비스에 대한 접근 제어(IP 제한 또는 계정 통제)가 설정되어 있습니다.&quot; &quot;$REASON_ACL&quot;
    else
        WARN &quot;FTP 서비스에 대한 명시적인 접근 통제 설정이 미흡합니다.&quot; &quot;$REASON_ACL\n  =&amp;gt; 참고 내용: 방화벽/iptables를 통한 IP 통제 시 양호 처리 가능&quot;
    fi
else
    OK &quot;FTP 서비스가 구동되지 않으므로 접근 제어 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 데몬 미사용&quot;
fi
FINISH &quot;[ U-56 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;vsftpd 자체 접근 통제 적용&lt;/span&gt;&lt;br /&gt;/etc/vsftpd/vsftpd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;내에 관련 옵션을 반영합니다.(참고:&lt;span&gt;&amp;nbsp;&lt;/span&gt;userlist_deny=NO&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;user_list&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에 명시된 계정만 접속이 허용됩니다.)&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;허용 계정 파일 작성 및 서비스 리로드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;echo &quot;authorized_user&quot; &amp;gt; /etc/vsftpd/user_list
systemctl reload vsftpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: RHEL 8 이상 시스템에서는 TCP Wrapper(tcp_wrappers)가 공식 폐지되어&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/hosts.deny&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정이 동작하지 않습니다. 오직&lt;span&gt;&amp;nbsp;&lt;/span&gt;vsftpd.conf나 방화벽(firewalld)으로 제어해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 방법&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;userlist_deny=NO&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정 적용 시 정상 접속 계정이&lt;span&gt;&amp;nbsp;&lt;/span&gt;user_list&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에 포함되지 않아 모든 사용자의 FTP 접근이 차단되는 사고가 다수 발생하므로 리로드 전 목록을 반드시 재검증하십시오.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-57] Ftpusers 파일 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ftpusers&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일은 FTP 접근을 거부할 계정 목록을 지정합니다. 최고 관리자 계정인&lt;span&gt;&amp;nbsp;&lt;/span&gt;root가 누락될 경우, 외부에서 FTP를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;root&lt;span&gt;&amp;nbsp;&lt;/span&gt;자격 증명으로 접속을 시도할 수 있어 심각한 위협이 됩니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] FTP 구동 중일 때 ftpusers 경로 파악 및 root 계정 포함 여부 확인
if [[ &quot;$FTP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    FTPUSERS_FILE=&quot;&quot;
    [ -f /etc/ftpusers ] &amp;amp;&amp;amp; FTPUSERS_FILE=&quot;/etc/ftpusers&quot;
    [ -f /etc/vsftpd/ftpusers ] &amp;amp;&amp;amp; FTPUSERS_FILE=&quot;/etc/vsftpd/ftpusers&quot;

    if [ -n &quot;$FTPUSERS_FILE&quot; ]; then
        # [상세 해설] 주석이 아닌 root 설정 구문 검사
        if grep -E -q &quot;^[[:space:]]*root&quot; &quot;$FTPUSERS_FILE&quot;; then
            OK &quot;ftpusers 파일에 root 계정이 등록되어 있어 FTP를 통한 root 직접 접속이 차단되어 있습니다.&quot; &quot;파일 경로: $FTPUSERS_FILE&quot;
        else
            WARN &quot;ftpusers 파일이 존재하나 root 계정이 누락되어 FTP를 통한 root 직접 접속이 가능할 수 있습니다.&quot; &quot;root 등록 필요 ($FTPUSERS_FILE)&quot;
        fi
    else
        WARN &quot;ftpusers 파일(/etc/ftpusers 등)이 존재하지 않아 주요 관리자 계정의 접속 통제가 불가능합니다.&quot; &quot;ftpusers 설정 파일 누락&quot;
    fi
else
    OK &quot;FTP 서비스가 구동되지 않으므로 ftpusers 설정 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 데몬 미사용&quot;
fi
FINISH &quot;[ U-57 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;[ -f /etc/vsftpd/ftpusers ] &amp;amp;&amp;amp; cp -p /etc/vsftpd/ftpusers /etc/vsftpd/ftpusers.bak_$(date +%Y%m%d)
[ -f /etc/ftpusers ] &amp;amp;&amp;amp; cp -p /etc/ftpusers /etc/ftpusers.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;root 계정 접속 차단 등록&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;if [ -f /etc/vsftpd/ftpusers ]; then
    grep -q &quot;^root&quot; /etc/vsftpd/ftpusers || echo &quot;root&quot; &amp;gt;&amp;gt; /etc/vsftpd/ftpusers
fi
if [ -f /etc/ftpusers ]; then
    grep -q &quot;^root&quot; /etc/ftpusers || echo &quot;root&quot; &amp;gt;&amp;gt; /etc/ftpusers
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 등록 결과 검증&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;gradle&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;grep -E &quot;^root&quot; /etc/ftpusers /etc/vsftpd/ftpusers 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: PAM 설정 파일(/etc/pam.d/vsftpd)에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;pam_listfile.so&lt;span&gt;&amp;nbsp;&lt;/span&gt;모듈이 참조하는 파일 경로가&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/vsftpd/ftpusers로 지정되어 있는데, 엔지니어가&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/ftpusers만 수정하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;root&lt;span&gt;&amp;nbsp;&lt;/span&gt;차단 정책이 정상적으로 동작하지 않는 사례가 빈번합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 방법&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/pam.d/vsftpd&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 열어&lt;span&gt;&amp;nbsp;&lt;/span&gt;file=&lt;span&gt;&amp;nbsp;&lt;/span&gt;구문에 지정된 실제 억제 목록 경로를 직접 대조 확인해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-58] 불필요한 SNMP 서비스 구동 점검&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SNMP(Simple Network Management Protocol)는 네트워크 장비 및 서버 상태 모니터링에 사용됩니다. NMS 환경이 구축되지 않은 서버에서 SNMP 데몬(snmpd)이 방치될 경우 커뮤니티 스트링 스니핑 및 시스템 인벤토리 정보 유출로 이어지므로 비활성화를 권장합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] snmpd 서비스 활성화 여부 및 프로세스 구동 확인
SNMP_RUNNING=&quot;FALSE&quot;

if systemctl is-active --quiet snmpd 2&amp;gt;/dev/null || ps -ef | grep -E &quot;snmpd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    SNMP_RUNNING=&quot;TRUE&quot;
fi

if [[ &quot;$SNMP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    WARN &quot;SNMP 서비스가 동작 중입니다. 네트워크 관리(NMS) 용도로 사용하지 않는다면 비활성화가 필요합니다.&quot; &quot;snmpd 프로세스 발견&quot;
    INFO &quot;SNMP 사용이 필수적인 경우, 다음 항목(U-59~U-61)의 보안 설정을 반드시 점검하십시오.&quot; &quot;운영 필요성 수동 검토 요망&quot;
else
    OK &quot;불필요한 SNMP 서비스가 안전하게 비활성화되어 있습니다.&quot; &quot;snmpd 미동작&quot;
fi
FINISH &quot;[ U-58 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;SNMP 미사용 시 서비스 차단 절차&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop snmpd
systemctl disable snmpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;프로세스 완전 중지 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;ps -ef | grep snmpd | grep -v grep&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 관제/관측 가능성(Observability) 도구(예: Datadog, Zabbix, PRTG 등)에서 SNMP를 통해 CPU/Memory/Disk 메트릭을 수집하던 서버에서 사전 협의 없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;snmpd를 비활성화하여 대규모 모니터링 임계치 알람 장애가 발생한 경우가 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 방법&lt;/span&gt;: 조치 전 NMS 담당 부서에 타겟 서버의 SNMP 수집 여부를 질의하거나,&lt;span&gt;&amp;nbsp;&lt;/span&gt;netstat -nap | grep 161&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 통해 UDP 161 포트로 수신 패킷이 인바운드되는지 먼저 트래픽을 관찰하십시오.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 그룹 스크립트 한계점 및 예외 처리 종합 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;1) 진단 스크립트의 기술적 한계점 분석&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;분할 설정 디렉터리(*.d/*.conf) 미인식&lt;/span&gt;:&lt;br /&gt;최신 OS 패키지(예: RHEL 9, Ubuntu 24.04 등)의 vsftpd 또는 snmpd 설정은 단일 conf 파일이 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/vsftpd/conf.d/*.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리에 분할 설정 방식을 채택하는 경우가 늘어났습니다. 현 스크립트는 주 설정 파일만 점검하므로 오진이 일어날 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Systemd Socket Activation 인식 미흡&lt;/span&gt;:&lt;br /&gt;vsftpd가 독립 데몬이 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;vsftpd.socket&lt;span&gt;&amp;nbsp;&lt;/span&gt;형태로 동작할 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;ps -ef&lt;span&gt;&amp;nbsp;&lt;/span&gt;조건절을 회피하여 실제 서비스가 동작 중임에도 미동작(OK)으로 잘못 판정할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;TCP Wrapper 폐지에 따른 U-56 오탐&lt;/span&gt;:&lt;br /&gt;RHEL 8+ 시스템에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/hosts.deny가 제거되었으므로, 해당 파일만 체크할 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;firewalld나&lt;span&gt;&amp;nbsp;&lt;/span&gt;nftables로 안전하게 통제되어 있어도 취약(WARN)으로 판정될 위험이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2) 개선을 위한 스니펫 코드 (Snippet)&lt;/h3&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;autoit&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫] socket 상태 및 include 분할 설정 디렉터리까지 통합 진단하는 로직
IS_FTP_ACTIVE=&quot;FALSE&quot;
if ps -ef | grep -E &quot;vsftpd|proftpd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null || \
   systemctl is-active --quiet vsftpd 2&amp;gt;/dev/null || \
   systemctl is-active --quiet vsftpd.socket 2&amp;gt;/dev/null; then
    IS_FTP_ACTIVE=&quot;TRUE&quot;
fi

# [개선 스니펫] Include 디렉터리 포함 주석 제거 설정값 추출 함수
check_ftp_param() {
    local param=&quot;$1&quot;
    grep -r -E -i &quot;^[[:space:]]*${param}&quot; /etc/vsftpd/ 2&amp;gt;/dev/null | grep -v &quot;#&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #서버보안 #정보보안 #FTP보안 #SNMP보안 #vsftpd #취약점점검 #보안가이드 #인프라보안 #시스템보안 #U54 #U55 #U56 #U57 #U58</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/131</guid>
      <comments>https://ismsp-case.tistory.com/131#entry131comment</comments>
      <pubDate>Fri, 18 Sep 2026 09:33:52 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검] 서비스 관리 보안 (U-49 ~ U-53) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/128</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;zzz.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cflqwa/dJMcajp4hr1/l72kuQbbtO6gkPDUzVSqx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cflqwa/dJMcajp4hr1/l72kuQbbtO6gkPDUzVSqx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cflqwa/dJMcajp4hr1/l72kuQbbtO6gkPDUzVSqx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcflqwa%2FdJMcajp4hr1%2Fl72kuQbbtO6gkPDUzVSqx0%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;1672&quot; height=&quot;941&quot; data-filename=&quot;zzz.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본 가이드는 리눅스 서버 환경의 주요 서비스 관리 분야 중 DNS 설정 통제, 고위험 네트워크 데몬 비활성화 및 정보 노출 차단을 다루는 U-49부터 U-53까지의 진단 항목을 분석합니다. 자동 진단 스크립트의 작동 원리와 더불어 현장에서 발생할 수 있는 장애를 방지하는 안전한 조치 및 백업 절차를 상세히 안내해 드립니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 서비스 관리 (U-49 ~ U-53) 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-49&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;DNS 보안 버전 패치&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;BIND 실행 파일 (named)&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;DNS 서비스를 미운영하거나, BIND 최신 보안 패치버전을 적용한 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-50&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;DNS Zone Transfer 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/named.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;Zone Transfer(영역 전송)를 허용하지 않거나 지정된 Master/Slave 서버 IP로만 제한한 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-51&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;DNS 취약한 동적 업데이트 금지&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/named.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;Zone 파일에 대한 동적 업데이트(allow-update)를 허용하지 않거나 비활성화한 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-52&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;Telnet 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/xinetd.d/telnet,&lt;span&gt;&amp;nbsp;&lt;/span&gt;telnet.socket&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;Telnet 서비스(데몬 및 소켓)가 비활성화되어 있고 SSH 서비스를 사용하는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-53&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;FTP 서비스 정보 노출 제한&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/vsftpd/vsftpd.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/proftpd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;FTP 접속 시 출력되는 배너에 OS 및 서비스 버전 정보가 숨김 처리된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;하&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-49] DNS 보안 버전 패치&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DNS(BIND) 서비스는 도메인 이름을 IP 주소로 변환하는 핵심 인프라 서비스입니다. BIND의 구형 버전에는 원격 코드 실행(RCE), 서비스 거부(DoS), DNS 캐시 포이즈닝 등 치명적인 취약점이 지속적으로 발견됩니다. 따라서 운영 중인 BIND 버전을 최신으로 유지하여 공격에 악용되는 것을 방지해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [ U-49 ] DNS 보안 버전 패치 점검 시작
CODE &quot;[ U-49 ] DNS 보안 버전 패치&quot;

# DNS 서비스(named 또는 bind)가 실제 프로세스/systemd 상에서 구동 중인지 검사
DNS_RUNNING=&quot;FALSE&quot;
if systemctl is-active --quiet named 2&amp;gt;/dev/null || ps -ef | grep -E &quot;named|bind&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    DNS_RUNNING=&quot;TRUE&quot;
fi

# DNS 구동 상태에 따른 버전 추출 및 수동 점검 유도
if [[ &quot;$DNS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    # named -v 명령을 통해 설치된 BIND 버전을 추출
    BIND_VER=$(named -v 2&amp;gt;/dev/null | head -n 1)
    INFO &quot;DNS(BIND) 서비스가 동작 중입니다. BIND 버전에 대한 최신 보안 패치 적용 여부를 수동으로 점검하십시오.&quot; &quot;현재 실행 중인 버전: [ ${BIND_VER:-버전 확인 불가} ]&quot;
else
    # 미구동 시 취약점 노출 위험이 없으므로 양호 처리
    OK &quot;DNS 서비스(named)가 동작하지 않아 버전 취약점 위험이 없습니다 (N/A).&quot; &quot;DNS 데몬 미운영&quot;
fi
FINISH &quot;[ U-49 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: BIND 패치 시 패키지 업데이트 과정에서 기존 설정 파일(/etc/named.conf)이 오버라이드되거나, Chroot 환경(/var/named/chroot) 내부의 권한 구조가 변경되어 패치 후 DNS 서비스가 정상 구동되지 않는 장애가 빈번히 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 패치 전후에 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;named -v&lt;span&gt;&amp;nbsp;&lt;/span&gt;버전 확인과 함께,&lt;span&gt;&amp;nbsp;&lt;/span&gt;dig @localhost version.bind chaos txt&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 수행하여 내부/외부에서 BIND 버전이 그대로 노출되고 있는지 테스트해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 조언&lt;/span&gt;: BIND 버전 노출 자체를 막기 위해 패치와 함께&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/named.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;내&lt;span&gt;&amp;nbsp;&lt;/span&gt;options&lt;span&gt;&amp;nbsp;&lt;/span&gt;블록에&lt;span&gt;&amp;nbsp;&lt;/span&gt;version &quot;Unknown&quot;;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구문을 추가하여 버전 그래빙 공격을 무력화하는 방어 전략을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 및 Zone 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -rp /etc/named.conf /etc/named.conf.bak_$(date +%Y%m%d)
cp -rp /var/named /var/named_bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;패키지 업데이트 수행 (RHEL/Rocky 기준)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;dnf update bind -y&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 문법 검사&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;named-checkconf /etc/named.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 리로드 및 상태 확인&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl reload named
systemctl status named&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-50] DNS Zone Transfer 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Zone Transfer(영역 전송)는 Master DNS 서버와 Slave DNS 서버 간의 데이터 동기화를 위해 사용됩니다. 이 설정이 모든 대상(any)에 허용되어 있으면 인가되지 않은 제3자가&lt;span&gt;&amp;nbsp;&lt;/span&gt;AXFR&lt;span&gt;&amp;nbsp;&lt;/span&gt;요청을 보내 해당 도메인의 모든 서브도메인, IP 주소, 내부 시스템 정보 목록을 탈취할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [ U-50 ] DNS Zone Transfer 설정 점검 시작
CODE &quot;[ U-50 ] DNS Zone Transfer 설정&quot;

if [[ &quot;$DNS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    if [ -f /etc/named.conf ]; then
        # allow-transfer 구문 내 any 키워드 존재 여부 확인 (취약)
        if grep -i &quot;allow-transfer&quot; /etc/named.conf | grep -i -q &quot;any&quot;; then
            WARN &quot;DNS 서비스의 Zone Transfer(영역 전송)가 모든 IP(any)에 허용되어 있습니다.&quot; &quot;named.conf 의 allow-transfer { any; } 설정은 존 파일 유출 위험&quot;
        # allow-transfer 지시어가 명시되어 있는 경우 (양호)
        elif grep -i -q &quot;allow-transfer&quot; /etc/named.conf; then
            OK &quot;DNS 서비스에 Zone Transfer(영역 전송) 제한이 명시적으로 설정되어 있습니다.&quot; &quot;named.conf 의 allow-transfer 에 특정 IP 통제 적용됨&quot;
        # 지시어 자체가 누락된 경우 (BIND 기본값 허용 위험 가능성 대응)
        else
            WARN &quot;DNS 설정에 Zone Transfer(allow-transfer) 옵션이 명시되어 있지 않습니다. (기본값 허용 위험)&quot; &quot;named.conf 내 allow-transfer 구문 누락&quot;
        fi
    else
        INFO &quot;DNS 서비스가 동작 중이나 설정 파일(/etc/named.conf)을 찾을 수 없습니다.&quot; &quot;파일 경로 확인 필요&quot;
    fi
else
    OK &quot;DNS 서비스(named)가 동작하지 않으므로 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 서비스 미사용&quot;
fi
FINISH &quot;[ U-50 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: Slave DNS 서버가 구동 중인 환경에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;allow-transfer { none; };&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정을 전역으로 적용하여 Master-Slave 간 영역 전송이 차단되는 장애가 발생합니다. 이로 인해 Secondary DNS의 레코드가 갱신되지 않아 서비스 불능 상태가 됩니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 외부 및 내부 검증 PC에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;dig @&amp;lt;대상서버IP&amp;gt; &amp;lt;도메인명&amp;gt; AXFR&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 실행해 봅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Transfer failed.&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;REFUSED&lt;span&gt;&amp;nbsp;&lt;/span&gt;응답이 출력되어야 정상입니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 조언&lt;/span&gt;: Slave 서버가 없는 1대 운영 환경이라면 전역&lt;span&gt;&amp;nbsp;&lt;/span&gt;options&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목에&lt;span&gt;&amp;nbsp;&lt;/span&gt;allow-transfer { none; };를 설정하고, Slave 서버가 존재한다면 지정된 Slave IP만 콤마/세미콜론으로 구분하여 인가하십시오.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/named.conf /etc/named.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 수정 (/etc/named.conf)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dts&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;options {
    allow-transfer { none; }; // Slave DNS 미운영 시
    // 또는 allow-transfer { 192.168.1.10; }; // Slave DNS IP 지정
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;구문 검증 및 리로드&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;named-checkconf /etc/named.conf
systemctl reload named&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-51] DNS 서비스의 취약한 동적 업데이트 설정 금지&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DNS 동적 업데이트(Dynamic Update)는 IP 주소가 변경될 때 DNS 레코드를 자동으로 갱신하는 기능입니다. 인증되지 않은 사용자가 동적 업데이트를 수행할 수 있도록 설정(allow-update { any; };)되어 있으면 공격자가 타깃 도메인의 A 레코드를 자신의 악성 서버 IP로 위변조(DNS Spoofing)할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [ U-51 ] DNS 동적 업데이트 설정 점검 시작
CODE &quot;[ U-51 ] DNS 서비스의 취약한 동적 업데이트 설정 금지&quot;

if [[ &quot;$DNS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    if [ -f /etc/named.conf ]; then
        # allow-update 항목에 any 설정이 되어 있는지 검사
        if grep -i &quot;allow-update&quot; /etc/named.conf | grep -i -q &quot;any&quot;; then
            WARN &quot;DNS 레코드를 누구나 동적으로 업데이트할 수 있도록 허용(any)되어 취약합니다.&quot; &quot;named.conf 의 allow-update { any; } 설정 발견&quot;
        # 특정 IP나 none 설정 확인
        elif grep -i -q &quot;allow-update&quot; /etc/named.conf; then
            OK &quot;DNS 동적 업데이트(allow-update)가 특정 내부 IP나 none으로 안전하게 제한되어 있습니다.&quot; &quot;allow-update 구문에 통제 적용됨&quot;
        # BIND 최신 기본값(거부) 준수 상태
        else
            OK &quot;DNS 설정에 동적 업데이트(allow-update) 구문이 명시되어 있지 않습니다. (최신 BIND 기본값: 거부)&quot; &quot;기본적으로 동적 업데이트 제한됨&quot;
        fi
    else
        INFO &quot;DNS 설정 파일(/etc/named.conf)을 찾을 수 없습니다.&quot; &quot;수동 확인 요망&quot;
    fi
else
    OK &quot;DNS 서비스(named)가 동작하지 않으므로 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 서비스 미사용&quot;
fi
FINISH &quot;[ U-51 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: DHCP 서버와 연동하여 IP를 동적으로 할당받는 내부 통신 환경에서 TSIG(Transaction Signature) 키 인증 없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;allow-update { none; };으로 일괄 통제할 경우, 내부 시스템들의 hostname 레코드 등록이 차단되어 내부 서비스 연결 실패가 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;nsupdate&lt;span&gt;&amp;nbsp;&lt;/span&gt;도구를 통해 인가되지 않은 클라이언트에서 임의의 레코드 추가/수정 요청을 전송해 봅니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;update failed: REFUSED&lt;span&gt;&amp;nbsp;&lt;/span&gt;메시지가 반환되어야 안전합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 조언&lt;/span&gt;: 동적 업데이트가 반드시 필요한 환경이라면 단순 IP 통제가 아닌 TSIG 키 기반 인증 구문(allow-update { key &quot;dhcp-key&quot;; };)을 적용해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/named.conf /etc/named.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 수정 (/etc/named.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는 각 zone 블록)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;zone &quot;example.com&quot; IN {
    type master;
    file &quot;example.zone&quot;;
    allow-update { none; };
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;구문 검증 및 서비스 리로드&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;named-checkconf /etc/named.conf
systemctl reload named&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-52] Telnet 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Telnet은 서버에 원격 접속하기 위한 전통적인 프로토콜이지만, ID/Password를 포함한 모든 통신 데이터가 암호화되지 않은 평문(Plaintext)으로 전송됩니다. 스니핑(Sniffing) 공격에 매우 취약하므로 즉시 비활성화하고 암호화 채널인 SSH(Secure Shell)를 사용해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [ U-52 ] Telnet 서비스 비활성화 점검 시작
CODE &quot;[ U-52 ] Telnet 서비스 비활성화&quot;

TELNET_RUNNING=&quot;FALSE&quot;
REASON_TELNET=&quot;&quot;

# 1. systemd 환경에서 Telnet 데몬 및 소켓 구동 여부 검사
if systemctl is-active --quiet telnet.socket 2&amp;gt;/dev/null || systemctl is-active --quiet telnet 2&amp;gt;/dev/null; then
    TELNET_RUNNING=&quot;TRUE&quot;
    REASON_TELNET=&quot;systemctl에서 telnet 데몬/소켓 활성화 확인됨.&quot;
fi

# 2. xinetd/inetd 슈퍼데몬 환경 내 설정 파일 점검
if [ -f /etc/xinetd.d/telnet ]; then
    if grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; /etc/xinetd.d/telnet; then
        TELNET_RUNNING=&quot;TRUE&quot;
        REASON_TELNET=&quot;xinetd 환경에서 telnet 서비스가 활성화(disable=no)되어 있음.&quot;
    fi
elif [ -f /etc/inetd.conf ]; then
    if grep -E -i &quot;^[[:space:]]*telnet&quot; /etc/inetd.conf &amp;gt;/dev/null; then
        TELNET_RUNNING=&quot;TRUE&quot;
        REASON_TELNET=&quot;inetd.conf 파일에 telnet 서비스가 주석 해제되어 있음.&quot;
    fi
fi

# 최종 판단 및 출력
if [[ &quot;$TELNET_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    WARN &quot;평문 전송으로 패스워드 스니핑에 매우 취약한 Telnet 서비스가 활성화되어 있습니다.&quot; &quot;$REASON_TELNET&quot;
else
    OK &quot;보안상 취약한 Telnet 서비스가 안전하게 비활성화(SSH 권장)되어 있습니다.&quot; &quot;telnet 데몬 및 소켓 미동작&quot;
fi
FINISH &quot;[ U-52 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: SSH 서비스가 정상 동작하는지 검증하지 않은 상태에서 Telnet 데몬을 즉시 종료하여, 서버에 연결된 모든 관리자 세션이 끊기고 원격 접속이 불가능해지는 대형 장애(Lockout)가 발생하는 경우가 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: Telnet 비활성화 작업 전, 별도의 터미널 창을 열어 SSH 접속이 정상적으로 이루어지는지, sudo 권한 행사가 가능한지 먼저 검증해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 조언&lt;/span&gt;: 구형 레거시 시스템이나 백업 장비 통신용으로 Telnet 사용이 불가피한 경우, 관리용 별도 OAM(Operations, Administration, Maintenance) 망으로 네트워크를 격리하고 방화벽 IP 필터링을 철저히 적용하십시오.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;SSH 서비스 정상 동작 사전 확인&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl status sshd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Telnet 서비스 중지 및 비활성화 (systemd 기준)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop telnet.socket 2&amp;gt;/dev/null
systemctl disable telnet.socket 2&amp;gt;/dev/null
systemctl mask telnet.socket 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;xinetd 환경 조치 시 (/etc/xinetd.d/telnet)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;inform7&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# disable = yes 로 변경 후 xinetd 재시작
sed -i 's/disable[[:space:]]*=[[:space:]]*no/disable = yes/g' /etc/xinetd.d/telnet
systemctl restart xinetd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-53] FTP 서비스 정보 노출 제한&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FTP 서비스 접속 시 초기 배너(Banner)에 OS 명칭, BIND/FTP 데몬의 상세 버전 정보가 노출되는 경우, 공격자는 특정 버전에 존재하는 알려진 취약점(Exploit)을 타깃팅하여 공격을 시도할 수 있습니다. 따라서 배너 정보를 마스킹하여 시스템 내부 정보를 숨겨야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [ U-53 ] FTP 서비스 정보 노출 제한 점검 시작
CODE &quot;[ U-53 ] FTP 서비스 정보 노출 제한&quot;

FTP_RUNNING=&quot;FALSE&quot;

# FTP 프로세스 실행 여부 확인
if ps -ef | grep -E &quot;vsftpd|proftpd|in.ftpd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null || systemctl is-active --quiet vsftpd 2&amp;gt;/dev/null; then
    FTP_RUNNING=&quot;TRUE&quot;
fi

if [[ &quot;$FTP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    BANNER_SAFE=&quot;FALSE&quot;
    REASON_BANNER=&quot;&quot;

    # 1. vsftpd 배너 은닉 설정 점검 (ftpd_banner 또는 banner_file 사용 여부)
    if [ -f /etc/vsftpd/vsftpd.conf ]; then
        if grep -E -i -q &quot;^[[:space:]]*ftpd_banner=&quot; /etc/vsftpd/vsftpd.conf || grep -E -i -q &quot;^[[:space:]]*banner_file=&quot; /etc/vsftpd/vsftpd.conf; then
            BANNER_SAFE=&quot;TRUE&quot;
            REASON_BANNER=&quot;vsftpd.conf 에 ftpd_banner 또는 banner_file을 이용한 메시지 마스킹 설정이 확인됨.&quot;
        else
            REASON_BANNER=&quot;vsftpd.conf 에 기본 접속 메시지(버전 정보 등) 숨김 설정이 누락됨.&quot;
        fi
    # 2. proftpd 배너 점검 (ServerIdent off 설정 여부)
    elif [ -f /etc/proftpd/proftpd.conf ] || [ -f /etc/proftpd.conf ]; then
        CONF_FILE=$(ls /etc/proftpd/proftpd.conf /etc/proftpd.conf 2&amp;gt;/dev/null | head -1)
        if grep -E -i -q &quot;^[[:space:]]*ServerIdent[[:space:]]+off&quot; &quot;$CONF_FILE&quot;; then
            BANNER_SAFE=&quot;TRUE&quot;
            REASON_BANNER=&quot;proftpd.conf 에 ServerIdent off 설정이 확인됨.&quot;
        else
            REASON_BANNER=&quot;proftpd.conf 에 ServerIdent off 설정이 누락되어 버전 정보가 노출될 수 있음.&quot;
        fi
    else
        REASON_BANNER=&quot;FTP 동작 중이나 설정 파일(/etc/vsftpd/vsftpd.conf 등)을 찾을 수 없습니다.&quot;
    fi

    # 최종 결과 판정
    if [[ &quot;$BANNER_SAFE&quot; == &quot;TRUE&quot; ]]; then
        OK &quot;FTP 접속 시 불필요한 OS 및 버전 정보(Banner)가 노출되지 않도록 설정되어 있습니다.&quot; &quot;$REASON_BANNER&quot;
    else
        WARN &quot;FTP 접속 배너(Banner)를 통해 서버 및 버전 정보가 노출될 위험이 있습니다.&quot; &quot;$REASON_BANNER&quot;
    fi
else
    OK &quot;FTP 서비스가 구동되지 않으므로 배너 정보 노출 위험이 없습니다 (N/A).&quot; &quot;FTP 프로세스 미동작&quot;
fi
FINISH &quot;[ U-53 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 배너 파일(banner_file) 지시어 지정 시 설정한 텍스트 파일의 경로가 존재하지 않거나, 읽기 권한이 없는 경우 FTP 서비스 데몬이 리스타트 시 구동에 실패하는 장애가 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 조치 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;nc &amp;lt;서버IP&amp;gt; 21&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;ftp &amp;lt;서버IP&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 통해 접속 초기 응답 메시지에&lt;span&gt;&amp;nbsp;&lt;/span&gt;vsFTPd 3.0.3과 같은 상세 버전 문자열이 사라지고 지정한 경고문만 출력되는지 테스트합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 조언&lt;/span&gt;: 단순 배너 숨김 외에, 업무상 불가피하게 FTP를 사용하는 환경이라면 SSL/TLS를 결합한 FTPS로 전환하거나 SSH 기반 SFTP 사용을 강제하는 것이 바람직합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;vsftpd 설정 변경 (/etc/vsftpd/vsftpd.conf)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 기본 버전을 노출하지 않는 사용자 지정 문구 적용
ftpd_banner=Authorized uses only. All activity may be monitored and reported.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 재시작 및 상태 확인&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl restart vsftpd
systemctl status vsftpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 그룹 스크립트 한계점 및 예외 처리 종합 제안&lt;/h2&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제시된 자동 진단 스크립트는 진단의 신속성을 제공하지만, 최신 Linux OS 환경의 복잡한 설정 구조를 일부 반영하지 못하는 한계가 존재합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;1. 스크립트 한계점 정밀 분석&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Include 분할 설정 디렉터리 미인식&lt;/span&gt;: 최신 BIND 및 FTP 데몬은 설정 효율화를 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/named.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;내부에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;include &quot;/etc/named.rfc1912.zones&quot;;&lt;span&gt;&amp;nbsp;&lt;/span&gt;형태로 분할 설정을 로드하거나, Ubuntu/Debian 계열에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/bind/named.conf.options를 활용합니다. 기존 스크립트는 단일 주요 파일만 단순 검사하므로 오진이 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;주석 처리 구문 미검증&lt;/span&gt;: 설정 파일 내부의&lt;span&gt;&amp;nbsp;&lt;/span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;//&lt;span&gt;&amp;nbsp;&lt;/span&gt;처리된 주석 문장에&lt;span&gt;&amp;nbsp;&lt;/span&gt;allow-transfer { any; };&lt;span&gt;&amp;nbsp;&lt;/span&gt;구문이 남아있는 경우, 단순&lt;span&gt;&amp;nbsp;&lt;/span&gt;grep&lt;span&gt;&amp;nbsp;&lt;/span&gt;검색 로직은 이를 실제 활성화된 설정으로 인식하여 취약으로 잘못 판정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2. 스크립트 보완 및 개선 코드 스니펫&lt;/h3&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;주석 라인을 완벽히 제거하고 Include 디렉터리까지 통합 스캔할 수 있도록 개선된 진단 로직 스니펫을 제시합니다.&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;perl&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫] BIND Include 파일 포함 및 주석 처리 제거 정밀 검사
CONF_FILES=$(grep -E -v '^[[:space:]]*//|^[[:space:]]*#' /etc/named.conf 2&amp;gt;/dev/null | grep &quot;include&quot; | awk -F'&quot;' '{print $2}')
ALL_CONFS=&quot;/etc/named.conf $CONF_FILES&quot;

# 주석이 제거된 유효 설정 내에서 allow-transfer any 설정 검색
VULN_TRANSFER=&quot;FALSE&quot;
for cfile in $ALL_CONFS; do
    if [ -f &quot;$cfile&quot; ]; then
        if grep -E -v '^[[:space:]]*//|^[[:space:]]*#' &quot;$cfile&quot; | grep -i &quot;allow-transfer&quot; | grep -i -q &quot;any&quot;; then
            VULN_TRANSFER=&quot;TRUE&quot;
            break
        fi
    fi
done

if [[ &quot;$VULN_TRANSFER&quot; == &quot;TRUE&quot; ]]; then
    WARN &quot;Zone Transfer 설정이 모든 대역(any)에 허용되어 있습니다.&quot; &quot;주석 제외 실제 설정에서 any 확인됨&quot;
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#U-49 #U-50 #U-51 #U-52 #U-53 #리눅스보안점검 #DNS보안패치 #영역전송제한 #동적업데이트금지 #텔넷비활성화 #FTP배너차단 #주요정보통신기반시설 #서버보안가이드 #보안실무조치</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/128</guid>
      <comments>https://ismsp-case.tistory.com/128#entry128comment</comments>
      <pubDate>Thu, 17 Sep 2026 10:39:27 +0900</pubDate>
    </item>
    <item>
      <title>클라우드 전환 중 DR을 미뤄도 될까?</title>
      <link>https://ismsp-case.tistory.com/126</link>
      <description>&lt;h1&gt;클라우드 전환 중 DR을 미뤄도 될까?&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;mdash; ISMS-P 2.12.1 재해&amp;middot;재난 대비 안전조치와 오브젝트 스토리지 보호&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 본 글은 ISMS-P 인증기준을 이해하기 위한 가상의 심사 시나리오다. 기업명, 담당자, 시스템명, 문서번호, 수치 및 설정값은 교육 목적으로 구성했으며 실제 기업의 심사 결과나 특정 기관의 인증 사례가 아니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 시스템을 온프레미스에서 클라우드로 이전하는 과정에서는 기존 시스템과 신규 클라우드 환경이 일정 기간 함께 운영되는 경우가 많다.&lt;/p&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;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 기존 데이터베이스에는 이미 DR 체계가 구성되어 있지만, 클라우드로 새롭게 이전한 오브젝트 스토리지에는 아직 백업이나 복제 구성이 적용되지 않은 상황을 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;담당 부서는 다음과 같이 설명할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;전체 클라우드 전환이 끝나면 통합 DR 정책을 적용할 예정입니다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 마이그레이션이 진행 중이라는 이유만으로 현재 운영 중인 스토리지를 DR 대상에서 제외해도 될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 가상의 전자상거래 기업을 대상으로 &lt;b&gt;ISMS-P 2.12.1 재해&amp;middot;재난 대비 안전조치&lt;/b&gt; 관점에서 이 문제를 살펴본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 특정 AWS 기능을 설치했는지가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 시스템이 장애나 재해 발생 시 어느 정도의 복구가 필요한 자산인지 식별하고, 그에 맞는 복구 목표와 보호대책을 실제 운영환경에 적용하고 있는지&lt;/b&gt;가 핵심이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 기업 개요 및 가상 운영 시나리오&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기업명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 패션 쇼핑몰&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영 규모&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원 약 350만 명&lt;/li&gt;
&lt;li&gt;일일 주문 약 2만 건&lt;/li&gt;
&lt;li&gt;전자상거래 플랫폼 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인프라 환경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;온프레미스 IDC&lt;/li&gt;
&lt;li&gt;AWS 퍼블릭 클라우드&lt;/li&gt;
&lt;li&gt;온프레미스와 클라우드가 혼재된 과도기적 구조&lt;/li&gt;
&lt;li&gt;핵심 결제 및 상품 데이터베이스의 클라우드 이전 진행 중&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 담당자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프라클라우드팀 김민수 과장&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 마이그레이션 과정에서 발생한 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 기존 온프레미스 IDC에 집중되어 있던 시스템을 AWS 환경으로 이전하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 전체 시스템을 한 번에 이전하는 것은 어려웠기 때문에 다음과 같은 과도기적 구조가 만들어졌다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[기존 온프레미스 IDC]
        │
        ├─ 기존 핵심 DB
        │    └─ 기존 DR 체계 유지
        │
        └─ 레거시 시스템
             
             &amp;darr; 마이그레이션

[AWS 클라우드]
        │
        ├─ 신규 DB
        │    └─ 리전 간 복제
        │
        ├─ 상품 이미지 저장소
        │    └─ 단일 리전 / 단일 버킷
        │
        └─ 고객 첨부파일 저장소
             └─ 단일 리전 / 단일 버킷
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 새롭게 구축된 오브젝트 스토리지 영역이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 핵심 데이터베이스에는 DR 체계가 적용되어 있었지만, 상품 이미지와 고객 첨부파일을 저장하는 오브젝트 스토리지는 마이그레이션 기간 동안 DR 및 원격 백업 대상에서 제외되었고, 담당 부서는 전체 클라우드 전환이 완료되면 통합 DR 정책을 적용할 계획이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과 해당 기간 동안 신규 데이터가 저장되고 있음에도 별도의 원격 백업이나 복제 없이 단일 리전의 저장소만 운영되고 있었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. 현장 인터뷰&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심사에서는 먼저 실제 운영 관행을 확인하였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[인터뷰 - 재해복구 구성 현황]&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;심사원&lt;/b&gt;&lt;/p&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 데이터베이스는 리전 간 복제를 구성하여 기존 IDC와 유사한 수준의 재해복구 체계를 유지하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 상품 이미지와 사용자 리뷰 첨부파일 등이 저장되는 오브젝트 스토리지는 마이그레이션 작업의 복잡성을 줄이기 위해 현재 단일 리전 단일 저장소 형태로 운영하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;심사원&lt;/b&gt;&lt;/p&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 시스템 이관이 완료되는 다음 달 최종 안정화 단계에서 정식 백업 및 DR 동기화 작업을 등록할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 전환 검증과 배포 안정화에 리소스를 집중하고 있어 해당 스토리지에 대해서는 별도의 주기적인 백업이나 미러링을 적용하지 않고 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 현장 수집 증적&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;증적 1. 백업 및 동기화 스케줄 설정&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;apiVersion: batch/v1
kind: CronJob
metadata:
  name: storage-backup-job
  namespace: e-commerce-prod
spec:
  schedule: &quot;0 2 * * *&quot;
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sync-tool
            image: amazon/aws-cli:2.11.0
            command:
              - &quot;aws&quot;
              - &quot;s3&quot;
              - &quot;sync&quot;
              - &quot;s3://a-store-legacy-backup/images/&quot;
              - &quot;s3://a-store-dr-backup/images/&quot;
            # 신규 클라우드 버킷은 이관 완료 시까지 동기화 대상에서 제외
          restartPolicy: OnFailure
&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;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이는 심사에서 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &quot;백업 기능이 없다&quot;고 판단하기보다는 &lt;b&gt;백업 대상 범위가 실제 운영자산을 포함하고 있는지&lt;/b&gt;를 확인해야 하기 때문이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 증적 2. 인프라 전환 회의록&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프라 전환 추진단의 회의록에서는 다음과 같은 내용이 확인되었다.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;[문서번호: INFRA-202X-0892]

기안 제목:
클라우드 전환 기간 중 인프라 자원 관리 범위 한정 승인의 건

1. 추진 배경
- 퍼블릭 클라우드로의 대규모 시스템 이관에 따른 운영 복잡도 증가
- 전환 작업 기간 중 장애 요인 최소화를 위한 관리 대상 자원 선별

2. 주요 결정 사항

가. 핵심 데이터베이스
    기존 재해복구 체계 유지

나. 오브젝트 스토리지 및 파일 서버
    시스템 이관 및 데이터 무결성 검증 완료 시점까지
    이중화 및 원격 백업 대상에서 일시 제외

다. 적용 기간
    클라우드 전면 오픈 시점까지 한시적 유예

3. 특이사항

- 마이그레이션 기간 중 신규 적재되는 미디어 파일은
  단일 리전에 보관
- 전체 전환 완료 후 통합 백업 정책 적용 예정
&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;조직의 의사결정에 따라 의도적으로 DR 및 백업 범위에서 제외되었다&lt;/b&gt;는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 심사에서는 단순 설정 오류보다 한 단계 더 확인할 필요가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. ISMS-P 2.12.1 관점에서 확인할 핵심&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P 2.12.1 재해&amp;middot;재난 대비 안전조치는 자연재해, 통신&amp;middot;전력 장애, 해킹 등 핵심 서비스와 시스템의 운영 연속성을 위협할 수 있는 재해 유형을 식별하고, 예상 피해와 영향을 분석한 후 복구 목표와 복구 전략 및 대책 등을 마련하도록 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 심사에서 중요한 질문은 다음과 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;첫 번째 질문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 스토리지가 장애 또는 재해 발생 시 서비스 운영에 어떤 영향을 미치는가?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두 번째 질문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 데이터의 복구 목표시간(RTO)과 복구 목표시점(RPO)이 정의되어 있는가?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;세 번째 질문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 운영환경에서 정의된 복구 목표를 달성할 수 있는 백업&amp;middot;복제&amp;middot;복구 체계가 존재하는가?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네 번째 질문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션이라는 예외 상황에 대해 위험을 평가하고 별도의 대응책을 마련했는가?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. 이번 사례에서 확인되는 핵심 문제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례의 핵심 문제를 단순히 다음과 같이 표현하면 부족하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;S3 버킷에 DR이 없으므로 결함이다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 정확한 접근은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;운영 중인 오브젝트 스토리지가 서비스 연속성에 미치는 영향을 고려한 재해복구 필요성이 존재함에도, 마이그레이션 기간이라는 사유로 해당 영역을 DR 및 백업 대상에서 제외하고 이를 보완하기 위한 별도의 복구대책도 마련하지 않은 상태&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&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;AWS S3의 특정 기능을 사용하지 않았다는 사실 자체가 아니라 재해 발생 가능성과 영향을 고려한 복구체계가 해당 운영영역에 적용되지 않았다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 결함보고서&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[결함 1] 클라우드 전환 기간 중 오브젝트 스토리지의 재해복구 대책 미적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;관련 기준&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;ISMS-P 2.12.1 재해&amp;middot;재난 대비 안전조치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;대상&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;상품 이미지 및 고객 첨부파일 오브젝트 스토리지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;운영환경&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;AWS 단일 리전&amp;middot;단일 버킷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;확인내용&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;마이그레이션 기간 동안 원격 백업 및 복제 대상에서 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;확인근거&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;담당자 인터뷰, 백업 CronJob 설정, 인프라 전환 회의록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;주요 문제&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;운영 중인 스토리지에 대한 재해복구 전략 및 보호대책이 적용되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;잠재 영향&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;리전 장애 또는 저장소 장애 발생 시 데이터 복구 및 서비스 연속성에 영향을 줄 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영현황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 온프레미스 IDC에서 AWS 클라우드 환경으로 시스템을 이전하고 있으며, 상품 이미지 및 고객 첨부파일을 저장하는 오브젝트 스토리지를 운영하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 데이터베이스에는 기존 DR 체계가 적용되어 있으나, 해당 오브젝트 스토리지는 마이그레이션 기간 동안 백업 및 이중화 대상에서 제외되어 단일 리전&amp;middot;단일 버킷 형태로 운영되고 있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;확인된 사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;담당자 인터뷰를 통해 전체 클라우드 전환 완료 이후 통합 DR 체계를 적용할 예정임을 확인하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 백업 CronJob 설정 및 인프라 전환 회의록을 통해 신규 클라우드 스토리지가 백업 및 동기화 대상에서 제외되어 있음을 확인하였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;판단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 스토리지가 서비스 운영에 미치는 영향과 복구 필요성을 분석하고 그에 따른 RTO&amp;middot;RPO 및 복구대책을 수립해야 함에도, 마이그레이션 기간이라는 사유만으로 별도의 보호대책 없이 운영하고 있어 재해 발생 시 데이터 및 서비스 복구에 영향을 미칠 가능성이 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 왜 '마이그레이션 중'이라는 이유만으로 통제를 유예하기 어려운가&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션 기간에는 시스템 변경이 많고 운영 복잡도가 증가한다.&lt;/p&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;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 구조라면 판단이 달라질 수 있다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;마이그레이션
    &amp;darr;
위험 분석
    &amp;darr;
서비스 영향 분석
    &amp;darr;
RTO / RPO 정의
    &amp;darr;
임시 보호대책 결정
    &amp;darr;
백업 / 복제 / 스냅샷 / 복구절차 적용
    &amp;darr;
정기적인 복구 가능성 확인
    &amp;darr;
최종 DR 체계로 전환
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 다음과 같은 구조라면 통제 공백이 발생할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;마이그레이션
    &amp;darr;
&quot;전환 완료 후 적용 예정&quot;
    &amp;darr;
현재 보호대책 없음
    &amp;darr;
재해 발생
    &amp;darr;
복구 수단 부족
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 마이그레이션 기간이라는 사실 자체가 면제 사유가 되는 것은 아니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. 단일 리전&amp;middot;단일 버킷의 위험을 어떻게 볼 것인가&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 리전으로 운영한다고 해서 그 자체만으로 ISMS-P 결함이라고 단정해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 해당 시스템의 &lt;b&gt;업무 중요도와 복구 요구사항&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 상품 이미지가 일시적으로 없어져도 서비스에 미치는 영향이 제한적이라면 필요한 복구 수준은 달라질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 고객 첨부파일이 주문&amp;middot;고객지원 등의 핵심 업무와 연결되어 있고 장기간 복구할 수 없다면 요구되는 보호수준은 높아질 수 있다.&lt;/p&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;해당 데이터가 어떤 업무에 사용되는가&lt;/li&gt;
&lt;li&gt;서비스 중단 시 업무 영향은 어느 정도인가&lt;/li&gt;
&lt;li&gt;데이터 손실 허용 범위는 어느 정도인가&lt;/li&gt;
&lt;li&gt;RTO가 정의되어 있는가&lt;/li&gt;
&lt;li&gt;RPO가 정의되어 있는가&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. AWS S3 환경에서 백업과 복제를 구분해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서는 &quot;복제했다&quot;는 사실만으로 백업이 완료되었다고 판단해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 S3 Cross-Region Replication(CRR)은 서로 다른 AWS 리전의 버킷으로 객체를 복제하는 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3의 라이브 복제는 객체가 생성 또는 변경될 때 대상 버킷으로 비동기 복제를 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 CRR은 &lt;b&gt;재해 발생 시 다른 리전에 데이터를 확보하는 방법 중 하나&lt;/b&gt;로 사용할 수 있지만, 조직이 요구하는 RPO와 복구전략에 적합한지 별도로 판단해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 복제 설정 이전에 이미 존재했던 객체는 자동으로 소급 복제되지 않으므로 기존 데이터에 대해서는 별도의 복제 또는 배치 복제가 필요할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. 복제 상태도 확인해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복제를 구성했다고 해서 심사가 끝나는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 객체의 복제 상태를 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3는 객체 복제 상태를 PENDING, COMPLETED, FAILED 등의 상태로 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 증적을 확보할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Source Bucket
      │
      │ Object 생성
      &amp;darr;
Replication
      │
      ├── PENDING
      │
      ├── COMPLETED
      │
      └── FAILED
              &amp;darr;
        원인 확인 및 조치
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서는 객체의 replication status를 콘솔, CLI, SDK 또는 S3 Inventory 등을 이용하여 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &quot;CRR 설정 화면이 존재한다&quot;보다 다음과 같은 증적이 더 유용하다.&lt;/p&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;Source Bucket&lt;/li&gt;
&lt;li&gt;Destination Bucket&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;li&gt;복제 장애 조치 이력&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. CRR과 정기 백업을 함께 사용하는 이유&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재해복구와 백업은 목적이 완전히 동일하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;                  ┌─────────────────────┐
                  │   Production S3     │
                  │     Source Bucket   │
                  └─────────┬───────────┘
                            │
                  ┌─────────┴─────────┐
                  │                   │
                  ▼                   ▼
          Cross-Region Replication   Backup
                  │                   │
                  ▼                   ▼
          다른 Region Bucket      별도 Backup Storage
                                      │
                                      ▼
                              장기 보관 / 격리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRR은 다른 리전에 데이터를 복제하여 리전 장애 등에 대비하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 백업은 별도의 보존정책과 복구 시점을 확보하기 위한 목적을 가질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 삭제나 데이터 훼손과 같은 상황까지 고려한다면 단순한 복제 외에 버전 관리, 백업 보존정책, 별도 계정 또는 저장소 분리, 불변성 확보 등의 추가적인 보호수단을 검토할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 역시 S3 데이터 보호를 위해 Versioning, Replication, Object Lock, AWS Backup 등의 기능을 제공한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 기술적 조치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서는 다음과 같은 방향으로 보호체계를 보완하는 것으로 구성할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 대상 버킷 식별&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션으로 신규 생성된 모든 운영 버킷을 식별한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 업무 중요도 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 버킷에 저장되는 데이터와 업무 영향을 분석한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ RTO/RPO 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무 영향에 따라 필요한 복구시간과 데이터 손실 허용범위를 정의한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 복제 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 경우 다른 AWS 리전으로 S3 복제를 구성한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 백업 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복제와 별도로 조직의 백업정책에 따라 정기 백업을 구성한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑥ 복구 테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 데이터를 대상으로 복구 가능 여부를 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 백업 스케줄 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 백업 시스템을 활용한다면 다음과 같은 형태로 신규 버킷을 백업 대상에 포함할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;apiVersion: batch/v1
kind: CronJob
metadata:
  name: storage-backup-job
  namespace: e-commerce-prod
spec:
  schedule: &quot;0 2 * * *&quot;
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sync-tool
            image: amazon/aws-cli:2.11.0
            command:
              - &quot;aws&quot;
              - &quot;s3&quot;
              - &quot;sync&quot;
              - &quot;s3://a-store-cloud-prod/images/&quot;
              - &quot;s3://a-store-dr-backup/images/&quot;
          restartPolicy: OnFailure
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이 설정만으로 &quot;DR이 완성되었다&quot;고 판단해서는 안 된다.&lt;/p&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;CronJob 실행 여부&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;li&gt;백업 저장소 접근권한&lt;/li&gt;
&lt;li&gt;백업본 훼손&amp;middot;삭제 방지&lt;/li&gt;
&lt;li&gt;실제 복구 가능 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 복구 테스트가 중요한 이유&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 시스템은 데이터를 복사하는 것보다 &lt;b&gt;실제로 복구할 수 있는지가 더 중요하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 정기적인 복구 테스트를 수행하는 것이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 테스트 시나리오를 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;① 테스트 대상 데이터 선정
        &amp;darr;
② 백업본 확인
        &amp;darr;
③ 별도 테스트 환경으로 복구
        &amp;darr;
④ 파일 수 / 용량 / 주요 데이터 비교
        &amp;darr;
⑤ 애플리케이션 접근 테스트
        &amp;darr;
⑥ 복구 소요시간 측정
        &amp;darr;
⑦ RTO / RPO 충족 여부 확인
        &amp;darr;
⑧ 결과 및 개선사항 기록
&lt;/code&gt;&lt;/pre&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;복구 테스트 계획&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;li&gt;데이터 정합성 확인 결과&lt;/li&gt;
&lt;li&gt;오류 및 조치내역&lt;/li&gt;
&lt;li&gt;담당자 승인 또는 결과보고서&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. 원인 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례의 직접적인 원인은 &lt;b&gt;마이그레이션 기간 동안 오브젝트 스토리지의 백업 및 DR 적용을 유예한 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 근본원인은 기술 설정 하나로 끝나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분분석&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;직접 원인&lt;/td&gt;
&lt;td&gt;신규 오브젝트 스토리지가 백업&amp;middot;복제 대상에서 제외됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영 원인&lt;/td&gt;
&lt;td&gt;마이그레이션 기간 동안 기존 DR 정책의 적용 범위를 축소함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리 원인&lt;/td&gt;
&lt;td&gt;마이그레이션에 따른 변경사항과 DR 요구사항을 연계하여 재평가하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;통제 원인&lt;/td&gt;
&lt;td&gt;신규 클라우드 자원이 생성될 때 DR 적용 여부를 확인하는 절차가 부족함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;재발 가능성&lt;/td&gt;
&lt;td&gt;향후 추가되는 클라우드 스토리지에서도 동일한 누락이 발생할 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 단순히 현재 버킷에 백업 기능을 추가하는 것만으로는 재발방지 효과가 제한적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;19. 재발 방지 방안&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;19.1 클라우드 자원 생성 단계에서 DR 여부 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 버킷이나 저장소를 생성할 때 다음 정보를 함께 관리한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Resource
 ├─ Service
 ├─ Owner
 ├─ Data Classification
 ├─ Business Criticality
 ├─ RTO
 ├─ RPO
 ├─ Backup Policy
 ├─ Replication Policy
 └─ Recovery Test Schedule
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;19.2 IaC와 보안통제 연계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Terraform, CloudFormation 등의 IaC를 사용하는 환경이라면 인프라 배포 과정에서 필요한 보호설정을 함께 검증할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 운영용 버킷 생성 시 다음 항목을 자동으로 점검할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[Bucket 생성]
      &amp;darr;
[Environment = PROD]
      &amp;darr;
[Criticality 확인]
      &amp;darr;
[Backup Policy 존재?]
      │
      ├─ YES &amp;rarr; 배포
      │
      └─ NO  &amp;rarr; 예외승인 또는 배포 차단
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 방식은 사람이 운영 중인 모든 클라우드 자원을 별도로 기억해야 하는 문제를 줄일 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 마이그레이션 예외관리도 통제 대상이다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 모든 시스템에 동일한 보호수준을 즉시 적용하기 어려운 상황이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 예외관리 절차를 마련할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 210px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;관리내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;예외 대상&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;특정 버킷 또는 시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;예외 사유&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;마이그레이션 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;위험&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;데이터 손실 및 서비스 영향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;보완대책&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;임시 백업 또는 스냅샷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;예외 시작일&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;YYYY-MM-DD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;예외 종료일&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;YYYY-MM-DD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;승인자&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;담당 책임자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;재검토일&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;YYYY-MM-DD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;종료 조건&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;정식 DR 정책 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 &lt;b&gt;&quot;마이그레이션이 끝나면 적용한다&quot;는 계획만 기록하는 것이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 발생할 수 있는 위험을 평가하고, 그 기간 동안 필요한 임시 보호대책과 예외 종료조건까지 관리해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;21. 현장 심사에서 확인할 질문&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DR 범위&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 정보시스템 중 DR 대상은 어떻게 결정하는가?&lt;/li&gt;
&lt;li&gt;클라우드 신규 자원도 DR 대상에 포함되는가?&lt;/li&gt;
&lt;li&gt;마이그레이션 중인 시스템의 DR 범위는 어떻게 결정했는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RTO/RPO&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 시스템의 RTO는 얼마인가?&lt;/li&gt;
&lt;li&gt;RPO는 얼마인가?&lt;/li&gt;
&lt;li&gt;해당 목표를 어떤 근거로 결정했는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;백업&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신규 S3 버킷은 백업 대상에 포함되어 있는가?&lt;/li&gt;
&lt;li&gt;백업 주기는 어떻게 결정했는가?&lt;/li&gt;
&lt;li&gt;백업본은 원본과 동일한 장애영역에 존재하지 않는가?&lt;/li&gt;
&lt;li&gt;백업 실패 여부를 어떻게 확인하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;복제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRR 또는 다른 복제 방식이 적용되어 있는가?&lt;/li&gt;
&lt;li&gt;어떤 데이터를 복제하는가?&lt;/li&gt;
&lt;li&gt;복제 실패를 어떻게 탐지하는가?&lt;/li&gt;
&lt;li&gt;실제 객체의 복제 상태를 확인할 수 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;복구&lt;/h3&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;실제 복구에 걸린 시간은 얼마인가?&lt;/li&gt;
&lt;li&gt;정의된 RTO를 충족했는가?&lt;/li&gt;
&lt;li&gt;복구 테스트 결과 개선사항은 무엇인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;22. 자주 발생하는 잘못된 판단&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 1&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;클라우드 이전이 끝나면 DR을 적용할 예정이므로 문제가 없다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개선된 판단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;향후 계획만으로 현재 운영 중인 시스템의 재해복구 위험이 해소되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 운영기간 동안 발생할 수 있는 위험과 이를 보완할 대책을 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 2&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;S3는 AWS에서 관리하므로 별도의 DR이 필요하지 않다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개선된 판단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 사업자가 제공하는 서비스의 내구성과 조직이 요구하는 업무 복구 목표는 별개의 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조직의 RTO/RPO와 서비스 영향도를 기준으로 필요한 보호수준을 판단해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 3&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;CRR을 설정했으니 백업은 끝났다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개선된 판단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복제와 백업은 목적과 보호범위가 다를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRR을 사용하더라도 복제 대상, 복제 상태, 보존정책, 복구절차 등을 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 판단 4&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;백업 CronJob이 존재하므로 백업이 정상이다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개선된 판단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정파일의 존재와 실제 백업 성공은 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 로그, 대상 범위, 백업본 존재 여부, 실패 여부, 복구 테스트까지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;23. 실무 점검 체크리스트&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;재해복구 계획&lt;/h3&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;업무 영향 분석을 수행했는가&lt;/li&gt;
&lt;li&gt;시스템별 중요도를 정의했는가&lt;/li&gt;
&lt;li&gt;RTO를 정의했는가&lt;/li&gt;
&lt;li&gt;RPO를 정의했는가&lt;/li&gt;
&lt;li&gt;복구전략을 수립했는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클라우드 환경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신규 클라우드 자원이 DR 범위에서 누락되지 않았는가&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;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;백업&lt;/h3&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;백업 실패를 탐지하는가&lt;/li&gt;
&lt;li&gt;백업본의 보존기간을 관리하는가&lt;/li&gt;
&lt;li&gt;원본과 백업본의 장애영역을 분리했는가&lt;/li&gt;
&lt;li&gt;필요한 경우 백업본의 삭제&amp;middot;변조 방지수단을 적용했는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;복구&lt;/h3&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;정기적인 복구 테스트를 수행하는가&lt;/li&gt;
&lt;li&gt;복구 소요시간을 측정하는가&lt;/li&gt;
&lt;li&gt;RTO/RPO 충족 여부를 확인하는가&lt;/li&gt;
&lt;li&gt;테스트 결과에 따른 개선조치를 수행하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변경관리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마이그레이션 대상 시스템의 DR 영향을 검토했는가&lt;/li&gt;
&lt;li&gt;신규 클라우드 자원 추가 시 DR 여부를 검토하는가&lt;/li&gt;
&lt;li&gt;예외사항에 대한 승인 절차가 있는가&lt;/li&gt;
&lt;li&gt;예외 종료일과 재검토일을 관리하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;24. 이번 사례에서 가장 중요한 포인트&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례를 단순하게 정리하면 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;마이그레이션 중이라서 DR을 적용하지 않았다&quot;는 사실 자체보다, 마이그레이션이라는 변경 상황에서 해당 스토리지의 업무 영향과 복구 요구사항을 재평가하고 현재 운영기간에 필요한 보호대책을 마련했는지가 핵심이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 심사에서는 다음과 같은 순서로 접근하는 것이 효과적이다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;운영자산 식별
      &amp;darr;
업무 영향 분석
      &amp;darr;
재해 유형 및 영향 분석
      &amp;darr;
RTO / RPO 정의
      &amp;darr;
DR / Backup 전략 수립
      &amp;darr;
실제 구성 확인
      &amp;darr;
모니터링 확인
      &amp;darr;
복구 테스트
      &amp;darr;
결과 및 개선조치 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;25. 마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 마이그레이션은 기존 인프라를 그대로 클라우드로 옮기는 단순한 작업이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 구조와 데이터 흐름, 운영 책임, 백업 범위, 재해복구 전략까지 함께 변경되는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 마이그레이션 기간에는 신규 자원이 계속 생성되기 때문에 기존 DR 관리체계의 범위에서 누락되는 자원이 발생하기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 중요한 것은 특정 AWS 기능을 사용했는지가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;운영 중인 시스템의 중요도와 업무 영향을 분석하고, 그 결과에 따라 필요한 복구 목표와 보호대책을 실제 환경에 적용하고 있는지&lt;/b&gt;가 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 기술적으로도 CRR을 구성하는 것만으로 모든 백업 요구사항이 해결되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복제 범위와 복제 상태를 확인하고, 필요한 경우 별도의 백업과 보존정책을 구성하며, 최종적으로 실제 복구 테스트를 통해 RTO와 RPO가 달성되는지 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 클라우드 환경에서의 재해복구 통제는 다음 한 문장으로 정리할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;나중에 DR을 적용할 계획이 있는가&quot;가 아니라, &quot;지금 운영 중인 시스템에 발생할 수 있는 재해를 어떻게 분석하고 현재 시점에서 어떻게 복구할 수 있도록 준비했는가&quot;를 확인해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISMS-P 인증기준 2.12.1 재해&amp;middot;재난 대비 안전조치&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;ndash; Replicating objects within and across Regions&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;ndash; Getting replication status information&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;ndash; Requirements and considerations for replication&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;ndash; Resilience in Amazon S3&lt;/li&gt;
&lt;li&gt;AWS Amazon S3 &amp;ndash; Data protection in Amazon S3&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>#ISMS_P #인증심사 #KISA #재해복구 #2.12.1 #보안결함 #AWS #오브젝트스토리지 #보안담당자 #보안설정</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/126</guid>
      <comments>https://ismsp-case.tistory.com/126#entry126comment</comments>
      <pubDate>Thu, 17 Sep 2026 10:34:32 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검] 서비스 관리 보안 (U-44 ~ U-48) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/125</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wer.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPTS03/dJMcaaUh0aN/BQCF67q100MTfX2XDJYWIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPTS03/dJMcaaUh0aN/BQCF67q100MTfX2XDJYWIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPTS03/dJMcaaUh0aN/BQCF67q100MTfX2XDJYWIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPTS03%2FdJMcaaUh0aN%2FBQCF67q100MTfX2XDJYWIk%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;1672&quot; height=&quot;941&quot; data-filename=&quot;wer.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;서비스 관리 및 메일 서버 보안 영역에 해당하는 U-44부터 U-48까지의 주요 보안 취약점 항목 진단 가이드를 안내해 드립니다. 본 포스팅에서는 자동 진단 스크립트의 작동 원리를 심층 분석하고, 메일 서버 및 불필요한 레거시 서비스 운용 중 발생할 수 있는 장애를 예방하기 위한 안전한 조치 및 백업 절차를 현장 실무 관점에서 안내드립니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 서비스 관리 및 메일 서버 보안 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.1163%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 27.3256%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 38.3721%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 7.32558%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-44&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.1163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;tftp, talk 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 27.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/xinetd.d/tftp,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/inetd.conf, systemd 서비스&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 38.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;tftp, talk, ntalk 서비스가 비활성화되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 7.32558%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-45&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.1163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;메일 서비스 버전 점검&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 27.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;Sendmail, Postfix 실행 파일 및 패키지&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 38.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;메일 서비스(Sendmail/Postfix)가 미구동이거나 최신 보안 패치가 적용된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 7.32558%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-46&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.1163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;일반 사용자의 메일 서비스 실행 방지&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 27.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/mail/sendmail.cf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/postfix/main.cf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 38.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;Sendmail에 restrictqrun 옵션이 적용되어 있거나 Postfix를 사용하는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 7.32558%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-47&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.1163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;스팸 메일 릴레이 제한&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 27.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/mail/access,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/postfix/main.cf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 38.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;SMTP 서비스 미구동 또는 메일 릴레이 제한 설정이 적용되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 7.32558%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.74419%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-48&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 20.1163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;expn, vrfy 명령어 제한&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 27.3256%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/mail/sendmail.cf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/postfix/main.cf&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 38.3721%;&quot; data-streamdown=&quot;table-cell&quot;&gt;SMTP 서비스 미구동 또는 expn, vrfy 명령어가 차단되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 7.32558%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-44] tftp, talk 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;TFTP(Trivial File Transfer Protocol)는 별도의 인증 절차 없이 UDP 69번 포트를 통해 파일을 전송하는 인시큐어 프로토콜이며, Talk 및 NTalk은 평문 기반의 대화형 통신 서비스입니다. 이러한 레거시 데몬이 활성화되어 있을 경우 공격자는 시스템 내부 파일에 무단 접근하거나 세션 정보를 도청할 수 있으므로, 해당 서비스를 완전히 비활성화하는 것을 목적으로 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] 취약한 구형 서비스 목록을 저장할 변수 초기화 및 검사 대상 서비스 정의
WEAK_LEGACY_SVCS=&quot;&quot;
TARGET_SVCS=&quot;tftp talk ntalk&quot;

# [상세 해설] 1. xinetd 환경 점검: /etc/xinetd.d 디렉터리 존재 여부 확인 후 disable = no 설정 검색
if [ -d /etc/xinetd.d ]; then
    for svc in $TARGET_SVCS; do
        # grep을 통해 disable 설정이 no로 지정되어 활성화된 상태인지 검사
        if grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; &quot;/etc/xinetd.d/$svc&quot; 2&amp;gt;/dev/null; then
            WEAK_LEGACY_SVCS=&quot;$WEAK_LEGACY_SVCS $svc&quot;
        fi
    done
# [상세 해설] inetd 환경 점검: /etc/inetd.conf 파일 내 주석(#)이 없는 서비스 행 존재 여부 확인
elif [ -f /etc/inetd.conf ]; then
    for svc in $TARGET_SVCS; do
        if grep -E -i &quot;^[[:space:]]*$svc&quot; /etc/inetd.conf &amp;gt;/dev/null; then
            WEAK_LEGACY_SVCS=&quot;$WEAK_LEGACY_SVCS $svc&quot;
        fi
    done
fi

# [상세 해설] 2. modern systemd 환경 점검: systemctl 명령으로 서비스 및 소켓의 활성화(is-active) 상태 체크
for svc in $TARGET_SVCS; do
    if systemctl is-active --quiet &quot;$svc&quot; 2&amp;gt;/dev/null || systemctl is-active --quiet &quot;${svc}.socket&quot; 2&amp;gt;/dev/null; then
        WEAK_LEGACY_SVCS=&quot;$WEAK_LEGACY_SVCS $svc&quot;
    fi
done

# [상세 해설] 중복 추출된 서비스명을 정렬 및 단일화 처리
WEAK_LEGACY_SVCS=$(echo &quot;$WEAK_LEGACY_SVCS&quot; | xargs -n1 | sort -u | xargs)

# [상세 해설] 활성화된 취약 서비스 존재 여부에 따른 양호/취약 판정 출력
if [ -n &quot;$WEAK_LEGACY_SVCS&quot; ]; then
    WARN &quot;보안 인증 과정이 없는 구형 서비스(tftp, talk 등)가 활성화되어 있습니다.&quot; &quot;활성 서비스: [ $WEAK_LEGACY_SVCS ]&quot;
else
    OK &quot;취약한 구형 서비스(tftp, talk, ntalk)가 안전하게 차단되어 있습니다.&quot; &quot;해당 프로세스 및 포트 미동작&quot;
fi
FINISH &quot;[ U-44 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 네트워크 장비(Cisco, Juniper 등)의 펌웨어 백업/복구나 PXE 부팅 서버 환경에서는 TFTP 서비스가 필수적으로 사용됩니다. 실무 현장에서 업무 연관성을 고려하지 않고 TFTP 데몬을 일괄 차단할 경우, 네트워크 장비 설정 자동화 파이프라인이나 OS 자동 설치 인프라가 마비되는 장애가 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 및 대체 방안&lt;/span&gt;: 차단 전&lt;span&gt;&amp;nbsp;&lt;/span&gt;ss -ulpn | grep :69&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 통해 실제 수신 중인 네트워크 연결을 확인해야 합니다. 만약 TFTP 서비스가 반드시 필요하다면 전용 폐쇄망 IP 대역으로만 접근을 제한(방화벽 정책)하거나, SSH 기반의 SFTP/SCP 환경으로 전환하는 것을 적극 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;xinetd/systemd 서비스 중지 및 자동 시작 비활성화&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# systemd 환경 조치
systemctl stop tftp tftp.socket talk ntalk 2&amp;gt;/dev/null
systemctl disable tftp tftp.socket talk ntalk 2&amp;gt;/dev/null

# xinetd 환경 조치 (설정 파일 존재 시)
if [ -f /etc/xinetd.d/tftp ]; then
    cp -p /etc/xinetd.d/tftp /etc/xinetd.d/tftp.bak_$(date +%Y%m%d)
    sed -i 's/disable[[:space:]]*=[[:space:]]*no/disable = yes/g' /etc/xinetd.d/tftp
    systemctl reload xinetd 2&amp;gt;/dev/null || service xinetd reload 2&amp;gt;/dev/null
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-45] 메일 서비스 버전 점검&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Sendmail 및 Postfix 등 메일 전송 데몬(MTA)의 구버전 소프트웨어에는 버퍼 오버플로우, 원격 코드 실행(RCE) 등 심각한 보안 취약점이 존재할 수 있습니다. 최신 안정 버전 패치 적용 여부를 주기적으로 점검하여 외부 악의적 공격으로부터 시스템을 보호해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] 메일 서비스 동작 상태 확인 변수 선언
MAIL_RUNNING=&quot;FALSE&quot;

# [상세 해설] ss, netstat 명령어로 25번(SMTP) 포트 수신 여부 검사 및 systemctl/ps로 프로세스 구동 확인
if ss -nlt 2&amp;gt;/dev/null | grep -qE &quot;:25\b&quot; || netstat -nlt 2&amp;gt;/dev/null | grep -qE &quot;:25\b&quot;; then
    MAIL_RUNNING=&quot;TRUE&quot;
elif systemctl is-active --quiet sendmail 2&amp;gt;/dev/null || systemctl is-active --quiet postfix 2&amp;gt;/dev/null; then
    MAIL_RUNNING=&quot;TRUE&quot;
elif ps -ef | grep -E &quot;sendmail|postfix&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    MAIL_RUNNING=&quot;TRUE&quot;
fi

# [상세 해설] 메일 서비스 구동 중일 경우 설치된 Sendmail 및 Postfix의 버전을 추출하여 수동 비교 유도
if [[ &quot;$MAIL_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    # sendmail 디버그 옵션을 통한 버전 추출
    SM_VER=$(sendmail -d0.1 &amp;lt; /dev/null 2&amp;gt;/dev/null | grep -i &quot;Version&quot; | head -n 1)
    # postconf 명령을 통한 Postfix 버전 추출
    PF_VER=$(postconf -d mail_version 2&amp;gt;/dev/null)
    
    INFO &quot;메일 서비스가 동작 중입니다. 최신 보안 패치가 적용된 버전인지 벤더사 권고문과 수동 비교가 필요합니다.&quot; &quot;확인된 버전: Sendmail [ ${SM_VER:-없음} ] / Postfix [ ${PF_VER:-없음} ]&quot;
else
    OK &quot;메일 서비스가 구동되지 않아 점검 대상이 아닙니다.&quot; &quot;서비스 미구동 (N/A)&quot;
fi
FINISH &quot;[ U-45 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;오탐 및 분석 주의사항&lt;/span&gt;: 보안 강화 목적으로 메일 배너 마스킹(smtpd_banner)을 적용한 경우, 외부 스캐너나 일부 진단 스크립트에서 버전 추출에 실패하거나 &quot;없음&quot;으로 오탐할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 스크립트의 실행 버전 추출에만 의존하지 말고, OS 패키지 관리자의 설치 이력을 병행 확인해야 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;RHEL/Rocky 계열:&lt;span&gt;&amp;nbsp;&lt;/span&gt;rpm -qa | grep -E &quot;postfix|sendmail&quot;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;Ubuntu/Debian 계열:&lt;span&gt;&amp;nbsp;&lt;/span&gt;dpkg -l | grep -E &quot;postfix|sendmail&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;1단계: 최신 보안 패치 적용 (OS 패키지 관리자 이용)&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# RHEL/CentOS 계열 업데이트 전 패키지 목록 백업
rpm -qa &amp;gt; /root/pkg_list_$(date +%Y%m%d).txt
dnf update postfix sendmail -y

# Debian/Ubuntu 계열
apt-get update &amp;amp;&amp;amp; apt-get install --only-upgrade postfix sendmail -y&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;2단계: 메일 서비스 재시작 및 동작 검증&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl restart postfix 2&amp;gt;/dev/null || systemctl restart sendmail 2&amp;gt;/dev/null
systemctl status postfix 2&amp;gt;/dev/null || systemctl status sendmail 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-46] 일반 사용자의 메일 서비스 실행 방지&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반 사용자가 SMTP 큐(Queue) 명령어를 강제로 실행하여 서버의 메일 발송 정책을 우회하거나, 대량 메일 발송을 통해 시스템 자원을 고갈시키는 행위를 차단하는 설정입니다. Sendmail 환경에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;restrictqrun&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 명시하여 일반 계정의 메일 큐 강제 처리를 제한해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] 메일 서비스가 동작 중인 환경에서 설정 파일 검사 수행
if [[ &quot;$MAIL_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    # Sendmail 설정 파일 존재 시 PrivacyOptions 내 restrictqrun 옵션 포함 여부 검사
    if [ -f /etc/mail/sendmail.cf ]; then
        if grep -i -q &quot;PrivacyOptions.*restrictqrun&quot; /etc/mail/sendmail.cf; then
            OK &quot;Sendmail 설정에 일반 사용자의 큐(Queue) 실행 방지(restrictqrun)가 적용되어 있습니다.&quot; &quot;sendmail.cf 에 restrictqrun 옵션 존재&quot;
        else
            WARN &quot;Sendmail 설정에 일반 사용자의 임의적인 메일 발송/실행 방지 설정이 누락되어 있습니다.&quot; &quot;sendmail.cf 에 restrictqrun 옵션 누락&quot;
        fi
    # Postfix 환경은 권한 분리 모델(Setgid/postfix 유저)을 사용하므로 구조적으로 양호 처리
    elif [ -f /etc/postfix/main.cf ]; then
        OK &quot;Postfix 메일 서버를 사용 중입니다. (아키텍처 상 일반 계정의 큐 강제 실행이 제한되므로 양호)&quot; &quot;Postfix 자체 권한 분리 모델 적용&quot;
    else
        INFO &quot;동작 중인 메일 서비스의 설정 파일을 찾을 수 없습니다.&quot; &quot;설정 파일 경로 수동 확인 요망&quot;
    fi
else
    OK &quot;메일 서비스가 구동되지 않아 점검 대상이 아닙니다.&quot; &quot;서비스 미구동 (N/A)&quot;
fi
FINISH &quot;[ U-46 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Sendmail 설정 수정 시 치명적 실수&lt;/span&gt;: Sendmail은&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/mail/sendmail.cf&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 직접 수정하는 방식을 권장하지 않습니다. 엔지니어가&lt;span&gt;&amp;nbsp;&lt;/span&gt;sendmail.cf를 수정해 두었더라도, 향후&lt;span&gt;&amp;nbsp;&lt;/span&gt;m4&lt;span&gt;&amp;nbsp;&lt;/span&gt;컴파일러를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;sendmail.mc&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 재빌드할 경우 수정했던 보안 옵션이 백업 없이 덮어씌워져 덮어쓰기 유실 장애가 발생하는 경우가 매우 빈번합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;올바른 설정 조치법&lt;/span&gt;: 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/mail/sendmail.mc&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에 M4 매크로 설정을 추가한 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;.cf&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 재생성해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;1단계: 원본 매크로 및 설정 파일 백업&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/mail/sendmail.mc /etc/mail/sendmail.mc.bak_$(date +%Y%m%d)
cp -p /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;2단계: sendmail.mc 파일 내 PrivacyOptions 수정 및 빌드&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# sendmail.mc 파일에 restrictqrun 지시어가 없는 경우 추가/수정
# define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl

# m4 컴파일 및 서비스 재로드
m4 /etc/mail/sendmail.mc &amp;gt; /etc/mail/sendmail.cf
systemctl reload sendmail&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-47] 스팸 메일 릴레이 제한&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;메일 릴레이(Relay)는 내부 네트워크 외부의 사용자가 메일 서버를 거쳐 또 다른 외부에 메일을 발송할 수 있도록 허용하는 기능입니다. 스팸 메일 릴레이 통제가 적용되지 않은 서버는 차단 목록(RBL, Real-time Blackhole List)에 등록되어 정상적인 업무 메일 발송이 차단되는 심각한 장애를 유발할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] SMTP(25번) 포트 수신 활성화 여부를 ss 또는 netstat으로 재확인
SMTP_ACTIVE=$(ss -nlt 2&amp;gt;/dev/null | grep -E &quot;:25\b&quot;)
if [ -z &quot;$SMTP_ACTIVE&quot; ]; then
    SMTP_ACTIVE=$(netstat -nlt 2&amp;gt;/dev/null | grep -E &quot;:25\b&quot;)
fi

if [ -z &quot;$SMTP_ACTIVE&quot; ]; then
    OK &quot;메일 서비스(SMTP 포트 25)가 비활성화되어 있어 스팸 릴레이 악용 위험이 없습니다.&quot; &quot;서비스 미구동 (N/A)&quot;
else
    # [상세 해설] Postfix 설정 점검: smtpd_recipient_restrictions 내 reject_unauth_destination 필수 포함 여부 확인
    if [ -f /etc/postfix/main.cf ]; then
        RELAY_CHECK=$(grep -v '^#' /etc/postfix/main.cf | grep 'smtpd_recipient_restrictions' | grep 'reject_unauth_destination')
        if [ -n &quot;$RELAY_CHECK&quot; ]; then
            OK &quot;Postfix 메일 릴레이가 안전하게 제한되어 있습니다.&quot; &quot;main.cf 설정 양호&quot;
        else
            WARN &quot;Postfix 메일 릴레이 제한 설정이 누락되어 취약합니다.&quot; &quot;reject_unauth_destination 설정 필요&quot;
        fi
    # [상세 해설] Sendmail 설정 점검: /etc/mail/access 제어 파일 존재 확인
    elif [ -f /etc/mail/access ]; then
        OK &quot;Sendmail 서버가 구동 중이며 access 파일로 릴레이를 통제 중입니다.&quot; &quot;기본 접근제어 파일 존재&quot;
    else
        WARN &quot;메일 서비스가 구동 중이나 설정 파일(postfix/sendmail)을 찾을 수 없습니다.&quot; &quot;수동 확인 요망&quot;
    fi
fi
FINISH &quot;[ U-47 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 착오로 인한 오픈 릴레이 사고&lt;/span&gt;: Postfix&lt;span&gt;&amp;nbsp;&lt;/span&gt;main.cf에&lt;span&gt;&amp;nbsp;&lt;/span&gt;reject_unauth_destination&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 명시했더라도, 상단&lt;span&gt;&amp;nbsp;&lt;/span&gt;mynetworks&lt;span&gt;&amp;nbsp;&lt;/span&gt;변수에&lt;span&gt;&amp;nbsp;&lt;/span&gt;0.0.0.0/0&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는 광범위한 CIDR 대역을 지정한 경우 모든 인터넷 사용자에게 메일 릴레이가 허용되는 치명적인 실수가 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 테스트 명령어&lt;/span&gt;: 외부 사외 망 단말 또는 온라인 Open Relay Checker 툴을 사용하거나 local terminal에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;telnet으로 타사 도메인 발송을 시도하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;554 5.7.1 Relay access denied&lt;span&gt;&amp;nbsp;&lt;/span&gt;응답이 출력되는지 검증해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;1단계: Postfix main.cf 백업 및 문법 검사 조치&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/postfix/main.cf /etc/postfix/main.cf.bak_$(date +%Y%m%d)

# Postfix 릴레이 정책 설정 (main.cf 하단에 추가 또는 수정)
postconf -e &quot;smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination&quot;

# 설정 문법 검사
postfix check&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;2단계: 서비스 리로드&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl reload postfix&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-48] expn, vrfy 명령어 제한&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SMTP 프로토콜의 EXPN(Expand, 메일링 리스트 확장) 및 VRFY(Verify, 사용자 계정 검증) 명령어는 특정 사용자의 존재 여부나 메일 수신 계정의 실제 정보를 반환합니다. 공격자는 이를 이용해 시스템 내 유효한 계정명을 수집(Account Enumeration)할 수 있으므로 해당 명령어를 원천 차단해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] 25번 포트 동작 여부 확인 후 미구동 시 N/A 처리
if [ -z &quot;$SMTP_ACTIVE&quot; ]; then
    OK &quot;메일 서비스(SMTP 포트 25)가 비활성화되어 있어 정보 유출(expn, vrfy) 위험이 없습니다.&quot; &quot;서비스 미구동 (N/A)&quot;
else
    # [상세 해설] Postfix 환경: disable_vrfy_command 설정값이 yes 인지 주석을 제외하고 검사
    if [ -f /etc/postfix/main.cf ]; then
        VRFY_CHECK=$(grep -v '^#' /etc/postfix/main.cf | grep 'disable_vrfy_command' | grep -i 'yes')
        if [ -n &quot;$VRFY_CHECK&quot; ]; then
            OK &quot;Postfix의 vrfy 명령어가 안전하게 차단되어 있습니다.&quot; &quot;disable_vrfy_command = yes 적용됨&quot;
        else
            WARN &quot;Postfix의 vrfy 명령어가 허용되어 있어 사용자 정보 유출 위험이 있습니다.&quot; &quot;disable_vrfy_command 설정 누락&quot;
        fi
    # [상세 해설] Sendmail 환경: PrivacyOptions 내 novrfy 및 noexpn 키워드 포함 여부 검사
    elif [ -f /etc/mail/sendmail.cf ]; then
        PRIVACY_CHECK=$(grep -i 'PrivacyOptions' /etc/mail/sendmail.cf | grep -i 'novrfy' | grep -i 'noexpn')
        if [ -n &quot;$PRIVACY_CHECK&quot; ]; then
            OK &quot;Sendmail의 expn, vrfy 명령어가 안전하게 차단되어 있습니다.&quot; &quot;PrivacyOptions 에 novrfy, noexpn 적용됨&quot;
        else
            WARN &quot;Sendmail의 expn, vrfy 명령어가 허용되어 있습니다.&quot; &quot;PrivacyOptions 수정 필요&quot;
        fi
    else
        WARN &quot;메일 서비스가 구동 중이나 설정 파일(postfix/sendmail)을 찾을 수 없습니다.&quot; &quot;수동 확인 요망&quot;
    fi
fi
FINISH &quot;[ U-48 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;연동 영향도 분석&lt;/span&gt;: RFC 5321 규격상&lt;span&gt;&amp;nbsp;&lt;/span&gt;VRFY,&lt;span&gt;&amp;nbsp;&lt;/span&gt;EXPN&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어 제한은 표준 MTA 간의 일반 메일 송수신에 전혀 영향을 주지 않습니다. 따라서 연동 장애 위험 없이 안전하게 적용할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 절차&lt;/span&gt;: 조치 완료 후 로컬 또는 동일 대역에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;nc&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;telnet을 이용하여 직접 아래와 같이 검증합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;$ telnet localhost 25
220 mail.example.com ESMTP
VRFY root
502 5.5.2 VRFY command disabled&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 및 백업 절차&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;1단계: Postfix 및 Sendmail 설정 백업 및 적용&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# Postfix 환경 조치
if [ -f /etc/postfix/main.cf ]; then
    cp -p /etc/postfix/main.cf /etc/postfix/main.cf.bak_$(date +%Y%m%d)
    postconf -e &quot;disable_vrfy_command = yes&quot;
    postfix check &amp;amp;&amp;amp; systemctl reload postfix
fi

# Sendmail 환경 조치
if [ -f /etc/mail/sendmail.mc ]; then
    cp -p /etc/mail/sendmail.mc /etc/mail/sendmail.mc.bak_$(date +%Y%m%d)
    # sendmail.mc 내 PrivacyOptions 옵션에 novrfy, noexpn 지정 후 re-compile
    sed -i 's/confPRIVACY_FLAGS.*/confPRIVACY_FLAGS`, `authwarnings,novrfy,noexpn,restrictqrun'\''\)dnl/' /etc/mail/sendmail.mc
    m4 /etc/mail/sendmail.mc &amp;gt; /etc/mail/sendmail.cf
    systemctl reload sendmail
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 통합 점검 스크립트의 한계점 및 예외 처리 종합 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;스크립트의 한계점 분석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;분할 설정 디렉터리(include&lt;span&gt;&amp;nbsp;&lt;/span&gt;구문) 미인식 문제&lt;/span&gt;:&lt;br /&gt;최신 Linux 배포판의 Postfix 및 메일 관련 서비스는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/postfix/main.cf&lt;span&gt;&amp;nbsp;&lt;/span&gt;단일 파일이 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/postfix/main.cf.d/*.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리를 통해 설정을 분할 관리하는 경향이 있습니다. 기존 진단 스크립트는 단일 설정 파일만&lt;span&gt;&amp;nbsp;&lt;/span&gt;grep&lt;span&gt;&amp;nbsp;&lt;/span&gt;하므로 실제 분할 파일에 적용된 양호 설정을 오탐(취약으로 판단)할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;다중 행(Multi-line) 설정 파싱 오류&lt;/span&gt;:&lt;br /&gt;Postfix의&lt;span&gt;&amp;nbsp;&lt;/span&gt;smtpd_recipient_restrictions&lt;span&gt;&amp;nbsp;&lt;/span&gt;지시어는 가독성을 위해 들여쓰기를 활용하여 여러 줄로 작성되는 경우가 많습니다. 단일&lt;span&gt;&amp;nbsp;&lt;/span&gt;grep&lt;span&gt;&amp;nbsp;&lt;/span&gt;기반 검출 로직은 첫 번째 줄만 읽어 정밀한 옵션 존재 여부를 누락할 위험이 존재합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;핵심 개선 코드 스니펫 (Code Snippet)&lt;/h3&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Postfix 실행 메모리 내의 최종 유효 설정을 직접 조회하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;postconf&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 스크립트에 도입함으로써, 파일 분할 및 다중 행 작성 구조와 상관없이 100% 정확한 진단 결과를 도출할 수 있습니다.&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫] Postfix의 활성 및 유효 설정을 정밀 검증하는 정교한 로직
if command -v postconf &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;amp; systemctl is-active --quiet postfix; then
    # 1. Disable VRFY 명령어 설정 확인
    PF_VRFY=$(postconf disable_vrfy_command 2&amp;gt;/dev/null | awk '{print $3}')
    
    # 2. 릴레이 제한 옵션 중 reject_unauth_destination 확인
    PF_RELAY=$(postconf smtpd_recipient_restrictions 2&amp;gt;/dev/null)

    if [[ &quot;$PF_VRFY&quot; == &quot;yes&quot; ]] &amp;amp;&amp;amp; echo &quot;$PF_RELAY&quot; | grep -q &quot;reject_unauth_destination&quot;; then
        OK &quot;Postfix 서비스의 보안 설정(VRFY 차단 및 릴레이 제한)이 메인 메모리 구동 설정상 완벽히 적용되어 있습니다.&quot;
    else
        WARN &quot;Postfix 서비스 구동 설정 중 VRFY 차단 또는 릴레이 제한 설정이 누락되어 있습니다.&quot;
    fi
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #주요정보통신기반시설 #보안취약점점검 #서버보안 #메일서버보안 #샌드메일보안 #포스트픽스보안 #스팸릴레이차단 #메일큐제한 #보안가이드</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/125</guid>
      <comments>https://ismsp-case.tistory.com/125#entry125comment</comments>
      <pubDate>Wed, 16 Sep 2026 12:18:33 +0900</pubDate>
    </item>
    <item>
      <title>클라우드 리소스는 모두 정보자산 관리대장에 등록해야 할까?</title>
      <link>https://ismsp-case.tistory.com/122</link>
      <description>&lt;h1&gt;클라우드 리소스는 모두 정보자산 관리대장에 등록해야 할까?&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;mdash; ISMS-P 2.1.3 정보자산 관리 관점에서 보는 클라우드 자산 식별과 책임소재&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가상 시나리오 안내&lt;/b&gt;&lt;br /&gt;이 글은 ISMS-P 정보자산 관리 기준을 이해하기 위한 가상의 사례를 바탕으로 작성했다. 기업명, 담당자, 자산 식별번호, 클라우드 리소스, 데이터 및 증적은 설명을 위해 임의로 구성했다. 실제 기업의 심사 결과나 특정 기업의 결함 사례가 아니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 클라우드 환경에서 정보자산 관리가 어려워지는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 온프레미스 환경에서는 서버를 구매하고 설치한 뒤 자산관리대장에 등록하는 방식으로 정보자산을 관리하는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 클라우드 환경에서는 자산의 생성과 변경 속도가 크게 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 개발자가 IaC(Infrastructure as Code)나 CI/CD 파이프라인을 통해 다음과 같은 리소스를 생성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;EC2
RDS
S3
EBS
Load Balancer
Lambda
EKS
Security Group
CloudFront
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발&amp;middot;테스트 환경에서는 이러한 리소스가 생성되었다가 며칠 또는 몇 시간 만에 삭제되기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때문에 기존의 방식만으로는 클라우드 환경의 변화 속도를 따라가기 어려울 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;자산 도입
   &amp;darr;
자산번호 부여
   &amp;darr;
자산대장 등록
   &amp;darr;
소유자 지정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 여기서 한 가지 질문이 생긴다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클라우드에서 생성되는 모든 리소스를 기존 정보자산 관리대장에 하나씩 등록해야 할까?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문에 단순히 &quot;그렇다&quot;고 답하는 것은 적절하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 &lt;b&gt;조직이 정보자산을 어떤 기준으로 식별하고 관리하도록 정했으며, 실제 클라우드 환경에서도 그 기준이 일관되게 적용되고 있는지&lt;/b&gt;를 확인하는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 가상의 기업 및 운영환경&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기업 개요&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;기업명&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;A사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;서비스&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;프로젝트 관리 솔루션(PMS) SaaS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;개인정보 보유 규모&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;약 45만 건&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;인프라&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;AWS + 온프레미스 하이브리드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;아키텍처&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Kubernetes 기반 MSA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;주요 담당&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;인프라팀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;주요 업무&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;클라우드 인프라 운영 및 자산관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 기존 온프레미스 데이터센터에서 AWS 중심의 클라우드 환경으로 인프라를 단계적으로 이전하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션 과정에서 개발&amp;middot;테스트&amp;middot;운영 환경이 동시에 변경되고 있으며, CI/CD 파이프라인을 통해 클라우드 리소스가 자동으로 생성되고 삭제되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 기존 정보자산 관리 절차가 이러한 변화 속도를 충분히 반영하지 못하고 있다는 점이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. 기존 정보자산 관리 절차&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사의 정보자산 관리 절차는 다음과 같이 운영되고 있다고 가정한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;신규 자산 도입
      &amp;darr;
자산 식별
      &amp;darr;
자산관리대장 등록
      &amp;darr;
중요도 분류
      &amp;darr;
소유자 지정
      &amp;darr;
보호대책 적용
      &amp;darr;
정기적인 현황 갱신
&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;가 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 신규 클라우드 리소스를 생성할 때마다 인프라팀에서 수동으로 자산관리대장을 갱신하도록 운영하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 실제 클라우드 환경에서는 DevOps 파이프라인을 통해 하루에도 여러 개의 리소스가 생성되고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 다음과 같은 차이가 발생하기 시작했다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[관리체계]

자산 생성
   &amp;darr;
인프라팀 전달
   &amp;darr;
자산대장 등록

[실제 클라우드]

Git Commit
   &amp;darr;
CI/CD
   &amp;darr;
Cloud Resource 생성
   &amp;darr;
서비스 배포
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 과정이 서로 연결되어 있지 않은 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. 현장 인터뷰&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심사원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보자산 식별과 자산별 소유자 지정은 어떤 절차로 이루어지고 있습니까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인프라팀 김 과장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당사는 정보자산 관리 지침에 따라 신규 자산을 도입하면 자산 식별번호를 부여하고 자산관리대장에 등록합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 해당 자산을 사용하는 부서를 확인하고 소유자를 지정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정기적으로 자산 현황도 갱신하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심사원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 클라우드 전환으로 자산이 많이 증가했는데, 실제 AWS 환경과 자산관리대장은 어떤 방식으로 비교하고 있습니까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;김 과장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 정기적으로 클라우드 콘솔을 확인하고 주요 운영자산을 대장에 반영하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 개발이나 테스트 과정에서 자동으로 생성되는 임시 리소스까지 모두 수동으로 등록하기에는 현실적으로 어려움이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 리소스는 클라우드 콘솔에서만 확인되고 자산관리대장에는 별도로 등록되지 않는 경우도 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심사원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 자산관리대장에 등록되지 않은 리소스는 중요도가 낮다고 판단할 수 있습니까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;김 과장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 부분을 명확하게 구분하는 기준은 아직 마련되어 있지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 여기서 중요한 것은 '미등록' 자체가 아니다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 인터뷰에서 가장 먼저 확인해야 할 부분은 다음이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자산관리대장에 없는 리소스가 존재한다는 사실만으로 결함을 판단할 수 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 그렇지는 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 리소스를 생각해 볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;개발 테스트용 EC2
임시 EBS
일회성 Lambda
CI/CD 과정에서 생성되는 임시 리소스
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 리소스를 조직의 정보자산 관리 기준상 어떻게 분류하고 관리하는지는 조직의 절차와 자산관리 기준을 함께 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 다음과 같은 자산이라면 이야기가 달라진다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;고객 개인정보 DB
PMS 핵심 서비스 서버
인증 서버
중요 로그 저장소
백업 저장소
보안관제 시스템
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;소유자가 지정되지 않았거나&lt;/li&gt;
&lt;li&gt;중요도가 분류되지 않았거나&lt;/li&gt;
&lt;li&gt;보호대책이 적용되지 않거나&lt;/li&gt;
&lt;li&gt;정기적인 점검 대상에서도 제외된다면&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보자산 관리체계가 실제 운영환경을 제대로 반영하고 있는지 확인할 필요가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 현장 증적 ① &amp;mdash; 클라우드 인벤토리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 가상의 AWS 인벤토리 조회 결과다.&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;[Cloud Inventory]

Resource                         Environment      Owner
-------------------------------------------------------------
PMS-Core-DB                     Production       db-admin
Legacy-Sync-Worker              Migration        dev-team
PMS-Migration-Backup            Migration        infra-team
PMS-Web-01                      Production       service-team
PMS-API-02                      Production       service-team
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 일부 리소스에는 다음과 같은 관리정보가 설정되어 있었다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Environment = Production
Service     = PMS-Core
Owner       = db-admin
AssetID     = UNREGISTERED
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 리소스에서는 다음과 같이 확인되었다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Environment = Migration
Service     = Legacy-Sync
Owner       = dev-team
AssetID     = NONE
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 단순히 AssetID = NONE이라는 결과만 가지고 결함을 확정해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 조직의 자산관리 절차에서 &lt;b&gt;해당 유형의 리소스를 어떤 범위로 관리하도록 정하고 있는지&lt;/b&gt; 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 현장 증적 ② &amp;mdash; 정보자산 관리대장&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상의 정보자산 관리대장은 다음과 같았다.&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;[정보자산 관리대장]

자산번호       자산명              중요도    소유부서
---------------------------------------------------------
AST-001       사내 그룹웨어       상        경영지원팀
AST-002       PMS 인증서버       상        인프라팀
AST-003       고객 DB           최상      개발본부
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리대장의 최종 갱신일은 클라우드 전환이 본격화되기 이전이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 AWS 인벤토리와 관리대장을 비교하자 다음과 같은 문제가 발견되었다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;실제 클라우드 환경
       │
       ├── 중요 운영자산
       ├── 개발/테스트 자산
       ├── 임시 리소스
       └── 백업/저장소
       
       &amp;darr; 비교

정보자산 관리대장
       │
       ├── 기존 온프레미스 자산
       └── 일부 클라우드 자산
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;라는 것이 핵심이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. ISMS-P 2.1.3 정보자산 관리 관점&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P의 정보자산 관리에서는 정보자산의 용도와 중요도에 따른 취급 절차 및 보호대책을 수립&amp;middot;이행하고, 자산별 책임소재를 명확하게 관리하는 것이 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 클라우드 환경에서는 단순히 다음과 같이 접근하는 것보다,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;AWS 리소스가 자산대장에 모두 등록되어 있는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 질문하는 것이 적절하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;조직이 정의한 정보자산 관리 범위에 해당하는 클라우드 자산이 식별되고 있는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;해당 자산의 중요도가 분류되어 있는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;자산별 소유자와 책임소재가 명확한가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;중요 자산에 필요한 보호대책이 적용되고 있는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;클라우드 자산의 생성&amp;middot;변경&amp;middot;삭제가 자산관리 절차에 반영되는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 관점에서 보면 정보자산 관리는 단순한 대장 관리 업무가 아니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 결함으로 판단할 수 있는 핵심 지점&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 보다 설득력 있는 결함 포인트는 다음과 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클라우드 환경에서 생성&amp;middot;변경되는 정보자산을 식별하고 소유자를 지정하는 관리체계가 실제 운영환경과 충분히 연계되지 않고 있었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 고객 개인정보 DB가 실제 운영 중인데도,&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;자산대장 미등록
      +
소유자 미지정
      +
중요도 미분류
      +
보호대책 관리대상 제외
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태라면 단순한 문서 누락으로 보기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 개발 테스트용 임시 리소스가 별도의 기준에 따라 관리되고 있다면 반드시 기존 자산대장에 동일한 방식으로 등록해야 한다고 단정할 필요는 없다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 결함보고서 형태로 정리하면&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[결함] 클라우드 환경의 정보자산 식별 및 책임소재 관리가 실제 운영환경과 일치하지 않음&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관련 기준&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.1.3 정보자산 관리&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영현황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 온프레미스 환경에서 AWS 기반 하이브리드 환경으로 인프라를 전환하고 있으며, CI/CD 및 DevOps 환경을 통해 클라우드 리소스를 생성&amp;middot;변경하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사는 정보자산 관리 절차에 따라 자산별 중요도 및 소유자를 지정하고 자산관리대장을 정기적으로 갱신하고 있으나, 클라우드 리소스의 생성&amp;middot;변경 과정과 기존 자산관리 절차가 직접적으로 연계되어 있지 않다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;확인사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 인벤토리와 정보자산 관리 현황을 비교한 결과, 일부 운영 리소스가 자산관리 체계에서 식별되지 않았으며, 일부 리소스는 소유자 또는 중요도 정보가 명확하게 관리되지 않고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 클라우드 환경의 자산 변동사항을 정기적으로 식별하여 자산관리대장 및 관련 관리정보에 반영하는 기준이 명확하게 운영되고 있지 않았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;판단 포인트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 따라 조직에서 관리 대상으로 정의한 정보자산에 대해 실제 클라우드 환경에서의 자산 식별, 중요도 분류 및 책임소재 지정이 적절하게 이루어지고 있는지 확인이 필요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;근거목록&lt;/h3&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;정보자산 관리대장&lt;/li&gt;
&lt;li&gt;정보자산 관리 절차서&lt;/li&gt;
&lt;li&gt;클라우드 자산 생성&amp;middot;변경 절차&lt;/li&gt;
&lt;li&gt;담당자 인터뷰&lt;/li&gt;
&lt;li&gt;중요 자산별 소유자 지정 현황&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. 원인은 '클라우드가 많아서'가 아니다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 원인을 단순히&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;클라우드 리소스가 너무 많다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 설명하면 개선방향도 단순히 인력을 늘리는 것으로 끝나기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 근본 원인은 다음에 가깝다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;기존 자산관리 절차
       &amp;darr;
수동 등록 중심
       &amp;darr;
클라우드 자동 생성
       &amp;darr;
관리 프로세스와 연결되지 않음
       &amp;darr;
자산 식별 지연
       &amp;darr;
소유자&amp;middot;중요도 관리 지연
       &amp;darr;
보호대책 관리 누락 가능성
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;&lt;b&gt;자산관리 프로세스와 클라우드 자산 생성 프로세스가 분리되어 있다는 것&lt;/b&gt;이 핵심이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. 정보자산 관리에서 가장 중요한 4가지&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경의 정보자산 관리는 다음 네 가지 요소를 연결해서 보는 것이 좋다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;① 식별&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇을 보호해야 하는지 식별한다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;EC2
RDS
S3
EKS
Backup
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 리소스 목록을 확보하는 것에서 끝나지 않고 실제 업무와 데이터 관점에서 중요한 자산을 식별한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;② 중요도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 자산이 조직에 얼마나 중요한지 분류한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;PMS 고객 DB
    &amp;darr;
개인정보 포함
    &amp;darr;
업무 중요도 높음
    &amp;darr;
높은 보호수준 필요
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;③ 책임소재&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 해당 자산을 관리하고 보안상 책임을 가지고 있는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;PMS DB
 ├── 서비스 오너
 ├── 인프라 담당
 └── DB 운영 담당
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 클라우드에서는 &quot;AWS가 운영하니까 AWS가 책임진다&quot;는 식으로 자산 소유자를 대신할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 사업자가 제공하는 인프라와 조직이 운영하는 정보자산의 책임 범위를 구분해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;④ 보호대책&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자산의 중요도에 따라 필요한 보호대책을 적용한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;중요도 상
   &amp;darr;
접근통제
암호화
백업
모니터링
취약점 관리
변경관리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 자산관리의 최종 목적은 대장을 최신 상태로 만드는 것이 아니라 &lt;b&gt;식별된 자산에 필요한 보호대책이 실제로 적용되도록 하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. 개선 방향 ① &amp;mdash; 클라우드 인벤토리를 기준정보로 활용&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동으로 자산대장을 처음부터 작성하는 방식보다 클라우드 인벤토리를 자동으로 수집하는 구조가 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 흐름을 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;AWS Resource Inventory
        &amp;darr;
자산 식별
        &amp;darr;
태그 확인
        &amp;darr;
Owner 확인
        &amp;darr;
Environment 확인
        &amp;darr;
중요도 분류
        &amp;darr;
자산관리 시스템 반영
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS API 또는 CSP의 인벤토리 기능을 이용하면 현재 환경에 존재하는 리소스를 주기적으로 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 &lt;b&gt;클라우드 인벤토리 자체를 정보자산 관리대장과 동일한 것으로 보는 것도 적절하지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 인벤토리는 기술적인 리소스 목록이고, 정보자산 관리는 업무 중요도와 책임소재까지 포함하는 관리체계이기 때문이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. 개선 방향 ② &amp;mdash; 필수 태그 기준을 만든다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 자산에 다음과 같은 최소 관리정보를 부여할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Environment
Service
Owner
DataClass
Criticality
AssetID
ExpirationDate
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 운영 DB라면 다음과 같이 관리할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;Environment = Production
Service     = PMS
Owner       = DB운영팀
DataClass   = PersonalInformation
Criticality = High
AssetID     = AST-2026-021
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 테스트용 임시 리소스라면,&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;Environment = Development
Owner       = DevTeam
Criticality = Low
ExpirationDate = 2026-10-15
&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;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 개선 방향 ③ &amp;mdash; 자산 생성 단계에서 관리정보를 강제한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 효과적인 방법은 리소스 생성 이후에 찾아다니는 것이 아니라 &lt;b&gt;생성 단계에서 관리정보를 요구하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;개발자가 IaC 작성
       &amp;darr;
필수 태그 검증
       &amp;darr;
Owner 확인
       &amp;darr;
Environment 확인
       &amp;darr;
중요도 확인
       &amp;darr;
배포
&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;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 개선 방향 ④ &amp;mdash; 예외 자산을 관리한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서는 모든 리소스를 동일한 기준으로 관리하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 예외를 별도로 관리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스상태예외 사유만료일담당자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Migration-EC2&lt;/td&gt;
&lt;td&gt;임시&lt;/td&gt;
&lt;td&gt;마이그레이션&lt;/td&gt;
&lt;td&gt;2026-10-15&lt;/td&gt;
&lt;td&gt;인프라팀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test-RDS&lt;/td&gt;
&lt;td&gt;테스트&lt;/td&gt;
&lt;td&gt;개발환경&lt;/td&gt;
&lt;td&gt;2026-10-10&lt;/td&gt;
&lt;td&gt;개발팀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup-S3&lt;/td&gt;
&lt;td&gt;운영&lt;/td&gt;
&lt;td&gt;백업 목적&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;인프라팀&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 예외가 존재하지 않도록 만드는 것이 아니라,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예외가 왜 존재하는지, 누가 책임지는지, 언제 종료되는지를 관리하는 것&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 자동 점검 구조&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자산관리 자동화는 다음과 같이 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[Cloud Inventory]
       &amp;darr;
[Resource Collection]
       &amp;darr;
[Tag Validation]
       &amp;darr;
[Owner Validation]
       &amp;darr;
[Criticality Validation]
       &amp;darr;
[Asset Register Comparison]
       &amp;darr;
      ┌──────────────┐
      │              │
     정상           예외
      │              │
      ▼              ▼
   기록/갱신      담당자 알림
                     &amp;darr;
                  조치/예외승인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 &lt;b&gt;미등록 리소스를 발견했다고 바로 차단하거나 삭제하는 것이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 다음을 판단해야 한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;관리대상 자산인가?
      &amp;darr;
예외 자산인가?
      &amp;darr;
임시 자산인가?
      &amp;darr;
실제 서비스에 사용되는가?
      &amp;darr;
누가 소유하는가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 필요한 조치를 수행한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. 자동화 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 개념적인 점검 로직이다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;resources = get_cloud_resources()

for resource in resources:

    if not resource.owner:
        create_exception(
            resource,
            reason=&quot;Owner 미지정&quot;
        )

    elif not resource.environment:
        create_exception(
            resource,
            reason=&quot;Environment 미지정&quot;
        )

    elif resource.environment == &quot;Production&quot;:
        check_asset_register(resource)

    elif resource.environment == &quot;Migration&quot;:
        check_expiration_date(resource)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 운영환경에서는 사용하는 CSP와 자산관리시스템에 맞게 구현해야 한다.&lt;/p&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;이 목적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;19. 개선 후 어떤 증적을 남겨야 할까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보자산 관리 개선에서는 다음과 같은 증적을 확보할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정책&amp;middot;절차&lt;/h3&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;정보자산 분류 기준&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;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술적 증적&lt;/h3&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;Resource Tagging 결과&lt;/li&gt;
&lt;li&gt;자산관리시스템 등록 현황&lt;/li&gt;
&lt;li&gt;태그 검증 결과&lt;/li&gt;
&lt;li&gt;Owner 미지정 탐지 결과&lt;/li&gt;
&lt;li&gt;예외 자산 목록&lt;/li&gt;
&lt;li&gt;자산 변경 이력&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영 증적&lt;/h3&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;신규 자산 등록 기록&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 심사에서 이어서 확인할 질문&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보자산 관리 현황을 확인할 때는 단순히 자산대장만 요청하는 것보다 다음 질문을 함께 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q1. AWS에서 새로운 리소스를 생성하면 자산관리팀은 어떻게 알 수 있는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동 통보인지 자동 연계인지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q2. 모든 클라우드 리소스를 정보자산으로 관리하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조직의 자산관리 기준과 관리범위를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q3. 임시 리소스는 어떻게 관리하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 리소스의 생성 목적과 만료일, 담당자를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q4. 운영 DB의 소유자는 누구인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부서 단위가 아니라 실제 책임소재가 명확한지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q5. 자산의 중요도는 어떤 기준으로 결정하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보, 업무 중요도, 서비스 영향도 등을 고려하는지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q6. 자산이 삭제되면 자산대장에서는 어떻게 처리하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 종료와 자산관리 종료가 연결되는지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q7. 자산관리대장과 실제 클라우드 환경의 차이를 어떻게 탐지하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정기 점검인지 자동화인지 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;21. 이번 사례의 핵심 리스크&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보자산 관리가 제대로 되지 않으면 가장 먼저 발생하는 문제는 &lt;b&gt;보안관리의 사각지대&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 고객 개인정보 DB가 자산관리 대상에서 빠져 있다면 다음과 같은 문제가 연쇄적으로 발생할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;자산 미식별
   &amp;darr;
소유자 불명확
   &amp;darr;
중요도 미분류
   &amp;darr;
보호대책 적용 기준 불명확
   &amp;darr;
취약점 점검 누락 가능
   &amp;darr;
패치 및 변경관리 누락 가능
   &amp;darr;
사고 발생 시 책임소재 및 대응 지연
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 정보자산 관리는 단순한 행정업무가 아니라 다른 보안통제의 출발점이 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;22. 자주 발생하는 판단 오류&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 1. &quot;자산대장에 없으면 무조건 결함이다.&quot;&lt;/h2&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;를 확인하는 것이 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 2. &quot;AWS 리소스는 모두 자산번호를 가져야 한다.&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조직이 어떤 자산 식별체계를 사용하는지 먼저 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 리소스 ARN, 태그, CMDB ID, 서비스 ID 등 여러 식별자를 조합하여 관리할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 식별자가 하나인지 여부가 아니라 &lt;b&gt;자산을 추적할 수 있고 책임소재와 연결되는지&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 3. &quot;실시간으로 자산대장과 AWS가 100% 일치해야 한다.&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서는 리소스가 지속적으로 생성&amp;middot;변경&amp;middot;삭제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 실시간 일치 여부 자체를 요구사항으로 단정하기보다는 조직이 정한 주기와 방법에 따라 &lt;b&gt;자산 변동을 식별하고 관리하는 통제가 실제로 작동하는지&lt;/b&gt;를 확인하는 것이 적절하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 4. &quot;태그만 있으면 자산관리가 끝난다.&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그는 중요한 관리수단이지만 자산관리 자체와 동일하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 정보가 실제 업무와 연결되어야 한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;리소스
 &amp;darr;
서비스
 &amp;darr;
정보자산
 &amp;darr;
중요도
 &amp;darr;
소유자
 &amp;darr;
보호대책
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 5. &quot;클라우드 콘솔에 있으니 관리되고 있다.&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 콘솔에서 리소스를 조회할 수 있다는 것과 조직의 정보자산 관리체계에서 해당 자산을 관리하고 있다는 것은 다른 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 소유자, 중요도, 보호대책, 변경이력 등이 관리되지 않는다면 별도의 관리체계가 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;23. 실무 점검 체크리스트&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;클라우드 환경이 정보자산 관리 범위에 포함되어 있는가?&lt;/li&gt;
&lt;li&gt;AWS 등 클라우드 인벤토리를 정기적으로 확인하는가?&lt;/li&gt;
&lt;li&gt;중요 정보가 저장된 자산을 식별할 수 있는가?&lt;/li&gt;
&lt;li&gt;개발&amp;middot;테스트&amp;middot;운영 자산을 구분하고 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;개인정보 포함 여부를 확인하는가?&lt;/li&gt;
&lt;li&gt;서비스 중요도를 반영하는가?&lt;/li&gt;
&lt;li&gt;중요도에 따라 보호대책이 달라지는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;소유자가 변경될 경우 관리정보가 갱신되는가?&lt;/li&gt;
&lt;li&gt;운영팀&amp;middot;개발팀&amp;middot;보안팀의 역할이 구분되어 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;필수 태그 기준이 존재하는가?&lt;/li&gt;
&lt;li&gt;Owner 태그 또는 이에 준하는 책임정보가 있는가?&lt;/li&gt;
&lt;li&gt;임시 리소스의 만료일을 관리하는가?&lt;/li&gt;
&lt;li&gt;미등록 또는 관리정보 누락 리소스를 탐지하는가?&lt;/li&gt;
&lt;li&gt;예외 리소스를 별도로 관리하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;리소스 삭제 시 자산관리 상태도 종료되는가?&lt;/li&gt;
&lt;li&gt;자산관리대장과 실제 클라우드 환경을 정기적으로 비교하는가?&lt;/li&gt;
&lt;li&gt;불일치 사항에 대한 조치 이력이 남아 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;24. 이 사례에서 얻을 수 있는 핵심 교훈&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서 정보자산 관리의 핵심은 &lt;b&gt;자산관리대장을 최신 상태로 만드는 것 자체가 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 중요한 것은 다음의 연결이다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;클라우드 리소스
      &amp;darr;
정보자산 식별
      &amp;darr;
중요도 분류
      &amp;darr;
소유자 지정
      &amp;darr;
보호대책 적용
      &amp;darr;
변경사항 관리
      &amp;darr;
종료 및 폐기
&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;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;개발자
  &amp;darr;
Git
  &amp;darr;
CI/CD
  &amp;darr;
Cloud Resource
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;클라우드 리소스의 생성&amp;middot;변경 프로세스 자체를 정보자산 관리체계와 연결하는 것&lt;/b&gt;이 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;25. 마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 환경에서는 정보자산의 생성과 변경이 빠르게 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때문에 기존의 수동 자산관리 방식만으로는 실제 환경을 정확하게 파악하기 어려울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이를 단순히&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;자산관리대장에 모든 AWS 리소스를 등록해야 한다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 접근하는 것도 적절하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P 2.1.3 관점에서 보다 중요한 질문은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보호해야 할 정보자산을 식별하고 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자산의 중요도를 적절하게 분류하고 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자산별 책임소재가 명확한가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요도에 따른 보호대책이 적용되고 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클라우드 환경의 생성&amp;middot;변경&amp;middot;삭제가 정보자산 관리체계에 반영되고 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 발견된 문제도 결국 &lt;b&gt;&quot;자산대장의 숫자가 맞지 않는다&quot;&lt;/b&gt;는 문제가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제 클라우드 환경에서 운영되는 정보자산을 조직의 관리체계가 적시에 식별하고, 중요도와 책임소재를 연결하며, 필요한 보호대책을 적용할 수 있는 구조를 갖추고 있는가&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 클라우드 환경의 정보자산 관리는 다음과 같은 구조로 발전시키는 것이 바람직하다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[Cloud Inventory]
       &amp;darr;
[자산 식별]
       &amp;darr;
[중요도 분류]
       &amp;darr;
[소유자 지정]
       &amp;darr;
[보호대책 적용]
       &amp;darr;
[정기 검증]
       &amp;darr;
[변경&amp;middot;종료 관리]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 &lt;b&gt;정보자산 관리의 목적은 자산관리대장을 채우는 것이 아니라, 보호해야 할 자산을 빠뜨리지 않고 책임과 보호대책을 연결하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 줄 정리&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클라우드 정보자산 관리는 모든 리소스를 수동으로 대장에 등록하는 문제가 아니라, 보호가 필요한 정보자산을 식별하고 중요도&amp;middot;소유자&amp;middot;보호대책을 실제 클라우드 환경과 연결하는 관리체계를 만드는 문제다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISMS-P 인증기준 &amp;mdash; 2.1 정책, 조직, 자산관리&lt;/li&gt;
&lt;li&gt;ISMS-P 인증기준 안내서&lt;/li&gt;
&lt;li&gt;ISMS-P 세부점검항목&lt;/li&gt;
&lt;li&gt;정보보호 및 개인정보보호 관리체계(ISMS-P) 운영 관련 자료&lt;/li&gt;
&lt;li&gt;AWS Resource Groups Tagging API 및 클라우드 자산 관리 관련 기술문서&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>#ISMS_P #인증심사 #KISA #정보자산관리 #2.1.3 #보안결함 #AWS #자산자동화 #보안담당자 #보안설정</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/122</guid>
      <comments>https://ismsp-case.tistory.com/122#entry122comment</comments>
      <pubDate>Wed, 16 Sep 2026 09:11:42 +0900</pubDate>
    </item>
    <item>
      <title>별도 서버 없이 HTML 파일 하나로 끝내는 '프로젝트 작업 히스토리 관리자' 활용법</title>
      <link>https://ismsp-case.tistory.com/121</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하거나 다양한 시설&amp;middot;장비를 유지보수할 때, 가장 중요한 것 중 하나가 바로 '작업 기록의 체계적인 관리'입니다. 하지만 매번 거창한 관리 시스템을 도입하거나 서버와 DB를 구축하는 것은 여간 번거로운 일이 아닙니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 별도의 서버 설치 없이 브라우저에서 단 하나의 HTML 파일로 실행되는 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;2&quot;&gt;'프로젝트 히스토리 관리자'&lt;/b&gt; 프로그램의 주요 기능과 사용법을 안내해 드리고자 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;웹 기술(HTML5, Tailwind CSS, JavaScript)만으로 구성되어 있어 복잡한 과정 없이 파일을 열기만 하면 즉시 업무에 활용할 수 있습니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size26&quot;&gt;주요 기능 요약&lt;/h2&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;이 관리 도구는 누구나 직관적으로 사용할 수 있도록 필수 기능 위주로 구성되어 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;7,0,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0,0&quot;&gt;서버 없는 자동 저장 (LocalStorage)&lt;/b&gt;: 작성한 모든 기록은 브라우저 내부 저장소에 안전하게 자동 저장됩니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;7,0,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;7,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0,0&quot;&gt;JSON 백업 및 복원&lt;/b&gt;: 데이터를 파일 형태로 저장(export)하거나, 다른 PC에서 불러와(import) 이어 쓸 수 있습니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;7,1,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;7,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0,0&quot;&gt;3단계 계층 구조 자동 정렬&lt;/b&gt;: 등록된 데이터는 프로젝트 ➔ 작업 일자 ➔ 대상 장비 순으로 자동 분류되어 정돈된 형태로 보여집니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;7,2,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;7,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0,0&quot;&gt;원클릭 자동 입력 기능&lt;/b&gt;: 우측 히스토리에서 프로젝트명이나 장비명을 클릭하면 좌측 입력창에 해당 정보가 자동으로 세팅됩니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;7,3,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;7,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,4,0,0&quot;&gt;맞춤형 PDF 보고서 출력&lt;/b&gt;: 전체 내역은 물론, 특정 프로젝트 내역만 필터링하여 깔끔한 보고서 형태로 인쇄 또는 PDF 수록이 가능합니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;7,4,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;7,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,5,0,0&quot;&gt;실시간 검색 및 상태별 배지&lt;/b&gt;: 키워드 검색 기능과 함께 점검, 교체, 완료, 메모 등 작업 성격에 따라 색상별 배지가 부여되어 파악이 용이합니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;7,5,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;화면 구성 및 레이아웃&lt;/h2&gt;
&lt;p id=&quot;p-rc_73f2d2408fb32642-109&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-path-to-node=&quot;10,0&quot;&gt;화면은 작업 효율성을 극대화하기 위해 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;10,0&quot;&gt;2단 분할 레이아웃(Split Screen)&lt;/b&gt; 구조로 설계되어 있습니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;10,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cccc.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBj4Zf/dJMcabZ6sXv/AdEPBIy6mbI4GeifRKz82K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBj4Zf/dJMcabZ6sXv/AdEPBIy6mbI4GeifRKz82K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBj4Zf/dJMcabZ6sXv/AdEPBIy6mbI4GeifRKz82K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBj4Zf%2FdJMcabZ6sXv%2FAdEPBIy6mbI4GeifRKz82K%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;1468&quot; height=&quot;877&quot; data-filename=&quot;cccc.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;1. 상단 컨트롤 바 (Top Navigation)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;주요 버튼&lt;/b&gt;: 전체 PDF/인쇄, 저장 (JSON), 불러오기, 전체 초기화&lt;/li&gt;
&lt;li id=&quot;p-rc_73f2d2408fb32642-110&quot; data-path-to-node=&quot;13,0,1&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;13,1,0,0&quot;&gt;전체 시스템의 제어 및 데이터 백업/복원을 담당하는 영역입니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;13,1,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ddd.png&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo81ZH/dJMcaikxiDw/G4Lha26LfIwmzBc7vvohbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo81ZH/dJMcaikxiDw/G4Lha26LfIwmzBc7vvohbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo81ZH/dJMcaikxiDw/G4Lha26LfIwmzBc7vvohbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo81ZH%2FdJMcaikxiDw%2FG4Lha26LfIwmzBc7vvohbK%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;1456&quot; height=&quot;83&quot; data-filename=&quot;ddd.png&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;2. 좌측 패널 (작업 등록 폼 &amp;amp; 현황 요약)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;16,0,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0,0&quot;&gt;입력 항목&lt;/b&gt;: 프로젝트명, 대상 장비명, 작업 일자, 작업 구분, 세부 작업 내용(한 줄 요약), 상세 설명&lt;/span&gt;&lt;span data-path-to-node=&quot;16,0,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;16,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0,0&quot;&gt;스마트 자동 완성&lt;/b&gt;: 이전에 입력했던 프로젝트와 장비 이름이 목록으로 자동 추천되어 오탈자 없이 빠르게 입력할 수 있습니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;16,1,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;16,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,2,0,0&quot;&gt;전체 현황 요약&lt;/b&gt;: 현재 등록된 총 프로젝트 수와 전체 작업 건수를 실시간으로 집계해 보여줍니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;16,2,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ggg.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dErlHv/dJMcaaUhekB/JKDOMZz7khMPY9GYMFRe81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dErlHv/dJMcaaUhekB/JKDOMZz7khMPY9GYMFRe81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dErlHv/dJMcaaUhekB/JKDOMZz7khMPY9GYMFRe81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdErlHv%2FdJMcaaUhekB%2FJKDOMZz7khMPY9GYMFRe81%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;481&quot; height=&quot;763&quot; data-filename=&quot;ggg.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size23&quot;&gt;3. 우측 패널 (타임라인 아코디언 트리)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;19,0,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0,0&quot;&gt;검색 &amp;amp; 필터&lt;/b&gt;: 실시간 검색창과 프로젝트별 필터 드롭다운, 전체 접기/펼치기 버튼 제공&lt;/span&gt;&lt;span data-path-to-node=&quot;19,0,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;19,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0,0&quot;&gt;계층형 히스토리 카드&lt;/b&gt;: 프로젝트별로 그룹화되며, 날짜(최신순)와 장비별로 깔끔하게 접고 펼칠 수 있는 아코디언 형태로 나열됩니다.&lt;/span&gt;&lt;span data-path-to-node=&quot;19,1,0,1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;qwe.png&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKJRMJ/dJMcadKbOk1/5EbcCYu9Yme9n93TT75kBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKJRMJ/dJMcadKbOk1/5EbcCYu9Yme9n93TT75kBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKJRMJ/dJMcadKbOk1/5EbcCYu9Yme9n93TT75kBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKJRMJ%2FdJMcadKbOk1%2F5EbcCYu9Yme9n93TT75kBK%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;971&quot; height=&quot;667&quot; data-filename=&quot;qwe.png&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size26&quot;&gt;핵심 동작 로직 살펴보기&lt;/h2&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;프로그램이 작동하는 주요 핵심 로직 3가지를 간단히 소개해 드립니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size23&quot;&gt;1. 브라우저 저장소 및 JSON 데이터 백업&lt;/h3&gt;
&lt;p id=&quot;p-rc_73f2d2408fb32642-117&quot; data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-path-to-node=&quot;25,0&quot;&gt;작성한 데이터는 브라우저의 localStorage에 즉시 저장되며, 파일 형태(JSON)로 손쉽게 내보내거나 가져올 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// LocalStorage 데이터 읽기
function getHistories() {
    try {
        return JSON.parse(localStorage.getItem('project_work_histories') || '[]');
    } catch (e) {
        return [];
    }
}

// LocalStorage에 데이터 저장 후 화면 갱신
function saveHistories(data) {
    localStorage.setItem('project_work_histories', JSON.stringify(data));
    renderApp();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;24&quot; data-ke-size=&quot;size23&quot;&gt;2. 3단계 계층 구조 자동 그룹화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력된 개별 작업 데이터를 `프로젝트 ➔ 날짜 ➔ 장비` 형태의 중첩 구조로 자동 분류하여 화면에 트리 형태로 출력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1789440604058&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 데이터를 프로젝트/날짜/장비 순으로 그룹핑
const grouped = {};
filtered.forEach(item =&amp;gt; {
    const pName = item.project || '기타 프로젝트';
    const eName = item.equipment || item.device || '미지정';
    const dStr = item.date;

    if (!grouped[pName]) grouped[pName] = {};
    if (!grouped[pName][dStr]) grouped[pName][dStr] = {};
    if (!grouped[pName][dStr][eName]) grouped[pName][dStr][eName] = [];
    
    grouped[pName][dStr][eName].push(item);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;24&quot; data-ke-size=&quot;size23&quot;&gt;3. 인쇄 및 PDF 보고서 맞춤 스타일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인쇄 버튼을 누르면 문서 출력 시 불필요한 입력 폼이나 버튼 요소들은 자동으로 숨겨지며, 보고서 양식에 맞춰 깨끗하게 정돈됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1789440701274&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 인쇄 및 PDF 출력용 CSS 규칙 */
@media print {
    body { background-color: #ffffff !important; color: #0f172a !important; }
    .no-print { display: none !important; } /* 화면용 UI 숨김 */
    .print-only { display: block !important; } /* 인쇄용 헤더 표시 */
    .accordion-body { display: block !important; } /* 접혀있는 모든 항목 펼침 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tttt.png&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DwHs2/dJMcaaGTbtG/RcnaLiK2npMaqaxLUe9Gsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DwHs2/dJMcaaGTbtG/RcnaLiK2npMaqaxLUe9Gsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DwHs2/dJMcaaGTbtG/RcnaLiK2npMaqaxLUe9Gsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDwHs2%2FdJMcaaGTbtG%2FRcnaLiK2npMaqaxLUe9Gsk%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;611&quot; height=&quot;431&quot; data-filename=&quot;tttt.png&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;--- &lt;br /&gt;&lt;br /&gt;##&amp;nbsp; &amp;nbsp;초보자도&amp;nbsp;쉬운&amp;nbsp;4단계&amp;nbsp;사용&amp;nbsp;가이드 &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;**파일&amp;nbsp;실행하기** &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;제공된 `프로젝트 관리 V1.0.html` 파일을 다운로드한 뒤, 크롬이나 Edge 등 일반 웹 브라우저로 클릭하여 실행합니다.&lt;br /&gt;2.&amp;nbsp;**작업&amp;nbsp;등록하기** &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;좌측 폼에 프로젝트명, 장비명, 날짜, 세부 내용을 입력한 뒤 **[히스토리 등록]** 버튼을 누릅니다.&lt;br /&gt;3.&amp;nbsp;**데이터&amp;nbsp;검색&amp;nbsp;및&amp;nbsp;수정** &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;우측 상단 검색창에 장비 이름이나 작업 내용을 입력해 원하는 기록을 빠르게 찾을 수 있으며, 항목별 **[수정]** 및 **[삭제]**가 가능합니다.&lt;br /&gt;4.&amp;nbsp;**보고서&amp;nbsp;출력&amp;nbsp;및&amp;nbsp;데이터&amp;nbsp;백업** &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;상단의 **[전체 PDF / 인쇄]** 버튼을 통해 보고서를 출력하거나, **[저장 (JSON)]** 버튼을 눌러 소중한 기록을 파일로 안전하게 보관하세요.&lt;br /&gt;&lt;br /&gt;--- &lt;br /&gt;&lt;br /&gt;별도의&amp;nbsp;서버&amp;nbsp;설치&amp;nbsp;없이&amp;nbsp;파일&amp;nbsp;하나만으로&amp;nbsp;완벽한&amp;nbsp;작업&amp;nbsp;일지&amp;nbsp;시스템을&amp;nbsp;구축할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;점이&amp;nbsp;이&amp;nbsp;도구의&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;장점입니다.&amp;nbsp;현장&amp;nbsp;업무나&amp;nbsp;개인&amp;nbsp;프로젝트&amp;nbsp;관리&amp;nbsp;시&amp;nbsp;유용하게&amp;nbsp;활용해&amp;nbsp;보시기&amp;nbsp;바랍니다. &lt;br /&gt;&lt;br /&gt;--- &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/QzKd8/dJMcafnSD2o/YiAOI4inyvaNiNXzNJSIrK/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%20%EA%B4%80%EB%A6%AC%20V1.0.html?attach=1&amp;amp;knm=tfile.html&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;프로젝트 관리 V1.0.html&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.04MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#프로젝트관리 #작업일지 #유지보수일지 #TailwindCSS #LocalStorage #웹앱 #프론트엔드 #PDF보고서 #업무효율화 #노코드관리</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/121</guid>
      <comments>https://ismsp-case.tistory.com/121#entry121comment</comments>
      <pubDate>Tue, 15 Sep 2026 11:53:38 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검 요약] 서비스 관리 (U-39~U-43) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/118</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bbb.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brewnI/dJMcaa7Ytkt/O77MKSe5kNEKoDWV6vkJKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brewnI/dJMcaa7Ytkt/O77MKSe5kNEKoDWV6vkJKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brewnI/dJMcaa7Ytkt/O77MKSe5kNEKoDWV6vkJKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrewnI%2FdJMcaa7Ytkt%2FO77MKSe5kNEKoDWV6vkJKK%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;1672&quot; height=&quot;941&quot; data-filename=&quot;bbb.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;NFS 및 RPC, NIS 서비스 관리 그룹(U-39~U-43)에 대한 자동 진단 스크립트 분석과 실무 조치 가이드입니다. 불필요한 네트워크 데몬 비활성화 및 안전한 조치 및 백업 절차를 통해 레거시 프로토콜의 보안 위협을 최소화하는 방안을 제시합니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. NFS 및 RPC 서비스 보안 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; width: 7.55814%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.093%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.97674%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.55814%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-39&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;불필요한 NFS 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;프로세스,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/systemd/system/&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;NFS 서비스(nfsd, statd, mountd)가 비활성화된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.97674%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.55814%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-40&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;NFS 접근 통제&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/exports,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/exports.d/*&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;NFS 사용 시 특정 IP만 허용하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;no_root_squash옵션이 없는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.97674%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.55814%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-41&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;불필요한 automountd 제거&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;프로세스,&lt;span&gt;&amp;nbsp;&lt;/span&gt;autofs.service&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;automountd(autofs) 데몬이 비활성화되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.97674%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.55814%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-42&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;불필요한 RPC 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/xinetd.d/*,&lt;span&gt;&amp;nbsp;&lt;/span&gt;rpcbind.service&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;불필요한 RPC 서비스(rstatd, rusersd 등)가 비활성화된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.97674%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.55814%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-43&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.0465%;&quot; data-streamdown=&quot;table-cell&quot;&gt;NIS, NIS+ 점검&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 22.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;프로세스,&lt;span&gt;&amp;nbsp;&lt;/span&gt;ypserv,&lt;span&gt;&amp;nbsp;&lt;/span&gt;ypbind&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;NIS 관련 데몬(ypserv, ypbind 등)이 비활성화되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 6.97674%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-39] 불필요한 NFS 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;NFS(Network File System)는 네트워크를 통해 파일 시스템을 공유하는 서비스입니다. 인증 메커니즘이 취약한 구형 프로토콜 특성상, 업무상 불필요한 NFS 서비스가 활성화되어 있으면 인가되지 않은 사용자가 원격에서 파일 시스템에 접근하여 중요 데이터를 유출하거나 변조할 위험이 발생합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설]: NFS 서비스 동작 여부를 저장할 변수 초기화
NFS_RUNNING=&quot;FALSE&quot;

# [상세 해설]: systemctl 구동 상태 확인 및 ps 명령어로 nfsd, statd, mountd 프로세스 실행 여부 검사
if systemctl is-active --quiet nfs-server 2&amp;gt;/dev/null || ps -ef | grep -E &quot;nfsd|statd|mountd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    NFS_RUNNING=&quot;TRUE&quot;
fi

# [상세 해설]: NFS 서비스가 실행 중인 경우 경고 메시지 출력 및 U-40 연계 점검 안내
if [[ &quot;$NFS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    WARN &quot;NFS 서비스가 동작 중입니다. 업무상 불필요한 경우 비활성화해야 합니다.&quot; &quot;nfsd, statd, mountd 데몬 동작 확인&quot;
    INFO &quot;NFS 서비스를 반드시 사용해야 하는 경우, 다음 항목(U-40)의 접근 통제 설정을 확인하십시오.&quot; &quot;업무 필요성 수동 점검 요망&quot;
else
    OK &quot;불필요한 NFS 서비스가 안전하게 비활성화되어 있습니다.&quot; &quot;NFS 관련 데몬 프로세스 미동작&quot;
fi
FINISH &quot;[ U-39 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 수동 진단 및 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 상태 확인&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl status nfs-server
ps -ef | grep -E &quot;nfsd|statd|mountd&quot; | grep -v grep&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 중지 및 비활성화 (조치)&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop nfs-server rpcbind
systemctl disable nfs-server rpcbind&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 클라이언트 시스템이 NFS 공유 디렉터리를 마운트하여 사용 중인 상태에서 서버 측 NFS 서비스를 사전 협의 없이 중지하면, 클라이언트 시스템에서 I/O Wait가 급증하며&lt;span&gt;&amp;nbsp;&lt;/span&gt;df -h&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어 및 파일 시스템 접근 시 세션이 멈추는(Hang) 장애가 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전한 조치 방법&lt;/span&gt;: 조치 전 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;showmount -e&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;netstat -anp | grep 2049&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어로 현재 연결된 클라이언트 IP를 확인해야 합니다. 클라이언트 측에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;umount&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어를 통해 마운트를 해제한 것을 검증한 후 서버 데몬을 정지하십시오.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-40] NFS 접근 통제&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;NFS 서비스를 불가피하게 운영할 경우,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/exports&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정을 통해 지정된 IP 대역만 접근을 허용하고 root 권한을 일반 계정으로 격리(root_squash)해야 합니다. 전체 허용(*) 설정이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;no_root_squash&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션이 적용되어 있으면 원격 공격자가 Target 시스템의 root 권한을 획득할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설]: U-39에서 확인된 NFS 서비스 실행 여부에 따라 점검 진행
if [[ &quot;$NFS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    if [ -f /etc/exports ]; then
        # [상세 해설]: 주석 제외 후 와일드카드(*) 접근 허용 또는 no_root_squash 옵션이 존재하는지 검색
        WEAK_EXPORTS=$(grep -v &quot;^[[:space:]]*#&quot; /etc/exports | grep -E &quot;\*|no_root_squash&quot; | xargs)
        if [ -n &quot;$WEAK_EXPORTS&quot; ]; then
            WARN &quot;NFS 서비스가 동작 중이며, /etc/exports 접근 통제 설정이 취약합니다.&quot; &quot;접근 제한(*)이 없거나 root_squash가 미적용됨: $WEAK_EXPORTS&quot;
        else
            OK &quot;NFS 서비스가 동작 중이나, /etc/exports에 IP 접근 통제가 안전하게 설정되어 있습니다.&quot; &quot;특정 IP 통제 및 no_root_squash 미사용&quot;
        fi
    else
        WARN &quot;NFS 서비스가 동작 중이나 /etc/exports 설정 파일이 존재하지 않습니다.&quot; &quot;설정 파일 누락으로 확인 불가&quot;
    fi
else
    OK &quot;NFS 서비스가 동작하지 않으므로 접근 통제 점검에 해당하지 않습니다 (N/A).&quot; &quot;해당 서비스 미사용&quot;
fi
FINISH &quot;[ U-40 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 수동 진단 및 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -p /etc/exports /etc/exports.bak_$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 수정 (/etc/exports)&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;haskell&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 취약한 설정예시: /data *(rw,no_root_squash)
# 양호한 설정예시:
/data 192.168.1.50(rw,root_squash,secure)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 적용 및 검증&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;exportfs -ra
exportfs -v&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 위험 요소&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;no_root_squash&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션이 설정되어 있으면 공격자는 클라이언트에서 SUID 권한이 부여된 백도어 파일을 마운트 디렉터리에 생성하여 서버의 root 권한을 침탈할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;MSA 및 자동화 환경에서의 대안&lt;/span&gt;: Kubernetes PersistentVolume이나 CI/CD 공유 스토리지 구성을 위해 특정 계정 권한이 반드시 필요하다면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;no_root_squash&lt;span&gt;&amp;nbsp;&lt;/span&gt;대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;anonuid&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;anongid&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 사용하여 특정 애플리케이션 전용 서비스 계정의 UID로 맵핑하는 방식을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-41] 불필요한 automountd 제거&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;automountd(autofs)는 파일 시스템에 접근이 시도될 때 NFS 공유 디렉터리 등을 자동으로 마운트해 주는 데몬입니다. 사용하지 않는 automountd가 활성화되어 있으면 비인가자에 의한 의도치 않은 외부 스토리지 자동 마운트가 유발되어 보안상 허점이 생길 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설]: autofs 상태 확인을 위한 변수 초기화
AUTOFS_RUNNING=&quot;FALSE&quot;

# [상세 해설]: systemd 서비스 상태 검사 및 ps 명령어로 automount/autofs 데몬 실행 여부 확인
if systemctl is-active --quiet autofs 2&amp;gt;/dev/null || ps -ef | grep -E &quot;automount|autofs&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    AUTOFS_RUNNING=&quot;TRUE&quot;
fi

# [상세 해설]: 서비스 실행 여부에 따라 양호/취약 판정 출력
if [[ &quot;$AUTOFS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    WARN &quot;인가되지 않은 시스템 마운트를 유발할 수 있는 automountd(autofs) 서비스가 동작 중입니다.&quot; &quot;automount 프로세스 발견&quot;
else
    OK &quot;automountd(autofs) 서비스가 비활성화되어 있습니다.&quot; &quot;관련 데몬 미동작&quot;
fi
FINISH &quot;[ U-41 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 수동 진단 및 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 상태 확인&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl status autofs&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 중지 및 비활성화 (조치)&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop autofs
systemctl disable autofs&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 검증 절차&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;autofs를 중지하기 전,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/auto.master&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/auto.master.d/&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리에 정의된 마운트 포인트를 사용 중인 업무 프로세스(예: 백업 솔루션, 이중화 소프트웨어)가 있는지 확인해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;장애 방지 포인트&lt;/span&gt;: 불필요한 autofs를 제거하지 않고 방치할 경우, 네트워크 연결이 끊긴 원격 NFS 경로로 접근 시 파이프라인 프로세스 전체가 블로킹되어 서비스 장애로 이어질 수 있습니다. 수동 fstab 관리가 보안 및 안정성 면에서 훨씬 우수합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-42] 불필요한 RPC 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;RPC(Remote Procedure Call) 관련 데몬(rpcbind,&lt;span&gt;&amp;nbsp;&lt;/span&gt;rstatd,&lt;span&gt;&amp;nbsp;&lt;/span&gt;rusersd,&lt;span&gt;&amp;nbsp;&lt;/span&gt;rwalld,&lt;span&gt;&amp;nbsp;&lt;/span&gt;rsprayd&lt;span&gt;&amp;nbsp;&lt;/span&gt;등)은 구형 유닉스/리눅스 환경에서 원격 관리를 위해 사용되었습니다. 이들 데몬은 버퍼 오버플로우 및 정보 유출 취약점이 다수 존재하므로, NFS 운영 등의 필수 목적이 아니라면 비활성화해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설]: 취약한 RPC 서비스 목록을 담을 변수 초기화
RPC_VULN_SERVICES=&quot;&quot;

# [상세 해설]: 1. rpcbind(포트맵) 실행 여부 확인 - NFS를 사용하지 않는데 켜져 있는 경우 취약으로 간주
if systemctl is-active --quiet rpcbind 2&amp;gt;/dev/null || ps -ef | grep -E &quot;rpcbind|portmap&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    if [[ &quot;$NFS_RUNNING&quot; == &quot;FALSE&quot; ]]; then
        RPC_VULN_SERVICES=&quot;rpcbind(포트맵) &quot;
    fi
fi

# [상세 해설]: 2. legacy xinetd 기반 구형 RPC 데몬(rstatd, rusersd 등) 활성화 상태 점검
RPC_LIST=&quot;rstatd rusersd rwalld rsprayd&quot;
if [ -d /etc/xinetd.d ]; then
    for rpc in $RPC_LIST; do
        if grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; &quot;/etc/xinetd.d/$rpc&quot; 2&amp;gt;/dev/null; then
            RPC_VULN_SERVICES=&quot;$RPC_VULN_SERVICES $rpc&quot;
        fi
    done
fi

# [상세 해설]: 취약한 RPC 서비스 검출 결과에 따른 최종 진단 출력
if [ -n &quot;$RPC_VULN_SERVICES&quot; ]; then
    WARN &quot;불필요하거나 취약한 RPC 데몬이 활성화되어 있습니다.&quot; &quot;활성화된 데몬: [ $RPC_VULN_SERVICES ]&quot;
else
    OK &quot;취약한 구형 RPC 서비스가 비활성화되어 있거나 정상적인 목적(NFS 등)으로만 운영 중입니다.&quot; &quot;불필요한 RPC 프로세스 미동작&quot;
fi
FINISH &quot;[ U-42 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 수동 진단 및 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;rpcbind 중지 및 비활성화 (NFS 미사용 시)&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop rpcbind rpcbind.socket
systemctl disable rpcbind rpcbind.socket&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;xinetd 기반 RPC 서비스 비활성화&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;inform7&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# /etc/xinetd.d/ 내 해당 서비스 파일의 disable 옵션을 yes로 변경
sed -i 's/disable[[:space:]]*=[[:space:]]*no/disable = yes/g' /etc/xinetd.d/rstatd 2&amp;gt;/dev/null
systemctl reload xinetd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;최신 아키텍처 환경 노하우&lt;/span&gt;: NFSv4 전용 환경에서는 더 이상&lt;span&gt;&amp;nbsp;&lt;/span&gt;rpcbind(111번 포트)를 필요로 하지 않으며 2049번 포트만 사용합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 팁&lt;/span&gt;: NFSv4만 사용하는 현대적인 Linux 서버라면 NFS 서비스 운영 중이라도&lt;span&gt;&amp;nbsp;&lt;/span&gt;rpcbind&lt;span&gt;&amp;nbsp;&lt;/span&gt;데몬을 비활성화할 수 있습니다. 단, 이 설정을 적용하려면 NFS 서버 설정 파일(/etc/nfs.conf)에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;[nfsd]&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목의&lt;span&gt;&amp;nbsp;&lt;/span&gt;vers3=no&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 지정하여 NFSv3 하위 호환성을 끄고 사전 테스트를 수행해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-43] NIS, NIS+ 점검&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;NIS(Network Information Service)는 네트워크 내 여러 리눅스 서버의 사용자 계정 정보(/etc/passwd, /etc/shadow 등)를 중앙에서 통합 관리하는 서비스입니다. 데이터 전송 시 암호화되지 않은 평문 통신을 사용하므로 네트워크 스니핑을 통해 사용자 비밀번호 해시값이 유출될 수 있어 금지해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설]: NIS 서비스 동작 상태 변수 초기화
NIS_RUNNING=&quot;FALSE&quot;

# [상세 해설]: NIS 관련 핵심 데몬(ypserv, ypbind, ypxfrd, yppasswdd) 실행 여부를 systemctl 및 ps로 검사
if systemctl is-active --quiet ypserv 2&amp;gt;/dev/null || ps -ef | grep -E &quot;ypserv|ypbind|ypxfrd|yppasswdd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null; then
    NIS_RUNNING=&quot;TRUE&quot;
fi

# [상세 해설]: NIS 데몬 동작 시 보안 위험 경고 출력
if [[ &quot;$NIS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    WARN &quot;패스워드 해시값이 평문으로 전송될 위험이 있는 NIS 서비스가 동작 중입니다.&quot; &quot;ypserv, ypbind 등 관련 프로세스 발견&quot;
else
    OK &quot;보안상 취약한 NIS(Network Information Service)가 비활성화되어 있습니다.&quot; &quot;NIS 관련 프로세스 미동작&quot;
fi
FINISH &quot;[ U-43 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 수동 진단 및 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;NIS 관련 서비스 중지 및 비활성화&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop ypserv ypbind ypxfrd yppasswdd 2&amp;gt;/dev/null
systemctl disable ypserv ypbind ypxfrd yppasswdd 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;관련 패키지 삭제 (선택 권장)&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# RHEL 계열
yum remove ypbind ypserv
# Debian/Ubuntu 계열
apt-get purge nis&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 조치 주의사항&lt;/span&gt;: 중앙 인증을 사용하는 기업 환경에서 대안 시스템(OpenLDAP, FreeIPA, Active Directory 연동 등)을 갖추지 않은 채&lt;span&gt;&amp;nbsp;&lt;/span&gt;ypbind를 정지하면, NIS 계정으로 로그인되어 있던 모든 사용자의 세션이 끊어지고 신규 로컬 로그인만 가능해지는 인프라 마비가 일어납니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전한 전환 절차&lt;/span&gt;: 계정 관리 체계를 전환할 때는 PAM 인증 모듈(/etc/pam.d/system-auth,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/nsswitch.conf)에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;nis&lt;span&gt;&amp;nbsp;&lt;/span&gt;지시어를 먼저 제거하고, SSSD(System Security Services Daemon) 및 LDAP 기반 인증으로 완벽히 이전한 후 NIS 데몬을 중지해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 그룹 스크립트 한계점 및 예외 처리 종합 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;스크립트 한계점 분석&lt;/h3&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제시된 스크립트는 표준적인 데몬 프로세스명과 단일 설정 파일(/etc/exports)만을 점검하고 있습니다. 그러나 최신 OS(RHEL 8/9, Ubuntu 22.04/24.04 등) 환경에서는 다음과 같은 진단 한계가 존재합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;분할 설정 디렉터리 미인식&lt;/span&gt;: 최신 NFS 패키지는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/exports&lt;span&gt;&amp;nbsp;&lt;/span&gt;외에도&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/exports.d/*.exports&lt;span&gt;&amp;nbsp;&lt;/span&gt;구성을 지원하므로 해당 경로 내의 취약한 설정을 탐지하지 못하는 오탐이 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;NFSv4 전용 환경 미반영&lt;/span&gt;: NFSv4 환경에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;rpcbind&lt;span&gt;&amp;nbsp;&lt;/span&gt;없이 작동 가능함에도 일률적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;rpcbind&lt;span&gt;&amp;nbsp;&lt;/span&gt;실행 시 취약(U-42)으로 판정할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;핵심 개선 코드 스니펫 (Code Snippet)&lt;/h3&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 한계를 보완하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/exports.d/&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리의 분할 설정 파일까지 통합 검사하도록&lt;span&gt;&amp;nbsp;&lt;/span&gt;U-40&lt;span&gt;&amp;nbsp;&lt;/span&gt;로직을 개선한 코드 스니펫을 제안합니다.&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫]: 분할 설정 디렉터리(/etc/exports.d/*.exports) 포함 검사 로직
if [[ &quot;$NFS_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    EXPORTS_FILES=&quot;/etc/exports $(ls /etc/exports.d/*.exports 2&amp;gt;/dev/null)&quot;
    WEAK_EXPORTS=$(grep -v &quot;^[[:space:]]*#&quot; $EXPORTS_FILES 2&amp;gt;/dev/null | grep -E &quot;\*|no_root_squash&quot; | xargs)
    
    if [ -n &quot;$WEAK_EXPORTS&quot; ]; then
        WARN &quot;NFS 접근 통제 설정이 취약합니다.&quot; &quot;취약 설정 발견: $WEAK_EXPORTS&quot;
    else
        OK &quot;모든 NFS 설정 파일의 IP 접근 통제 및 root_squash 설정이 양호합니다.&quot;
    fi
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #네트워크보안 #NFS설정 #RPC보안 #NIS점검 #오토마운트 #시스템취약점 #보안가이드 #서버관리자 #정보보호 #주요정보통신기반시설 #인프라보안 #U39 #U40 #U41 #U42 #U43</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/118</guid>
      <comments>https://ismsp-case.tistory.com/118#entry118comment</comments>
      <pubDate>Tue, 15 Sep 2026 11:23:44 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검 요약] 서비스 관리 (U-34 ~ U-38) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/116</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fff.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pWKJD/dJMcafIbb1C/IVKkiUibphYhlQE2wut2jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pWKJD/dJMcafIbb1C/IVKkiUibphYhlQE2wut2jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pWKJD/dJMcafIbb1C/IVKkiUibphYhlQE2wut2jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWKJD%2FdJMcafIbb1C%2FIVKkiUibphYhlQE2wut2jk%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;1672&quot; height=&quot;941&quot; data-filename=&quot;fff.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 시스템의 서비스 관리 영역인 U-34부터 U-38까지 5개 주요 보안 점검 항목에 대한 진단 가이드입니다. Finger, 익명 FTP, r-계열, DoS 유발 서비스 등 불필요한 레거시 네트워크 데몬을 '자동 진단'하고, crontab 파일의 '안전한 조치 및 백업' 절차를 통해 시스템 접근 권한 오남용 및 무단 정보 유출 위험을 원천 차단하는 실무 노하우를 소개합니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 서비스 관리 분야 (U-34 ~ U-38) 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-34&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;Finger 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/xinetd.d/finger,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/inetd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;Finger 서비스(데몬 및 소켓)가 비활성화되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-35&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;공유 서비스에 대한 익명 접근 제한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/vsftpd/vsftpd.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/proftpd/proftpd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;FTP 서비스의 익명(Anonymous) 접속이 차단되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-36&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;r 계열 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/xinetd.d/r*,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/inetd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;rsh, rlogin, rexec 등 r-계열 서비스가 비활성화되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-37&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;crontab 설정파일 권한 설정 미흡&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/crontab,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/cron.*,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/spool/cron/*&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;소유자가 root이고 권한이 640 이하(타사용자 쓰기 제한)인 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-38&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;DoS 공격에 취약한 서비스 비활성화&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/xinetd.d/*,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/inetd.conf&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;echo, discard, daytime, chargen 서비스가 비활성화되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-34] Finger 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Finger 서비스는 원격지에서 시스템에 등록된 사용자 정보(계정명, 홈 디렉터리, 최근 로그인 시간, 인쇄 상태 등)를 조회할 수 있는 레거시 프로토콜입니다. 공격자는 이 서비스를 활용해 활성 계정 목록을 수집한 후 사전 대입 공격(Dictionary Attack)이나 무차별 대입 공격(Brute Force Attack)의 타깃으로 활용할 수 있으므로, 반드시 비활성화해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-34 Finger 서비스 비활성화 점검 시작
CODE &quot;[ U-34 ] Finger 서비스 비활성화&quot;

# 변수 초기화: 기본 상태를 미동작(FALSE)으로 설정
FINGER_RUNNING=&quot;FALSE&quot;
REASON_FINGER=&quot;&quot;

# systemctl 명령을 이용해 systemd 환경에서 finger 데몬 또는 소켓 활성화 여부 검사
if systemctl is-active --quiet finger 2&amp;gt;/dev/null || systemctl is-active --quiet finger.socket 2&amp;gt;/dev/null; then
    FINGER_RUNNING=&quot;TRUE&quot;
    REASON_FINGER=&quot;systemctl에서 finger 데몬/소켓 활성화 확인됨.&quot;
fi

# xinetd 환경 점검: /etc/xinetd.d/finger 파일 내 disable 설정 확인
if [ -f /etc/xinetd.d/finger ]; then
    # disable = no 구문이 존재하는지 대소문자 구분 없이 무소음 구문 검색(-q)
    if grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; /etc/xinetd.d/finger; then
        FINGER_RUNNING=&quot;TRUE&quot;
        REASON_FINGER=&quot;xinetd 환경에서 finger 서비스가 활성화(disable=no)되어 있음.&quot;
    fi
# inetd 환경 점검: /etc/inetd.conf 파일 내 finger 주석 해제 여부 확인
elif [ -f /etc/inetd.conf ]; then
    # 행 시작 부분에 주석(#) 없이 finger 구문이 활성화된 경우 추출
    if grep -E -i &quot;^[[:space:]]*finger&quot; /etc/inetd.conf &amp;gt;/dev/null; then
        FINGER_RUNNING=&quot;TRUE&quot;
        REASON_FINGER=&quot;inetd.conf 파일에 finger 서비스가 주석 해제되어 있음.&quot;
    fi
fi

# 최종 상태 판단 및 결과 출력
if [[ &quot;$FINGER_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    WARN &quot;시스템 정보 유출 위험이 있는 Finger 서비스가 활성화되어 있습니다.&quot; &quot;$REASON_FINGER&quot;
else
    OK &quot;취약한 Finger 서비스가 비활성화되어 있습니다.&quot; &quot;Finger 관련 데몬 및 네트워크 서비스 미동작&quot;
fi
FINISH &quot;[ U-34 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 과거 레거시 시스템 운영 시, 외부 관제 시스템이나 자체 모니터링 스크립트가 Finger 응답을 기반으로 서버 상태를 체크하도록 구현된 경우가 있었습니다. 사전 협의 없이 Finger 서비스를 중지할 경우 통합 관제 모니터링에서 거짓 경보(False Alarm)가 대량 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 테스트 절차&lt;/span&gt;: 서비스 중지 전 active 세션 및 포트 오픈 여부를 확인합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;ss -tulpn | grep :79
systemctl status finger finger.socket 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;운영 환경 대안&lt;/span&gt;: 만약 시스템 계정의 세션 정보 모니터링이 필요하다면, 네트워크 포트를 외부에 노출하는 Finger 대신 SSH 기반의 중앙집중식 로그 수집기(Fluentd, Logstash)나&lt;span&gt;&amp;nbsp;&lt;/span&gt;w,&lt;span&gt;&amp;nbsp;&lt;/span&gt;who&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어를 내부 보안 에이전트로 래핑하여 조회하는 방식을 적용해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업 (xinetd/inetd 환경의 경우)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;gradle&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -v /etc/xinetd.d/finger /etc/xinetd.d/finger.bak 2&amp;gt;/dev/null
cp -v /etc/inetd.conf /etc/inetd.conf.bak 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 비활성화 조치&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Systemd 환경&lt;/span&gt;:
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl stop finger.socket finger 2&amp;gt;/dev/null
systemctl disable finger.socket finger 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;xinetd 환경&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/xinetd.d/finger&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일 내&lt;span&gt;&amp;nbsp;&lt;/span&gt;disable = yes로 변경
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;inform7&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;sed -i 's/disable[[:space:]]*=[[:space:]]*no/disable = yes/g' /etc/xinetd.d/finger
systemctl reload xinetd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-35] 공유 서비스에 대한 익명 접근 제한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FTP 서비스 구동 시 익명(Anonymous) 접속이 허용되어 있으면 계정과 패스워드 없이 누구나 서버에 접근하여 파일을 다운로드하거나 업로드할 수 있습니다. 이는 악성코드 유포지 활용, 시스템 주요 파일 유출, 디스크 차부하로 인한 서비스 거부 상태 발생 등의 심각한 위협으로 이어집니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-35 익명 FTP 접속 제한 점검 시작
CODE &quot;[ U-35 ] 공유 서비스에 대한 익명 접근 제한 설정&quot;

FTP_RUNNING=&quot;FALSE&quot;
ANONYMOUS_SAFE=&quot;FALSE&quot;
REASON_FTP=&quot;&quot;

# 실행 중인 FTP 데몬(vsftpd, proftpd, in.ftpd) 프로세스 및 systemd 서비스 체크
if ps -ef | grep -E &quot;vsftpd|proftpd|in.ftpd&quot; | grep -v &quot;grep&quot; &amp;gt;/dev/null || systemctl is-active --quiet vsftpd 2&amp;gt;/dev/null; then
    FTP_RUNNING=&quot;TRUE&quot;
fi

if [[ &quot;$FTP_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    # vsftpd 설정 파일 점검
    if [ -f /etc/vsftpd/vsftpd.conf ]; then
        # anonymous_enable=NO 설정 유무 확인
        if grep -i -q &quot;^[[:space:]]*anonymous_enable=NO&quot; /etc/vsftpd/vsftpd.conf; then
            ANONYMOUS_SAFE=&quot;TRUE&quot;
            REASON_FTP=&quot;vsftpd.conf 내에 anonymous_enable=NO 설정 적용됨.&quot;
        else
            REASON_FTP=&quot;vsftpd.conf 내에 anonymous_enable=YES 이거나 설정이 누락됨.&quot;
        fi
    # ProFTPD 설정 파일 점검
    elif [ -f /etc/proftpd/proftpd.conf ] || [ -f /etc/proftpd.conf ]; then
        CONF_FILE=$(ls /etc/proftpd/proftpd.conf /etc/proftpd.conf 2&amp;gt;/dev/null | head -1)
        # &amp;lt;Anonymous&amp;gt; 블록 존재 여부 확인 (존재 시 익명 접근 허용으로 간주)
        if grep -i -q &quot;&amp;lt;Anonymous&quot; &quot;$CONF_FILE&quot;; then
            REASON_FTP=&quot;proftpd.conf 파일 내에 익명 접속 허용 블록(&amp;lt;Anonymous&amp;gt;)이 존재함.&quot;
        else
            ANONYMOUS_SAFE=&quot;TRUE&quot;
            REASON_FTP=&quot;proftpd.conf 파일 내에 익명 접속 블록이 없음.&quot;
        fi
    else
        REASON_FTP=&quot;FTP 서비스는 동작 중이나 설정 파일을 찾을 수 없어 수동 점검 필요.&quot;
    fi

    if [[ &quot;$ANONYMOUS_SAFE&quot; == &quot;TRUE&quot; ]]; then
        OK &quot;FTP 서비스에 익명(Anonymous) 접속이 안전하게 차단되어 있습니다.&quot; &quot;$REASON_FTP&quot;
    else
        WARN &quot;FTP 서비스에 익명(Anonymous) 접속이 허용되어 있습니다.&quot; &quot;$REASON_FTP&quot;
    fi
else
    OK &quot;FTP 등 공유 서비스가 동작하지 않으므로 익명 접속 위험이 없습니다.&quot; &quot;FTP 데몬 미동작&quot;
fi
FINISH &quot;[ U-35 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: CI/CD 파이프라인이나 자동화 배포 패치 서버에서 FTP를 통한 무암호/익명 파일 다운로드 방식을 그대로 사용하는 경우가 있습니다. 사전 영향도 평가 없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;anonymous_enable=NO&lt;span&gt;&amp;nbsp;&lt;/span&gt;적용 후 서비스를 재시작하면 자동화 빌드/배포 프로세스가 즉시 실패합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 테스트 절차&lt;/span&gt;: 설정 수정 후 문법 검사를 수행하고, 외부에서 익명 접속을 직접 테스트합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# vsftpd 설정 검증 및 접속 시험
vsftpd -v
curl --ftp-port - ftp://localhost/ --user anonymous:guest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;운영 환경 대안&lt;/span&gt;: 익명 FTP를 통한 대민 파일 다운로드 서비스가 불가피하게 필요한 경우, 업로드 권한을 완벽히 차단(write_enable=NO)하고 전용 DMZ 구간에 격리된 전용 FTP 서버를 배치해야 합니다. 가능한 보안이 강화된 SFTP(SSH File Transfer Protocol) 및 전용 서비스 계정 사용을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;설정 파일 백업&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -v /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak.$(date +%Y%m%d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;익명 접속 차단 설정 적용&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 기존 설정 변경 또는 추가
if grep -q &quot;anonymous_enable&quot; /etc/vsftpd/vsftpd.conf; then
    sed -i 's/anonymous_enable=.*/anonymous_enable=NO/g' /etc/vsftpd/vsftpd.conf
else
    echo &quot;anonymous_enable=NO&quot; &amp;gt;&amp;gt; /etc/vsftpd/vsftpd.conf
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서비스 데몬 리로드/재시작&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl restart vsftpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-36] r 계열 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;r-command 서비스(rsh, rlogin, rexec 등)는 패스워드 인증 없이 IP 주소 및&lt;span&gt;&amp;nbsp;&lt;/span&gt;$HOME/.rhosts&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정 기반으로 원격 명령을 실행할 수 있게 해주는 구형 네트워크 프로토콜입니다. 데이터를 암호화하지 않고 평문(Plaintext)으로 전송하므로 네트워크 스니핑 및 IP 스푸핑 공격에 매우 취약하여 원격 관리 권한을 탈취당할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-36 r 계열 서비스 점검 시작
CODE &quot;[ U-36 ] r 계열 서비스 비활성화&quot;

# 점검 대상 r-계열 명령어 서비스 목록 정의
R_SVCS=&quot;rsh rlogin rexec shell login exec&quot;
WEAK_R_SVCS=&quot;&quot;

# xinetd 디렉터리 내 개별 서비스 설정 체크
if [ -d /etc/xinetd.d ]; then
    for r_svc in $R_SVCS; do
        if grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; &quot;/etc/xinetd.d/$r_svc&quot; 2&amp;gt;/dev/null; then
            WEAK_R_SVCS=&quot;$WEAK_R_SVCS $r_svc&quot;
        fi
    done
# inetd 환경 설정 체크
elif [ -f /etc/inetd.conf ]; then
    for r_svc in $R_SVCS; do
        if grep -E -i &quot;^[[:space:]]*$r_svc&quot; /etc/inetd.conf &amp;gt;/dev/null; then
            WEAK_R_SVCS=&quot;$WEAK_R_SVCS $r_svc&quot;
        fi
    done
fi

# systemd 환경의 활성화된 서비스 및 소켓 체크
for r_svc in $R_SVCS; do
    if systemctl is-active --quiet &quot;$r_svc&quot; 2&amp;gt;/dev/null || systemctl is-active --quiet &quot;${r_svc}.socket&quot; 2&amp;gt;/dev/null; then
        WEAK_R_SVCS=&quot;$WEAK_R_SVCS $r_svc&quot;
    fi
done

# 중복 제거 및 정렬 처리
WEAK_R_SVCS=$(echo &quot;$WEAK_R_SVCS&quot; | xargs -n1 | sort -u | xargs)

# 최종 결과 판정
if [ -n &quot;$WEAK_R_SVCS&quot; ]; then
    WARN &quot;인증 없이 원격 명령을 실행할 수 있는 r-command 서비스가 활성화되어 있습니다.&quot; &quot;취약 활성 서비스: [ $WEAK_R_SVCS ]&quot;
else
    OK &quot;위험한 원격 명령 실행 서비스(r-command)가 안전하게 차단되어 있습니다.&quot; &quot;rsh, rlogin, rexec 등 모두 비활성화됨&quot;
fi
FINISH &quot;[ U-36 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 과거에 구축된 고성능 연산 클러스터(HPC)나 구형 오라클 RAC(Real Application Clusters v10g/11g 등) 환경에서 노드 간 통신을 위해 rsh/rcp를 의존성으로 사용했던 경우가 있습니다. SSH 키 기반 통신으로 전환 작업 없이 rsh 데몬을 종료하면 클러스터 동기화 장애 및 데이터베이스 노드 이중화 다운 현상이 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 테스트 절차&lt;/span&gt;: 활성화된 관련 소켓 및 데몬이 완전히 차단되었는지 점검합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dsconfig&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl list-units --type=socket | grep -E 'rsh|rlogin|rexec'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;운영 환경 대안&lt;/span&gt;: 모든 노드 간 원격 명령어 실행 및 파일 전송은 SSH 공개키(Public Key) 기반 인증 및 SFTP/SCP 환경으로 전환해야 합니다. 백업 및 스크립트 수용을 위해 SSH 설정 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;Passphrase가 없는 전용 SSH 키와 특정 명령만 허용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;command=&quot;...&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 restricted shell과 조합하여 운영하는 것이 바람직합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;관련 서비스 및 소켓 중지 및 비활성화 (Systemd)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl disable --now rsh.socket rlogin.socket rexec.socket 2&amp;gt;/dev/null
systemctl stop rsh.socket rlogin.socket rexec.socket 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;xinetd 설정 수정 (xinetd 사용 시)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;for svc in rsh rlogin rexec; do
    if [ -f &quot;/etc/xinetd.d/$svc&quot; ]; then
        cp -v &quot;/etc/xinetd.d/$svc&quot; &quot;/etc/xinetd.d/$svc.bak&quot;
        sed -i 's/disable[[:space:]]*=[[:space:]]*no/disable = yes/g' &quot;/etc/xinetd.d/$svc&quot;
    fi
done
systemctl reload xinetd 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-37] crontab 설정파일 권한 설정 미흡&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;crontab 관련 파일 및 디렉터리(/etc/crontab,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/cron.*,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/spool/cron/*)에는 시스템 주기 작업 및 관리자 스크립트가 등록됩니다. 비인가 일반 사용자가 이들 파일에 쓰기(Write) 권한을 가질 경우, root 권한으로 실행되는 스크립트를 변조하거나 악성 작업을 등록하여 시스템 권한을 상승(Privilege Escalation)시킬 수 있으므로 소유자 및 권한을 엄격히 제한해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-37 crontab 권한 점검 시작
CODE &quot;[ U-37 ] crontab 설정파일 권한 설정 미흡&quot;

# 주요 cron 설정 파일 및 스풀 디렉터리 대상 목록
CRON_FILES=&quot;/etc/crontab /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/cron.allow /etc/cron.deny /var/spool/cron /var/spool/cron/crontabs&quot;
VULN_CRON=&quot;&quot;

for f in $CRON_FILES; do
    if [ -e &quot;$f&quot; ]; then
        # ls 결과를 파싱하여 소유자 및 권한 문자열 추출
        OWNER=$(ls -ld &quot;$f&quot; | awk '{print $3}')
        PERMS=$(ls -ld &quot;$f&quot; | awk '{print $1}')
        # 권한 문자열의 9번째 자리(Others 쓰기 권한) 확인
        PERM_O_WRITE=$(echo &quot;$PERMS&quot; | cut -c 9)

        # 소유자가 root가 아니거나, 타사용자(Others)에게 쓰기(w) 권한이 있으면 취약으로 판단
        if [ &quot;$OWNER&quot; != &quot;root&quot; ] || [ &quot;$PERM_O_WRITE&quot; == &quot;w&quot; ]; then
            VULN_CRON=&quot;$VULN_CRON $f($OWNER, $PERMS)&quot;
        fi
    fi
done

if [ -n &quot;$VULN_CRON&quot; ]; then
    WARN &quot;crontab 관련 설정 파일의 소유자 또는 권한이 취약합니다. (권고: root 소유, 640 이하)&quot; &quot;취약 발견: [ $VULN_CRON ]&quot;
else
    OK &quot;crontab 관련 설정 파일들의 권한 및 소유자(root)가 안전하게 설정되어 있습니다.&quot; &quot;점검 대상 cron 파일 권한 양호&quot;
fi
FINISH &quot;[ U-37 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/spool/cron&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리 및 하위 개별 사용자 crontab 파일의 권한을 일단 권고 수치라는 이유로&lt;span&gt;&amp;nbsp;&lt;/span&gt;chmod 640을 일괄 적용했다가, 일반 사용자 계정이 자신의&lt;span&gt;&amp;nbsp;&lt;/span&gt;crontab -e&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어를 실행할 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;Permission denied&lt;span&gt;&amp;nbsp;&lt;/span&gt;에러가 발생하거나&lt;span&gt;&amp;nbsp;&lt;/span&gt;crond&lt;span&gt;&amp;nbsp;&lt;/span&gt;데몬이 파일 권한 문제로 일반 사용자의 스케줄링 작업을 거부하는 장애가 발생할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 테스트 절차&lt;/span&gt;: 권한 변경 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;crond&lt;span&gt;&amp;nbsp;&lt;/span&gt;서비스의 로그와 문법 정상 실행 여부를 검증합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;crontab -l
tail -n 20 /var/log/cron&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;운영 환경 대안&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/crontab&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/cron.d/&lt;span&gt;&amp;nbsp;&lt;/span&gt;하위 시스템 설정 파일은&lt;span&gt;&amp;nbsp;&lt;/span&gt;root:root 640&lt;span&gt;&amp;nbsp;&lt;/span&gt;이하로 고정하되,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/spool/cron/crontabs&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리와 개별 계정 cron 파일은 그룹 권한(crontab&lt;span&gt;&amp;nbsp;&lt;/span&gt;그룹 전용 수치)을 고려하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;600&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는 OS별 규격 표준(crontab&lt;span&gt;&amp;nbsp;&lt;/span&gt;소유 그룹 지정)에 맞춰 세심하게 조정해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;변경 대상 파일 백업 및 상태 기록&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;stat /etc/crontab /etc/cron.daily /var/spool/cron &amp;gt; cron_perm_backup.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;시스템 cron 파일 소유자 및 권한 수정&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dts&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 시스템 주요 cron 설정 파일 조치
chown root:root /etc/crontab /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/cron.allow /etc/cron.deny 2&amp;gt;/dev/null
chmod 640 /etc/crontab /etc/cron.allow /etc/cron.deny 2&amp;gt;/dev/null
chmod 750 /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly 2&amp;gt;/dev/null

# 사용자 crontab 스풀 디렉터리 조치
if [ -d /var/spool/cron ]; then
    chown -R root:root /var/spool/cron
    chmod 700 /var/spool/cron
    chmod 600 /var/spool/cron/* 2&amp;gt;/dev/null
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Cron 데몬 상태 확인&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl status crond || systemctl status cron&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-38] DoS 공격에 취약한 서비스 비활성화&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;echo(포트 7), discard(포트 9), daytime(포트 13), chargen(포트 19)은 초기 네트워크 진단 및 테스트를 위해 만들어진 레거시 UDP/TCP 서비스입니다. 공격자는 이러한 서비스를 악용해 두 서버 간의 포트를 상호 연결시켜 무한 루프 메시지를 유발하거나, UDP 반사 증폭 서비스 거부 공격(Reflective DoS / Fraggle Attack)의 도구로 악용하여 네트워크 트래픽을 고갈시킬 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-38 DoS 취약 서비스 점검 시작
CODE &quot;[ U-38 ] DoS 공격에 취약한 서비스 비활성화&quot;

# 취약 서비스 목록 정의
DOS_SVCS=&quot;echo discard daytime chargen&quot;
WEAK_DOS_SVCS=&quot;&quot;

# xinetd 환경에서 stream(TCP) / dgram(UDP) 서비스 활성화 검사
if [ -d /etc/xinetd.d ]; then
    for svc in $DOS_SVCS; do
        if grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; &quot;/etc/xinetd.d/$svc&quot; 2&amp;gt;/dev/null || \
           grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; &quot;/etc/xinetd.d/$svc-dgram&quot; 2&amp;gt;/dev/null || \
           grep -i -q &quot;disable[[:space:]]*=[[:space:]]*no&quot; &quot;/etc/xinetd.d/$svc-stream&quot; 2&amp;gt;/dev/null; then
            WEAK_DOS_SVCS=&quot;$WEAK_DOS_SVCS $svc&quot;
        fi
    done
# inetd.conf 환경 검사
elif [ -f /etc/inetd.conf ]; then
    for svc in $DOS_SVCS; do
        if grep -E -i &quot;^[[:space:]]*$svc&quot; /etc/inetd.conf &amp;gt;/dev/null; then
            WEAK_DOS_SVCS=&quot;$WEAK_DOS_SVCS $svc&quot;
        fi
    done
fi

# 활성화된 서비스 중복 제거
WEAK_DOS_SVCS=$(echo &quot;$WEAK_DOS_SVCS&quot; | xargs -n1 | sort -u | xargs)

# 최종 판단 및 결과 출력
if [ -n &quot;$WEAK_DOS_SVCS&quot; ]; then
    WARN &quot;서비스 거부 공격(DoS)에 악용될 수 있는 구형 네트워크 서비스가 활성화되어 있습니다.&quot; &quot;취약 활성 서비스: [ $WEAK_DOS_SVCS ]&quot;
else
    OK &quot;DoS 공격에 취약한 구형 서비스(echo, discard, daytime, chargen)가 비활성화되어 있습니다.&quot; &quot;해당 데몬 차단됨&quot;
fi
FINISH &quot;[ U-38 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 고전적인 기업 내부 망 연동 솔루션 또는 공장 자동화/계측 장비(PLC) 연동 시스템 중 서버의 헬스체크를 핑(ICMP) 대신 7번(echo)이나 13번(daytime) 포트 소켓 오픈 상태로 체크하도록 개발된 하드웨어 통신 모듈이 존재하는 경우가 있습니다. 해당 포트를 사전 확인 없이 차단하면 센서 통신이나 서버 상태 점검 트래픽이 차단되어 비즈니스 서비스 장애로 이어질 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;검증 테스트 절차&lt;/span&gt;: 해당 포트들이 실제로 바인딩되어 통신 중인지 선제 점검합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;coq&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;ss -tulpn | grep -E ':7\b|:9\b|:13\b|:19\b'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;운영 환경 대안&lt;/span&gt;: 현대적 환경에서는 네트워크 상태 헬스체크를 위해 전용 Monitoring Agent, ICMP Ping, 또는 안전한 HTTP/HTTPS API 헬스체크 포트를 사용하는 것이 표준입니다. 레거시 시스템 연동으로 차단이 불가능한 경우 방화벽(iptables, firewalld)을 사용하여 소스 IP를 특정 관리 대상 디바이스로 엄격히 제한(ACL)해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;xinetd 설정 파일 백업 및 비활성화&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;for svc in echo discard daytime chargen; do
    for file in /etc/xinetd.d/$svc /etc/xinetd.d/$svc-stream /etc/xinetd.d/$svc-dgram; do
        if [ -f &quot;$file&quot; ]; then
            cp -v &quot;$file&quot; &quot;$file.bak&quot;
            sed -i 's/disable[[:space:]]*=[[:space:]]*no/disable = yes/g' &quot;$file&quot;
        fi
    done
done&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;inetd 사용 시스템인 경우 (/etc/inetd.conf 수정)&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;cp -v /etc/inetd.conf /etc/inetd.conf.bak
sed -i -E 's/^(echo|discard|daytime|chargen)/#\1/g' /etc/inetd.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;데몬 재시작 및 포트 미사용 확인&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;coq&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;systemctl reload xinetd 2&amp;gt;/dev/null
ss -tulpn | grep -E ':7\b|:9\b|:13\b|:19\b'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 통합 점검 스크립트의 한계점 및 보완 코드 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.1. 기존 점검 스크립트의 한계점 분석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Include 분할 설정 디렉터리 미인식 (*.d&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;RHEL 8/9, Ubuntu 22.04/24.04 등 최신 OS는 단일 설정 파일(vsftpd.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;crontab) 외에&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/cron.d/,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/vsftpd/conf.d/&lt;span&gt;&amp;nbsp;&lt;/span&gt;등 하위 분할 디렉터리를 포함하는 형태를 취합니다. 기존 스크립트는 지정된 단일 경로만 검사하므로 하위 디렉터리에 정의된 취약 설정을 누락할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Systemd Socket Activation 검사 한계&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;최신 리눅스는 xinetd 대신 systemd의&lt;span&gt;&amp;nbsp;&lt;/span&gt;.socket&lt;span&gt;&amp;nbsp;&lt;/span&gt;단위를 사용해 네트워크 접속 시에만 데몬을 깨웁니다. 데몬 프로세스명(ps -ef)만 검색하는 로직은&lt;span&gt;&amp;nbsp;&lt;/span&gt;is-active&lt;span&gt;&amp;nbsp;&lt;/span&gt;상태의 socket을 감지하지 못해 오탐(양호로 판정)을 발생시킬 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.2. 정밀 진단을 위한 보완 코드 스니펫&lt;/h3&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기존 진단 알고리즘을 보완하여 Include 디렉터리 및 Systemd Socket 상태까지 정밀 검사할 수 있는 핵심 코드 스니펫입니다.&lt;/p&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [보완 스니펫] Systemd Socket 및 cron.d 하위 디렉터리 정밀 통합 검사 로직
CRON_D_VULN=$(find /etc/cron.d /etc/crontab /var/spool/cron/crontabs -maxdepth 2 -type f \( ! -user root -o -perm -002 \) 2&amp;gt;/dev/null)
LEGACY_SOCKETS=$(systemctl list-units --type=socket --state=active 2&amp;gt;/dev/null | grep -E 'finger|rsh|rlogin|rexec|echo|discard|daytime|chargen')

if [ -n &quot;$CRON_D_VULN&quot; ] || [ -n &quot;$LEGACY_SOCKETS&quot; ]; then
    echo &quot;[경고] 분할 설정(cron.d) 또는 Systemd 활성 소켓 내에 취약한 항목이 감지되었습니다.&quot;
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #주요정보통신기반시설 #취약점점검 #서버보안 #보안가이드 #크론탭권한 #서비스비활성화 #리눅스취약점 #시스템보안 #보안컨설팅 #인프라보안 #서버취약점진단</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/116</guid>
      <comments>https://ismsp-case.tistory.com/116#entry116comment</comments>
      <pubDate>Mon, 14 Sep 2026 14:43:29 +0900</pubDate>
    </item>
    <item>
      <title>폐기 예정 서버를 일반 창고에 보관해도 될까?</title>
      <link>https://ismsp-case.tistory.com/112</link>
      <description>&lt;h1&gt;폐기 예정 서버를 일반 창고에 보관해도 될까?&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;mdash; ISMS-P 2.4.1 보호구역 지정과 불용장비 물리보안&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가상 시나리오 안내&lt;/b&gt;&lt;br /&gt;이 글은 ISMS-P 인증기준을 학습하기 위한 가상 시나리오를 기반으로 작성한 사례 분석이다. 기업명, 담당자, 장비명, 문서번호, 수량 및 운영환경은 이해를 돕기 위해 가공하였다. 실제 심사 결과나 특정 기업의 결함 사례를 의미하지 않는다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 상황부터 살펴보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보시스템을 교체하거나 IDC를 이전할 때 보안 담당자가 놓치기 쉬운 구간이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &lt;b&gt;장비를 철거한 이후 폐기하기 전까지의 임시 보관 단계&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 중인 서버는 전산실이나 IDC 등 보호구역에서 관리하기 때문에 물리적 보안 통제가 비교적 명확하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 장비를 철거하는 순간 상황이 달라진다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 종료 &amp;rarr; 장비 철거 &amp;rarr; 본사 반입 &amp;rarr; 임시 보관 &amp;rarr; 폐기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 서버가 더 이상 운영되지 않는다는 이유로 기존의 물리적 보안 통제가 함께 사라지는 경우가 있다.&lt;/p&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서는 구형 VPN 서버를 철거한 이후 일반 기자재 창고에 임시 보관한 상황을 살펴본다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 기업 개요 및 가상 운영 시나리오&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기업명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 및 기업 고객을 대상으로 암호화 통신 VPN 서비스를 제공하고 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인정보 보유 규모&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 120만 건의 개인정보를 보유하고 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인프라 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 분당 IDC의 Bare-metal 기반 VPN 인프라를 서울 가산 IDC 및 AWS 하이브리드 환경으로 전환하고 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 담당자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프라운영팀 B 과장&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 구형 VPN 서버 철거 과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 기존 분당 IDC의 구형 VPN 노드를 신규 인프라로 이전하면서 사용이 종료된 VPN Gateway 서버 15대를 철거하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 서버의 로컬 디스크에는 과거 가입자의 VPN 접속 세션과 관련된 로그 및 VPN 서비스 운영에 사용했던 암호화 설정값 등이 남아 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 아직 폐기 또는 저장매체 삭제가 완료되지 않은 상태였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 전문 폐기 업체를 통해 디스크 천공 및 자성소거를 진행하기로 계약하였으나, 업체의 작업 일정이 약 4주 뒤로 예정되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 따라 철거한 서버 15대를 본사로 회수하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 그 다음 단계에서 발생했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. 서버는 어디에 보관되었을까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당초 서버는 본사 전산실에 보관할 예정이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 전산실 공간이 부족하다는 이유로 본사 4층 기자재 창고를 임시 보관 장소로 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 창고의 물리적 통제 현황은 다음과 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;현황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;보호구역 지정&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;일반구역&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;출입통제&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;수동 열쇠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;열쇠 관리&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;인프라운영팀 공용 서랍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;RFID 출입통제&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;미설치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;생체인식&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;미설치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;CCTV&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;미설치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;출입기록&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;별도 기록 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;보관기간&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;약 4주&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;보관대상&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;폐기 예정 VPN 서버 15대&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 현장 인터뷰&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심사원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분당 IDC에서 철거한 구형 VPN Gateway 서버의 현황과 폐기 절차는 어떻게 관리하고 있습니까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B 과장 / 인프라운영팀&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구형 Bare-metal 서버 15대는 지난주 야간 작업을 통해 철거했고 본사로 모두 회수했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폐기 업체의 일정에 따라 다음 달 중순에 디스크 천공 및 자성소거를 진행할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 본사 4층 기자재 창고에 보관하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심사원&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 창고의 출입통제는 어떻게 적용하고 있습니까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B 과장 / 인프라운영팀&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미닫이문에 열쇠 잠금장치를 사용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열쇠는 인프라운영팀 공용 서랍에 보관하고 필요할 때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RFID나 지문인식 장치는 설치되어 있지 않고 CCTV도 없습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 현장 증적에서 확인된 내용&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;증적 1. 본사 출입통제시스템 설정&lt;/h2&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;company_code&quot;: &quot;A-VPN-01&quot;,
  &quot;facility_location&quot;: &quot;Headquarters 4F&quot;,
  &quot;zone_configurations&quot;: [
    {
      &quot;zone_id&quot;: &quot;ZONE-4F-SEC-01&quot;,
      &quot;zone_name&quot;: &quot;본사 4층 주 전산실&quot;,
      &quot;security_level&quot;: &quot;High&quot;,
      &quot;access_control_device&quot;: &quot;Biometric-FP-02&quot;,
      &quot;cctv_monitoring&quot;: true,
      &quot;logs_retained_days&quot;: 180
    },
    {
      &quot;zone_id&quot;: &quot;ZONE-4F-OFF-01&quot;,
      &quot;zone_name&quot;: &quot;일반 사무 공간&quot;,
      &quot;security_level&quot;: &quot;Low&quot;,
      &quot;access_control_device&quot;: &quot;RFID-Card-04&quot;,
      &quot;cctv_monitoring&quot;: true,
      &quot;logs_retained_days&quot;: 90
    },
    {
      &quot;zone_id&quot;: &quot;ZONE-4F-STR-09&quot;,
      &quot;zone_name&quot;: &quot;4층 기자재 및 예비품 창고&quot;,
      &quot;security_level&quot;: &quot;None&quot;,
      &quot;access_control_device&quot;: &quot;Manual-Key-Lock&quot;,
      &quot;cctv_monitoring&quot;: false,
      &quot;logs_retained_days&quot;: 0
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증적을 보면 동일한 4층에 위치하더라도 공간별 보호 수준이 다르게 설정되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전산실에는 생체인식과 CCTV가 적용되어 있고 일반 사무공간에는 RFID와 CCTV가 적용되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 구형 VPN 서버가 보관된 기자재 창고에는 별도의 전자적 출입통제나 영상 모니터링이 적용되지 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 증적 2. 장비 임시 보관 기안문&lt;/h1&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;구형 VPN 서버 15대 철거&lt;/li&gt;
&lt;li&gt;본사 4층 기자재 창고로 이동&lt;/li&gt;
&lt;li&gt;폐기 작업은 약 4주 후 예정&lt;/li&gt;
&lt;li&gt;서버 디스크를 탈거하지 않고 본체 상태로 보관&lt;/li&gt;
&lt;li&gt;창고 바닥의 파레트 위에 적재&lt;/li&gt;
&lt;li&gt;수동 열쇠를 이용한 출입관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 부분은 &lt;b&gt;폐기 예정이라는 사실과 폐기가 완료되었다는 사실을 구분하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폐기 업체의 작업 일정이 잡혀 있다는 것만으로 서버에 저장된 정보가 안전하게 제거된 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 폐기 완료 전까지는 해당 서버와 저장매체를 별도의 보호 대상으로 관리할 필요가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. ISMS-P 2.4.1 관점에서 무엇을 확인해야 할까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사례에서 가장 직접적으로 연결되는 기준은 &lt;b&gt;2.4.1 보호구역 지정&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.4.1은 물리적&amp;middot;환경적 위협으로부터 개인정보 및 중요정보, 문서, 저장매체, 주요 설비 및 시스템 등을 보호하기 위해 물리적 보호구역을 지정하고 구역별 보호대책을 수립&amp;middot;이행하도록 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 심사에서는 단순히 다음과 같이 질문하는 것보다 한 단계 더 들어갈 필요가 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;전산실에 출입통제가 설치되어 있는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다는&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;개인정보 또는 중요정보가 저장된 자산이 현재 어느 장소에 존재하고 있으며, 해당 장소가 조직의 보호구역 지정기준에 따라 적절하게 분류되고 있는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 확인하는 것이 핵심이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 이 사례의 핵심 문제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례의 핵심은 CCTV가 없다는 사실 하나가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;보호대상 자산의 상태가 변경되었는데 물리적 보호체계가 이를 따라가지 못했다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 상태는 다음과 같았다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;[운영 중]
VPN 서버
    &amp;darr;
IDC 전산실
    &amp;darr;
물리적 출입통제
    &amp;darr;
CCTV 및 출입기록
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 철거 이후에는 다음과 같이 변경되었다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[운영 종료]
VPN 서버
    &amp;darr;
IDC에서 철거
    &amp;darr;
본사로 이동
    &amp;darr;
일반 기자재 창고
    &amp;darr;
수동 열쇠
    &amp;darr;
출입기록 및 CCTV 없음
    &amp;darr;
폐기 예정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;장비의 운영 상태가 변경되면서 기존의 물리적 통제가 함께 해제되었지만 새로운 보관 단계에 대한 보호대책이 마련되지 않은 상태&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 결함보고서 형태로 정리하면&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[결함] 불용 서버의 임시 보관 단계에서 물리적 보호구역 및 접근통제가 적절하게 적용되지 않음&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관련 기준&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.4.1 보호구역 지정&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영현황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 기존 분당 IDC의 VPN 인프라를 신규 환경으로 전환하면서 구형 VPN Gateway 서버 15대를 철거하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 서버는 폐기 업체의 작업 일정에 따라 약 4주간 본사에 임시 보관할 예정이며, 폐기 완료 전까지 저장매체가 장착된 상태로 관리되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 회수한 서버는 본사 4층 일반 기자재 창고에 보관되고 있으며, 해당 장소에는 전자적 출입통제 및 CCTV가 적용되지 않고 수동 열쇠 방식으로만 출입이 관리되고 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;확인된 사항&lt;/h3&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;기존 전산실의 물리적 보호통제가 해제된 이후 별도의 보호구역 지정이 이루어지지 않음&lt;/li&gt;
&lt;li&gt;일반 기자재 창고에 서버를 보관하고 있으나 해당 장소의 보호수준이 서버에 저장된 정보의 중요도를 충분히 반영하고 있는지 확인되지 않음&lt;/li&gt;
&lt;li&gt;공용 열쇠를 사용하고 있어 실제 출입자 추적이 어려움&lt;/li&gt;
&lt;li&gt;CCTV가 없어 보관기간 중 물리적 접근 여부를 사후 확인하기 어려움&lt;/li&gt;
&lt;li&gt;불용 장비의 반입&amp;middot;보관&amp;middot;폐기 단계별 물리보안 절차가 명확하게 연계되어 있지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. 왜 단순한 '창고 보관' 문제가 아닐까?&lt;/h1&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;가 중요하다.&lt;/p&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;가입자 접속 세션 로그&lt;/li&gt;
&lt;li&gt;IP 주소 및 접속시간&lt;/li&gt;
&lt;li&gt;VPN 접속 관련 식별정보&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 일부는 개인정보에 해당할 수 있고, 일부는 개인정보가 아니더라도 시스템 보안에 영향을 줄 수 있는 중요정보다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &quot;서버는 이미 폐기 대상이라 중요하지 않다&quot;는 판단만으로 물리적 보호 수준을 낮추는 것은 적절하지 않을 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. 개인정보 보호법 제29조와의 관계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제29조는 개인정보가 유출되지 않도록 안전성 확보에 필요한 기술적&amp;middot;관리적 및 물리적 조치를 하도록 규정하고 있다.&lt;/p&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;&lt;/p&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;어떤 개인정보가 저장되어 있는지&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;li&gt;조직의 물리보안 정책에서 해당 자산을 어떻게 분류하고 있는지&lt;/li&gt;
&lt;li&gt;위험평가 결과에 따라 어떤 보호대책을 선정했는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;법적 결론보다 실제 보호대책과 위험관리 체계의 적정성을 확인하는 접근이 필요하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. 근본 원인은 '폐기 프로세스'에 있었다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현장에서 흔히 발생하는 문제는 폐기 자체의 절차만 관리하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 절차를 가지고 있을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;폐기 대상 장비 선정
      &amp;darr;
폐기 업체 작업 요청
      &amp;darr;
디스크 천공
      &amp;darr;
폐기 완료
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는 그 사이에 상당한 시간이 존재한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;운영 종료
   &amp;darr;
장비 철거
   &amp;darr;
장비 이동
   &amp;darr;
임시 보관
   &amp;darr;
폐기 대기
   &amp;darr;
저장매체 삭제/파쇄
   &amp;darr;
폐기 완료
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 불용 장비에 대한 물리보안 절차는 &lt;b&gt;폐기 작업 자체가 아니라 폐기 완료까지의 전체 생애주기&lt;/b&gt;를 포함해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. 개선 방향&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 가장 먼저 해야 할 일은 무조건 CCTV나 지문인식 장치를 설치하는 것이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b&gt;불용 장비의 보안 상태를 다시 정의하는 것&lt;/b&gt;이 필요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 불용 장비를 자산관리 대상으로 유지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 종료와 동시에 자산관리 대상에서 제외하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 정보를 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 210px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;관리항목&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;장비 식별번호&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;서버 자산번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;장비명&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;VPN Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;보관 위치&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;본사 4층 Room 402&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;저장매체 상태&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;장착/탈거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;정보 삭제 여부&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;미완료/완료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;폐기 예정일&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;YYYY-MM-DD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;폐기 업체&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;업체명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;폐기 완료일&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;YYYY-MM-DD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;폐기 증적&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 21px;&quot;&gt;확인서/사진 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 임시 보관 장소를 보호구역 기준에 따라 검토&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장비에 중요정보가 남아 있다면 기존 일반 창고의 보호수준이 적절한지 검토한다.&lt;/p&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;제한된 인원만 출입 허용&lt;/li&gt;
&lt;li&gt;별도 잠금장치 적용&lt;/li&gt;
&lt;li&gt;출입자 기록 관리&lt;/li&gt;
&lt;li&gt;CCTV 적용&lt;/li&gt;
&lt;li&gt;보관구역 표지&lt;/li&gt;
&lt;li&gt;장비 반출입 승인&lt;/li&gt;
&lt;li&gt;정기적인 보관 상태 점검&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 특정 장비를 설치하는 것 자체가 아니라 &lt;b&gt;자산의 중요도와 위험에 맞는 보호수준을 결정하고 실제로 운영하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 불용 장비 반출입 절차를 추가한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 물리보안 절차가 전산실 중심으로 설계되어 있다면 불용 장비의 이동 단계가 누락될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 별도 절차를 구성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[폐기 대상 지정]
       &amp;darr;
[저장정보 확인]
       &amp;darr;
[장비 반출 승인]
       &amp;darr;
[보관 장소 지정]
       &amp;darr;
[보관구역 접근권한 설정]
       &amp;darr;
[임시 보관]
       &amp;darr;
[폐기 업체 인계]
       &amp;darr;
[저장매체 삭제/파쇄]
       &amp;darr;
[폐기 결과 확인]
       &amp;darr;
[자산관리대장 종료]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구성하면 물리보안과 자산관리, 개인정보보호, 폐기 절차가 하나의 흐름으로 연결된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 개선 후 증적은 무엇을 남겨야 할까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 &quot;조치했다&quot;는 설명보다 &lt;b&gt;조치 사실을 확인할 수 있는 증적&lt;/b&gt;이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 자료를 관리할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장비 관련&lt;/h3&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;장비별 자산번호&lt;/li&gt;
&lt;li&gt;저장매체 상태&lt;/li&gt;
&lt;li&gt;보관 위치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;물리보안 관련&lt;/h3&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;출입권한 설정 내역&lt;/li&gt;
&lt;li&gt;출입기록&lt;/li&gt;
&lt;li&gt;CCTV 녹화 상태&lt;/li&gt;
&lt;li&gt;보관구역 사진&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;폐기 관련&lt;/h3&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;폐기 업체 계약서&lt;/li&gt;
&lt;li&gt;장비 인계 기록&lt;/li&gt;
&lt;li&gt;저장매체 삭제 또는 파쇄 결과&lt;/li&gt;
&lt;li&gt;폐기확인서&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;관리체계 관련&lt;/h3&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;물리보안 지침&lt;/li&gt;
&lt;li&gt;자산관리 기준&lt;/li&gt;
&lt;li&gt;정기점검 결과&lt;/li&gt;
&lt;li&gt;개선조치 결과보고서&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 심사에서 추가로 확인할 질문&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 상황에서는 다음 질문을 이어서 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q1. 서버가 폐기 대상이라는 것을 어떻게 확인하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 담당자의 판단인지, 자산관리시스템에서 폐기 상태로 관리되는지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q2. 폐기 전 저장매체의 정보 삭제 여부를 확인하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폐기 업체에 넘기기 전까지 저장정보가 남아 있는지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q3. 임시 보관 장소는 어떤 기준으로 선정하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전산실 공간 부족 등의 운영상 사유만으로 결정하는지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q4. 임시 보관 중 누가 출입할 수 있는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 공용 열쇠처럼 실제 출입자를 특정하기 어려운 방식인지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q5. 장비 이동 기록이 존재하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDC에서 본사로 이동한 사실과 보관 위치를 추적할 수 있는지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q6. 폐기 완료 여부를 누가 검증하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폐기 업체의 작업 결과를 담당자가 확인하고 자산관리 상태를 종료하는지 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. 이번 사례에서 놓치기 쉬운 부분&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;① '운영 종료'와 '정보 폐기 완료'는 다르다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 포인트다.&lt;/p&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;까지 고려해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;② 일반 창고라고 해서 무조건 결함은 아니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보호구역의 형태와 통제수준은 조직의 환경과 자산의 중요도에 따라 결정될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 심사에서는&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;CCTV가 없으므로 결함&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라고 단순하게 접근하기보다,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;해당 장소가 조직의 보호구역 지정기준에 따라 적절하게 분류되었으며, 보관 중인 자산의 중요도에 적합한 보호대책이 적용되고 있는가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 확인하는 것이 더 정확하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;③ 폐기 업체에 넘기는 순간에도 통제가 필요하다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리보안은 사내 창고에서 끝나지 않는다.&lt;/p&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;반출 승인&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;li&gt;작업 완료 증적&lt;/li&gt;
&lt;li&gt;폐기 완료 여부 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;사내 보관 &amp;rarr; 외부 반출 &amp;rarr; 폐기 완료&lt;/b&gt;까지 하나의 통제 흐름으로 봐야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;19. 실무 점검 체크리스트&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;불용 장비 목록을 관리하고 있는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영 종료 후에도 저장매체 정보를 관리하는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;폐기 전 임시 보관 장소가 지정되어 있는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보관 장소의 보호구역 등급이 적절한가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보관 장소의 출입권한이 제한되어 있는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실제 출입자를 추적할 수 있는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장비 반입&amp;middot;반출 기록이 존재하는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;폐기 업체 인계 절차가 존재하는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장매체 삭제 또는 파쇄 결과를 확인하는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;폐기 완료 후 자산관리 상태를 종료하는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관련 증적을 보관하고 있는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;물리보안 지침에 불용 장비 관리 절차가 반영되어 있는가?&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 정리&lt;/h1&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;이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례의 핵심은 기자재 창고에 서버를 보관했다는 사실 자체가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;운영 중인 장비를 철거하면서 기존의 물리적 보호통제는 해제했지만, 폐기 완료 전까지 적용할 새로운 보호통제를 정의하지 않았다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 불용 장비 관리 절차를 설계할 때는 다음의 흐름을 함께 고려하는 것이 좋다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;운영 종료
   &amp;darr;
철거
   &amp;darr;
반출
   &amp;darr;
임시 보관
   &amp;darr;
폐기 업체 인계
   &amp;darr;
저장매체 삭제/파쇄
   &amp;darr;
폐기 완료
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISMS-P 2.4.1을 실무에 적용할 때도 전산실이나 서버실의 출입통제만 확인할 것이 아니라, &lt;b&gt;개인정보 및 중요정보가 존재하는 물리적 자산이 생애주기 동안 어느 장소에 존재하는지, 그리고 각 단계에서 적절한 보호구역과 보호대책이 유지되는지&lt;/b&gt;까지 살펴볼 필요가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정보보호 및 개인정보보호 관리체계(ISMS-P) 인증기준 안내서&lt;/li&gt;
&lt;li&gt;ISMS-P 인증기준 2.4.1 보호구역 지정&lt;/li&gt;
&lt;li&gt;개인정보 보호법 제29조(안전조치의무)&lt;/li&gt;
&lt;li&gt;개인정보의 안전성 확보조치 기준&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>#ISMS_P #인증심사 #KISA #보호구역지정 #2.4.1 #보안결함 #VPN #출입통제시스템 #보안담당자 #물리보안</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/112</guid>
      <comments>https://ismsp-case.tistory.com/112#entry112comment</comments>
      <pubDate>Mon, 14 Sep 2026 10:32:05 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검 요약] 파일 및 디렉터리 관리(U-29 ~ U-33) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/109</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ttt.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bizbU8/dJMcabS8lMD/7HcMGJHV0voq9Tn5aiaa31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bizbU8/dJMcabS8lMD/7HcMGJHV0voq9Tn5aiaa31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bizbU8/dJMcabS8lMD/7HcMGJHV0voq9Tn5aiaa31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbizbU8%2FdJMcabS8lMD%2F7HcMGJHV0voq9Tn5aiaa31%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;1672&quot; height=&quot;941&quot; data-filename=&quot;ttt.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파일 및 디렉터리 관리 분야의 주요 점검 항목인 U-29부터 U-33까지의 보안 취약점을 완벽 분석합니다. 본 가이드에서는 hosts.lpd, UMASK, 홈 디렉터리 권한 및 숨김 파일 스캔을 위한 자동 진단 스크립트 해설과 함께 현장 실무 경험을 반영한 안전한 조치 및 백업 가이드를 안내해 드립니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 파일 및 디렉토리 관리 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 25.3488%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 17.093%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13953%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-29&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 25.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;hosts.lpd 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 17.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/hosts.lpd&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;파일 소유자가 root이고, 권한이 600 이하인 경우 (미존재 시 양호)&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13953%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-30&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 25.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;UMASK 설정 관리&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 17.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/profile,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/bashrc등&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;시스템 UMASK 값이 022 이상으로 설정되어 있는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13953%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-31&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 25.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;홈 디렉토리 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 17.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/passwd내 홈 디렉터리&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;홈 디렉터리 소유자가 해당 계정(또는 root)이고 타사용자 쓰기 권한이 없는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13953%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-32&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 25.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;홈 디렉토리로 지정한 디렉토리의 존재 관리&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 17.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/passwd내 홈 디렉터리&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;대화형 계정의 홈 디렉터리가 실제로 시스템에 존재할 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13953%;&quot; data-streamdown=&quot;table-cell&quot;&gt;하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 7.09302%;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-33&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 25.3488%;&quot; data-streamdown=&quot;table-cell&quot;&gt;숨겨진 파일 및 디렉토리 검색 및 제거&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 17.093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/tmp,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/tmp,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/dev/shm&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 42.2093%;&quot; data-streamdown=&quot;table-cell&quot;&gt;임시 디렉터리 내 불필요하거나 의심스러운 숨김 파일이 없는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13953%;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-29] hosts.lpd 파일 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;hosts.lpd&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일은 라인 프린터 데몬(LPD)을 사용할 때 원격 프린트 요청을 허용할 호스트를 정의하는 파일입니다. 비인가자가 해당 파일을 변조할 경우 프린터 서비스를 악용한 비인가 접속이나 시스템 무단 이용의 통로가 될 수 있으므로, 소유자를 root로 제한하고 권한을 600 이하로 제한해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-29 점검 시작
CODE &quot;[ U-29 ] hosts.lpd 파일 소유자 및 권한 설정&quot;

# [상세 해설]: /etc/hosts.lpd 파일 존재 여부를 검사합니다. 프린트 서비스를 사용하지 않으면 미존재가 일반적입니다.
if [ -f /etc/hosts.lpd ]; then
    # [상세 해설]: awk 명령어를 사용하여 3번째 필드인 파일 소유자 정보만 추출합니다.
    OWNER=$(ls -l /etc/hosts.lpd | awk '{print $3}')
    
    # [상세 해설]: ls -l 출력 결과의 1번째 필드(권한 문자열: 예 -rw-------)를 추출합니다.
    PERMS=$(ls -l /etc/hosts.lpd | awk '{print $1}')
    
    # [상세 해설]: cut 명령어로 그룹 권한(5~7번째 문자)과 타사용자 권한(8~10번째 문자)을 분리합니다.
    PERM_G=$(echo &quot;$PERMS&quot; | cut -c 5-7)
    PERM_O=$(echo &quot;$PERMS&quot; | cut -c 8-10)

    # [상세 해설]: 소유자가 root이고 그룹 및 타사용자 권한이 모두 '---'(접근 불가)인지 검증합니다. (600 이하)
    if [ &quot;$OWNER&quot; == &quot;root&quot; ] &amp;amp;&amp;amp; [[ &quot;$PERM_G&quot; == &quot;---&quot; &amp;amp;&amp;amp; &quot;$PERM_O&quot; == &quot;---&quot; ]]; then
        OK &quot;/etc/hosts.lpd 파일 소유자가 root이고, 권한이 600 이하입니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    else
        WARN &quot;/etc/hosts.lpd 파일의 소유자가 root가 아니거나, 권한이 600을 초과합니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    fi
else
    # [상세 해설]: 파일이 없으면 불필요한 프린팅 허용 파일이 없는 것이므로 진단 기준상 즉시 양호 처리합니다.
    OK &quot;/etc/hosts.lpd 파일이 존재하지 않습니다. (프린트 서비스 미사용)&quot; &quot;파일 미존재 (안전)&quot;
fi
FINISH &quot;[ U-29 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 환경 적용 고려사항&lt;/span&gt;: 현대 기업 운영 환경에서는 CUPS 표준 서버를 이용하므로 구형 LPR 서비스용&lt;span&gt;&amp;nbsp;&lt;/span&gt;hosts.lpd&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일은 거의 사용되지 않습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;작업 장애 사례&lt;/span&gt;: 레거시 메인프레임 출력 시스템 연동 서버에서 소유권을 일반 계정으로 넘겨 운영하다가 진단 가이드 조치를 위해 일괄&lt;span&gt;&amp;nbsp;&lt;/span&gt;chown root조치를 수행한 후, 프린트 출력 서비스 프로세스가 해당 파일 읽기에 실패하여 야간 출력 작업이 중단된 사례가 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전한 테스트 절차&lt;/span&gt;: 파일 변경 전 프린터 관련 데몬(lpd, cups)이 실행 중인지&lt;span&gt;&amp;nbsp;&lt;/span&gt;ps -ef | grep lpd로 점검한 뒤, 서비스를 미사용 중이라면 파일을 완전히 삭제하거나 600 권한으로 전환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 수동 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 파일 백업 (백업 디렉터리 생성 및 복사)
mkdir -p /backup/security_fix
cp -p /etc/hosts.lpd /backup/security_fix/hosts.lpd.$(date +%Y%m%d) 2&amp;gt;/dev/null

# 2. 소유권 및 권한 변경 (파일이 존재하는 경우)
if [ -f /etc/hosts.lpd ]; then
    chown root /etc/hosts.lpd
    chmod 600 /etc/hosts.lpd
fi

# 3. 설정 확인
ls -l /etc/hosts.lpd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-30] UMASK 설정 관리&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;UMASK(User Mask)는 신규 파일이나 디렉터리를 생성할 때 기본으로 차단할 권한을 지정하는 설정입니다. UMASK 값이 000 또는 002와 같이 너무 낮게 설정되어 있으면 새로 생성되는 파일에 타사용자의 쓰기 권한이 부여되어 주요 데이터 변조 및 악성코드 주입 공격에 노출될 수 있으므로 minimum 022 이상(022, 027, 077 등)으로 통제해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-30 점검 시작
CODE &quot;[ U-30 ] UMASK 설정 관리&quot;

# [상세 해설]: /etc/profile 파일에서 주석을 제외한 명시적인 umask 지시어 항목 중 마지막으로 적용된 값을 추출합니다.
UMASK_VAL=$(grep -E -i &quot;^[[:space:]]*umask&quot; /etc/profile | tail -n 1 | awk '{print $2}')

# [상세 해설]: umask 설정값이 존재하는지 확인합니다.
if [ -n &quot;$UMASK_VAL&quot; ]; then
    # [상세 해설]: 문자열 비교를 통해 보안 권고 수준(022, 027, 077)에 부합하는지 판단합니다.
    if [[ &quot;$UMASK_VAL&quot; == &quot;022&quot; || &quot;$UMASK_VAL&quot; == &quot;027&quot; || &quot;$UMASK_VAL&quot; == &quot;077&quot; ]]; then
        OK &quot;시스템 UMASK 값이 안전하게 설정되어 있습니다.&quot; &quot;/etc/profile 내 umask = $UMASK_VAL (022 이상)&quot;
    else
        WARN &quot;시스템 UMASK 값이 022보다 낮게 설정되어 보안상 취약합니다.&quot; &quot;현재 umask = $UMASK_VAL (권고: 022 이상)&quot;
    fi
else
    # [상세 해설]: 명시적 umask 미설정 시 OS 기본 세팅값(000 등)이 적용될 수 있어 취약으로 처리합니다.
    WARN &quot;/etc/profile 내에 UMASK 설정이 존재하지 않습니다. (기본값 적용 위험)&quot; &quot;명시적인 umask 지시어 누락&quot;
fi
FINISH &quot;[ U-30 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무자의 실수 요인&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/profile만 수정하고 CI/CD 빌드 계정이나 애플리케이션 생성 계정의&lt;span&gt;&amp;nbsp;&lt;/span&gt;.bashrc&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/bashrc에 개별 지정된 umask 값을 생략하는 경우가 많습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 장애 사례 (WAS 및 배포 파이프라인)&lt;/span&gt;: 웹 애플리케이션 및 파일 업로드 서버에 보안 강화를 이유로 전역 UMASK를&lt;span&gt;&amp;nbsp;&lt;/span&gt;027&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;077로 일괄 적용할 경우, 웹서버(Nginx/Apache -&lt;span&gt;&amp;nbsp;&lt;/span&gt;nginx&lt;span&gt;&amp;nbsp;&lt;/span&gt;계정)가 WAS(Tomcat -&lt;span&gt;&amp;nbsp;&lt;/span&gt;tomcat&lt;span&gt;&amp;nbsp;&lt;/span&gt;계정)가 생성한 파일 및 세션 폴더를 읽지 못해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;HTTP 403 Forbidden 및 500 Internal Server Error&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;장애가 지속적으로 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대안 설정 기법&lt;/span&gt;: 웹 서비스나 공용 파일 업로드 디렉터리를 운영하는 인프라에서는 전역 UMASK를&lt;span&gt;&amp;nbsp;&lt;/span&gt;022로 유지하고, 금융 및 개인정보 전용 인프라 디렉터리에만 그룹 계정별 개별 UMASK(027&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;077)를 적용해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 수동 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 파일 백업
cp -p /etc/profile /backup/security_fix/profile.$(date +%Y%m%d)

# 2. /etc/profile 내 기존 umask 설정 확인 및 수정
if grep -E -q -i &quot;^[[:space:]]*umask&quot; /etc/profile; then
    # 기존 umask 구문 주석 처리 후 새 umask 입력
    sed -i 's/^[[:space:]]*umask/# &amp;amp;/' /etc/profile
fi

# 글로벌 안전 권고 umask 추가
echo &quot;umask 022&quot; &amp;gt;&amp;gt; /etc/profile

# 3. 문법 검사 및 현재 세션 테스트 (shell syntax test)
bash -n /etc/profile
source /etc/profile
umask&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-31] 홈 디렉토리 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 홈 디렉터리에 타사용자(Others)의 쓰기(w) 권한이 부여되어 있다면, 비인가자가 타인의 홈 디렉터리에 접근하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;.bashrc,&lt;span&gt;&amp;nbsp;&lt;/span&gt;.ssh/authorized_keys&lt;span&gt;&amp;nbsp;&lt;/span&gt;등 환경 설정 파일 및 인증 열쇠를 변조할 수 있습니다. 이를 통해 권한 상승 및 타 계정 도용(Account Takeover)이 가능해지므로 소유자 외 쓰기 권한을 제한해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-31 점검 시작
CODE &quot;[ U-31 ] 홈 디렉토리 소유자 및 권한 설정&quot;

VULN_HOMES=&quot;&quot;
CHECK_COUNT=0

# [상세 해설]: /etc/passwd의 계정명, 홈디렉터리, 쉘 정보를 한 줄씩 읽어 통제 루프를 실행합니다.
while IFS=: read -r user _ _ _ _ home shell; do
    # [상세 해설]: nologin, false, sync 등 시스템 데몬을 제외하고 실제 대화형 로그인 가능한 계정만 필터링합니다.
    if ! echo &quot;$shell&quot; | grep -E -q &quot;nologin|false|sync&quot;; then
        # [상세 해설]: 홈 디렉터리가 실제 디렉터리로 존재하며 최상위 루트(/)가 아닌 경우에만 진단을 진행합니다.
        if [ -d &quot;$home&quot; ] &amp;amp;&amp;amp; [[ &quot;$home&quot; != &quot;/&quot; ]]; then
            CHECK_COUNT=$((CHECK_COUNT+1))
            
            # [상세 해설]: -L 옵션을 추가하여 심볼릭 링크인 경우 실제 대상을 추적하여 소유자와 권한을 가져옵니다.
            OWNER=$(ls -lLd &quot;$home&quot; | awk '{print $3}')
            PERMS=$(ls -lLd &quot;$home&quot; | awk '{print $1}')
            
            # [상세 해설]: ls -l 출력 결과의 9번째 위치인 기타 사용자(Other)의 쓰기(w) 권한 존재 여부를 파싱합니다.
            PERM_O_WRITE=$(echo &quot;$PERMS&quot; | cut -c 9)

            # [상세 해설]: 홈 디렉터리 소유권이 본인이나 root가 아니거나, 타사용자 쓰기 권한이 'w'로 뚫려 있는 경우 적발합니다.
            if [[ &quot;$OWNER&quot; != &quot;$user&quot; &amp;amp;&amp;amp; &quot;$OWNER&quot; != &quot;root&quot; ]] || [[ &quot;$PERM_O_WRITE&quot; == &quot;w&quot; ]]; then
                VULN_HOMES=&quot;$VULN_HOMES $user:$home(소유자:$OWNER, 권한:$PERMS)&quot;
            fi
        fi
    fi
done &amp;lt; /etc/passwd

# [상세 해설]: 취약한 홈 디렉터리 리스트 존재 여부에 따라 결과를 최종 판정합니다.
if [ -n &quot;$VULN_HOMES&quot; ]; then
    WARN &quot;타사용자 쓰기 권한이 있거나 소유자가 잘못된 홈 디렉터리가 존재합니다.&quot; &quot;취약 내역: [ $VULN_HOMES ]&quot;
elif [ &quot;$CHECK_COUNT&quot; -gt 0 ]; then
    OK &quot;모든 대화형 사용자 홈 디렉터리의 소유자 및 권한이 정상입니다.&quot; &quot;총 ${CHECK_COUNT}개 로그인 계정 홈 디렉터리 점검 완료 (안전)&quot;
else
    INFO &quot;점검할 대상(대화형 쉘을 가진 사용자의 홈 디렉터리)이 존재하지 않습니다.&quot; &quot;점검 대상 없음&quot;
fi
FINISH &quot;[ U-31 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;SFTP Chroot 환경 주의사항&lt;/span&gt;: OpenSSH의&lt;span&gt;&amp;nbsp;&lt;/span&gt;ChrootDirectory&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정을 이용하는 환경에서는 홈 디렉터리 소유권이 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;root:root이어야 하며 일반 계정에 쓰기 권한이 없어야 SSH 접속이 허용됩니다. 소유권을 무심코 계정 소유자로 변경할 경우 SSH 접속 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;&quot;fatal: bad ownership or permissions for chroot directory&quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에러와 함께 원격 접속이 전면 차단됩니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: 홈 디렉터리 권한을 변경할 때 타사용자 쓰기 권한만 제거(chmod o-w)하고 그룹 권한은 애플리케이션 요구사항에 맞춰 유지하는 것이 장애 위험을 최소화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 수동 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;perl&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. /etc/passwd 사용자 홈 디렉터리 권한 일괄 안전 조치 예시
# 대상 계정: developer01 (예시)
USER_NAME=&quot;developer01&quot;
USER_HOME=$(grep -E &quot;^${USER_NAME}:&quot; /etc/passwd | awk -F: '{print $6}')

if [ -d &quot;$USER_HOME&quot; ]; then
    # 2. 소유권 교정 (해당 계정 소유 지정)
    chown $USER_NAME &quot;$USER_HOME&quot;
    
    # 3. 타사용자 쓰기 권한 제거 (755 또는 750 권한 권장)
    chmod o-w &quot;$USER_HOME&quot;
    
    # 4. 결과 확인
    ls -ld &quot;$USER_HOME&quot;
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-32] 홈 디렉토리로 지정한 디렉토리의 존재 관리&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/etc/passwd&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에는 사용자 계정과 홈 디렉터리 경로가 정의되어 있습니다. 계정은 생성되었으나 실제 홈 디렉터리가 존재하지 않는 경우, 해당 계정으로 로그인 시 SSH 서비스가 설정 파일을 참조하지 못하거나&lt;span&gt;&amp;nbsp;&lt;/span&gt;/(루트 디렉터리)를 기본 작업 공간으로 삼게 되어 시스템 보안 통제(환경변수, 접근 권한 제한 등)가 우회되는 문제가 발생합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-32 점검 시작
CODE &quot;[ U-32 ] 홈 디렉토리로 지정한 디렉토리의 존재 관리&quot;

NO_HOMES=&quot;&quot;

# [상세 해설]: /etc/passwd 파일 내의 계정명, 홈 경로, 쉘 항목을 순회하며 읽어옵니다.
while IFS=: read -r user _ _ _ _ home shell; do
    # [상세 해설]: 1. 홈 경로가 '/'인 시스템 예외 케이스 제외
    # [상세 해설]: 2. nologin, false, sync, halt, shutdown 등 대화형 로그인이 불가능한 데몬 계정을 완벽 제외합니다.
    if [ &quot;$home&quot; != &quot;/&quot; ] &amp;amp;&amp;amp; ! echo &quot;$shell&quot; | grep -E -q &quot;nologin|false|sync|halt|shutdown&quot;; then
        # [상세 해설]: 실제 대화형 로그인 계정 중 지정된 홈 디렉터리가 디렉터리 형태(-d)로 존재하지 않는 경우 적발합니다.
        if [ ! -d &quot;$home&quot; ]; then
            NO_HOMES=&quot;$NO_HOMES $user($home)&quot;
        fi
    fi
done &amp;lt; /etc/passwd

# [상세 해설]: 문자열 앞뒤 공백을 xargs로 깔끔하게 정리합니다.
NO_HOMES=$(echo &quot;$NO_HOMES&quot; | xargs)

# [상세 해설]: 홈 디렉터리가 누락된 계정이 존재하는지 여부에 따라 결과를 판정합니다.
if [ -n &quot;$NO_HOMES&quot; ]; then
    WARN &quot;passwd 파일에 설정된 홈 디렉터리가 실제 존재하지 않는 계정이 있습니다.&quot; &quot;존재하지 않는 홈 디렉터리: [ $NO_HOMES ]&quot;
else
    OK &quot;모든 사용자 계정의 홈 디렉터리가 정상적으로 시스템에 존재합니다.&quot; &quot;패스워드 파일과 실제 경로 일치함 (데몬 계정 제외)&quot;
fi
FINISH &quot;[ U-32 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;자동화 쉘 스크립트의 허점&lt;/span&gt;: 관리자가 계정을 생성할 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;useradd -m&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 누락하여 계정만 등록되고 디렉터리가 안 만들어지는 실수가 빈번합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;장애 및 사이드 이펙트&lt;/span&gt;: 홈 디렉터리가 없으면 SSH Key 기반 자동 로그인(~/.ssh/authorized_keys)이 불가능해져 배치 작업이나 CI/CD 배포용 서비스 계정이 동작하지 않는 장애가 일어납니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;조치 시 주의사항&lt;/span&gt;: 퇴사자 계정이거나 사용하지 않는 계정이라서 홈 디렉터리가 삭제된 상태라면 단순히 디렉터리를&lt;span&gt;&amp;nbsp;&lt;/span&gt;mkdir로 새로 만들기보다 계정 자체를 삭제하거나 쉘을&lt;span&gt;&amp;nbsp;&lt;/span&gt;/sbin/nologin으로 전환하여 계정을 차단해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 수동 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;perl&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 미존재 홈 디렉터리를 보유한 사용자 확인 (예: devuser)
TARGET_USER=&quot;devuser&quot;
TARGET_HOME=&quot;/home/devuser&quot;

# 2-A. 사용 중인 계정인 경우: 디렉터리 신규 생성 및 소유권/기본 파일(skel) 부여
if id &quot;$TARGET_USER&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    mkdir -p &quot;$TARGET_HOME&quot;
    cp -r /etc/skel/. &quot;$TARGET_HOME/&quot;
    chown -R &quot;$TARGET_USER&quot;:&quot;$TARGET_USER&quot; &quot;$TARGET_HOME&quot;
    chmod 750 &quot;$TARGET_HOME&quot;
fi

# 2-B. 사용하지 않는 계정인 경우: 계정 잠금 및 쉘 변경
usermod -s /sbin/nologin &quot;$TARGET_USER&quot;

# 3. 조치 결과 검증
ls -ld &quot;$TARGET_HOME&quot;
grep -E &quot;^${TARGET_USER}:&quot; /etc/passwd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-33] 숨겨진 파일 및 디렉토리 검색 및 제거&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;침입자나 악성코드는 시스템 침투 후 추적을 피하기 위해 모든 사용자가 쓰기 가능한 임시 디렉터리(/tmp,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/tmp,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/dev/shm)에 온마이닝 스크립트나 웹쉘, 백도어 등을 숨김 파일(예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;.exploit,&lt;span&gt;&amp;nbsp;&lt;/span&gt;...,&lt;span&gt;&amp;nbsp;&lt;/span&gt;.rsa) 형태로 은닉합니다. 주요 임시 경로 내 불필요한 숨김 파일을 정기적으로 검색하고 제거하여 시스템 안전성을 확보해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# U-33 점검 시작
CODE &quot;[ U-33 ] 숨겨진 파일 및 디렉토리 검색 및 제거&quot;

# [상세 해설]: 전체 파일시스템 스캔 시 발생하는 I/O 부하를 방지하기 위해 해커가 주로 활용하는 대표적 공유/임시 경로만 타겟팅합니다.
SUSPICIOUS_DIRS=&quot;/tmp /var/tmp /dev/shm&quot;
FOUND_HIDDEN=&quot;&quot;

for dir in $SUSPICIOUS_DIRS; do
    if [ -d &quot;$dir&quot; ]; then
        # [상세 해설]: find의 -maxdepth 2 옵션으로 탐색 깊이를 제한하고, 현재/상위 디렉터리 표기('.', '..')는 예외 처리합니다.
        # [상세 해설]: OS 구동에 필수적인 X Window 소켓, ICE 소켓 등 정상 시스템 임시 소켓 디렉터리는 grep -vE로 필터링하여 오탐을 방지합니다.
        HIDDEN=$(find &quot;$dir&quot; -maxdepth 2 -name &quot;.*&quot; ! -name &quot;.&quot; ! -name &quot;..&quot; 2&amp;gt;/dev/null | grep -vE '\.X11-unix|\.ICE-unix|\.XIM-unix|\.font-unix|\.Test-unix' | xargs)
        
        if [ -n &quot;$HIDDEN&quot; ]; then
            FOUND_HIDDEN=&quot;$FOUND_HIDDEN $HIDDEN&quot;
        fi
    fi
done

# [상세 해설]: 결과 문자열의 앞뒤 공백을 제거합니다.
FOUND_HIDDEN=$(echo &quot;$FOUND_HIDDEN&quot; | xargs)

# [상세 해설]: 예외 처리된 정상 소켓 외에 이상 숨김 파일이 발견되었는지 점검 결과를 판정합니다.
if [ -n &quot;$FOUND_HIDDEN&quot; ]; then
    WARN &quot;임시 디렉터리 내에 의심스러운 숨김 파일이 발견되었습니다. (백도어 의심)&quot; &quot;발견된 파일: [ $FOUND_HIDDEN ]&quot;
    INFO &quot;시스템 전체의 숨김 파일 검사는 디스크 부하 및 오탐 방지를 위해 수동 점검을 권장합니다.&quot; &quot;명령어: find / -name \&quot;.*\&quot; -print&quot;
else
    OK &quot;주요 임시/공유 디렉터리 내에 의심스러운 숨김 파일이 존재하지 않습니다.&quot; &quot;의심 경로 내 숨김 파일 미발견 (정상 소켓 제외)&quot;
    INFO &quot;시스템 전체의 숨김 파일 검사는 디스크 부하 및 오탐 방지를 위해 수동 점검을 권장합니다.&quot; &quot;명령어: find / -name \&quot;.*\&quot; -print&quot;
fi
FINISH &quot;[ U-33 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;오탐으로 인한 서비스 장애 사례&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/tmp&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리의&lt;span&gt;&amp;nbsp;&lt;/span&gt;.X11-unix,&lt;span&gt;&amp;nbsp;&lt;/span&gt;.ICE-unix, Systemd 디바이스 소켓 파일, DBMS의 세션 숨김 소켓 파일(예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;.s.PGSQL.5432)을 악성 파일로 오인하고 일괄 삭제할 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;DBMS 접속 불가 및 GUI/애플리케이션 데몬 즉시 다운 현상&lt;/span&gt;이 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 방법&lt;/span&gt;: 발견된 숨김 파일이 시스템 정상 프로세스에서 쓰이고 있는지 확인하려면 파일 제거 명령어(rm) 실행 전, 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;lsof&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;fuser명령어(예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;lsof /tmp/.hidden_file)를 통해 해당 파일을 잡고 있는 프로세스가 있는지 체크해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 수동 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 의심 숨김 파일 분석 (파일 타입 및 실행 프로세스 확인)
# 예시 파일: /tmp/.systemd_cache
TARGET_FILE=&quot;/tmp/.systemd_cache&quot;

if [ -f &quot;$TARGET_FILE&quot; ] || [ -d &quot;$TARGET_FILE&quot; ]; then
    # 파일 유형 및 생성 일자 점검
    file &quot;$TARGET_FILE&quot;
    ls -la &quot;$TARGET_FILE&quot;
    
    # 2. 해당 파일을 사용 중인 프로세스 점검 (fuser / lsof)
    lsof &quot;$TARGET_FILE&quot; 2&amp;gt;/dev/null
    
    # 3. 안전하게 격리 디렉터리로 이동 (즉시 rm 지우기 금지)
    mkdir -p /backup/quarantine
    mv &quot;$TARGET_FILE&quot; /backup/quarantine/
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 그룹 스크립트 한계점 및 예외 처리 종합 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;스크립트 한계점 분석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;U-30 (UMASK) 분할 설정 디렉터리 미인식 문제&lt;/span&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;최신 리눅스 OS(RHEL 8/9, Ubuntu 22.04/24.04 등)는 글로벌 환경 설정을&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/profile&lt;span&gt;&amp;nbsp;&lt;/span&gt;단일 파일이 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/profile.d/*.sh&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/bashrc에 분할하여 저장합니다. 단일 파일 검사 방식은 하위 디렉터리 설정에 의해 umask가 덮어씌워지는 현상(Override)을 감지하지 못해 오탐을 유발할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;U-33 (숨김 파일) 깊이 제한 및 부하 문제&lt;/span&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;디스크 부하 완화를 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;-maxdepth 2로 제한했으나, 하위 디렉터리 깊숙이(예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/tmp/dir1/dir2/.malicious) 숨겨진 악성 파일은 탐지하지 못하는 한계가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;개선 코드 스니펫 (Code Snippet)&lt;/h3&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫]: /etc/profile 뿐만 아니라 /etc/profile.d/*.sh 및 /etc/bashrc 전체 탐색
ALL_UMASK=$(grep -h -E -i &quot;^[[:space:]]*umask&quot; /etc/profile /etc/bashrc /etc/profile.d/*.sh 2&amp;gt;/dev/null | tail -n 1 | awk '{print $2}')

if [ -n &quot;$ALL_UMASK&quot; ]; then
    echo &quot;[ 정보 ] 최종 적용 분석 대상 UMASK: $ALL_UMASK&quot;
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #주요정보통신기반시설 #취약점점검 #보안가이드 #서버보안 #유닉스보안 #시스템보안 #보안실무 #파일권한 #유마스크 #U-29 #U-30 #U-31 #U-32 #U-33</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/109</guid>
      <comments>https://ismsp-case.tistory.com/109#entry109comment</comments>
      <pubDate>Fri, 11 Sep 2026 09:40:03 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검 요약] 파일 및 디렉터리 관리(U-24 ~ U-28) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/108</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bbb.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SlBhE/dJMcaiksjce/NK4I3rNCuuC7jUIXD3kz9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SlBhE/dJMcaiksjce/NK4I3rNCuuC7jUIXD3kz9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SlBhE/dJMcaiksjce/NK4I3rNCuuC7jUIXD3kz9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSlBhE%2FdJMcaiksjce%2FNK4I3rNCuuC7jUIXD3kz9k%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;1672&quot; height=&quot;941&quot; data-filename=&quot;bbb.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 서버의 파일 접근 제어 및 네트워크 통제 체계를 다루는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;[U-24 ~ U-28]&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;점검 그룹 진단 가이드입니다. 본 가이드에서는 사용자 환경변수 파일 권한, World Writable 파일, 비정상 디바이스 노출, r-command 신뢰 파일 및 TCP Wrapper 기반 접근 제어 항목을 다룹니다. 자동 진단 스크립트를 통한 정밀 진단부터 안전한 조치 및 백업 절차, 실무 장애 예방 노하우를 상세히 안내해 드립니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 파일 및 디렉토리 관리 영역의 (U-24 ~ U-28) 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; width: 6.51163%;&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt; &lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt; &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 28.6047%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.8605%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 34.8837%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13954%;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.51163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;U-24&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 28.6047%;&quot; data-streamdown=&quot;table-cell&quot;&gt;사용자, 시스템 환경변수 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.8605%;&quot; data-streamdown=&quot;table-cell&quot;&gt;홈 디렉터리 내&lt;span&gt;&amp;nbsp;&lt;/span&gt;.bashrc,&lt;span&gt;&amp;nbsp;&lt;/span&gt;.profile&lt;span&gt;&amp;nbsp;&lt;/span&gt;등&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 34.8837%;&quot; data-streamdown=&quot;table-cell&quot;&gt;소유자가 root 또는 해당 계정이고, Other 쓰기 권한이 없는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13954%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.51163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;U-25&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 28.6047%;&quot; data-streamdown=&quot;table-cell&quot;&gt;홈 디렉터리 및 주요 디렉터리 내 World Writable 파일 점검&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.8605%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/home,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/root,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr등&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 34.8837%;&quot; data-streamdown=&quot;table-cell&quot;&gt;시스템 운영상 불필요한 World Writable 파일이 존재하지 않는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13954%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.51163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;U-26&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 28.6047%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/dev에 존재하지 않는 device 파일 점검&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.8605%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/dev디렉터리 전역&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 34.8837%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/dev&lt;span&gt;&amp;nbsp;&lt;/span&gt;내에 블록/캐릭터 특수 파일 외 일반 파일이 없는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13954%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.51163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;U-27&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 28.6047%;&quot; data-streamdown=&quot;table-cell&quot;&gt;$HOME/.rhosts, hosts.equiv 사용 금지&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.8605%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/hosts.equiv,&lt;span&gt;&amp;nbsp;&lt;/span&gt;$HOME/.rhosts&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 34.8837%;&quot; data-streamdown=&quot;table-cell&quot;&gt;hosts.equiv&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;.rhosts파일이 존재하지 않거나 적절히 통제된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13954%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000; width: 6.51163%;&quot; data-streamdown=&quot;table-cell&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;U-28&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 28.6047%;&quot; data-streamdown=&quot;table-cell&quot;&gt;접속 IP 및 포트 제한&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 21.8605%;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/hosts.deny,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/hosts.allow, 방화벽&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 34.8837%;&quot; data-streamdown=&quot;table-cell&quot;&gt;hosts.deny에&lt;span&gt;&amp;nbsp;&lt;/span&gt;ALL:ALL설정 후 허용 IP만 등록하거나 방화벽으로 통제된 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000; width: 8.13954%;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-24] 사용자, 시스템 환경변수 파일 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자 및 시스템 환경변수 파일(.bashrc,&lt;span&gt;&amp;nbsp;&lt;/span&gt;.bash_profile,&lt;span&gt;&amp;nbsp;&lt;/span&gt;.profile&lt;span&gt;&amp;nbsp;&lt;/span&gt;등)은 로그인 및 쉘 실행 시 자동으로 로드되어 환경변수와 명령어를 정의합니다. 타사용자(Other)에게 쓰기 권한이 부여되어 있거나 소유권이 잘못 설정된 경우, 공격자가 악의적인 명령어(예: 백도어, Alias 변조)를 삽입하여 해당 계정 로그인 시 관리자 권한을 탈취하거나 침해사고를 유발할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# ------------------------------------------------------------------------------
# U-24 점검 시작: 환경변수 파일의 소유권 및 Other 쓰기 권한 검증
# ------------------------------------------------------------------------------
CODE &quot;[ U-24 ] 사용자, 시스템 환경변수 파일 소유자 및 권한 설정&quot;

# [상세 해설] 점검 대상이 되는 주요 쉘 시작 스크립트 및 환경 파일 목록 정의
ENV_FILES=&quot;.profile .kshrc .cshrc .bashrc .bash_profile .login .exrc .netrc&quot;
VULN_ENV_FILES=&quot;&quot;
CHECK_COUNT=0

# [상세 해설] /etc/passwd 파일을 콜론(:) 단위로 파싱하여 계정명과 홈 디렉터리 경로 추출
while IFS=: read -r user _ _ _ _ home _; do
    # [상세 해설] 홈 디렉터리가 실제로 시스템에 존재하는지 확인
    if [ -d &quot;$home&quot; ]; then
        for env_file in $ENV_FILES; do
            target_file=&quot;$home/$env_file&quot;
            # [상세 해설] 대상 파일이 실제 파일로 존재하는 경우 점검 진행
            if [ -f &quot;$target_file&quot; ]; then
                CHECK_COUNT=$((CHECK_COUNT+1))
                
                # [상세 해설] ls -l 결과에서 3번째 필드(소유자)와 1번째 필드(권한 문자열) 추출
                OWNER=$(ls -l &quot;$target_file&quot; | awk '{print $3}')
                PERMS=$(ls -l &quot;$target_file&quot; | awk '{print $1}')
                
                # [상세 해설] 권한 문자열(예: -rwxrwxrwx)의 9번째 위치(Other의 'w' 권한) 추출
                PERM_O_WRITE=$(echo &quot;$PERMS&quot; | cut -c 9)
                
                # [상세 해설] 소유자가 root 또는 해당 사용자 계정이 아니거나, Other 쓰기 권한이 있으면 취약으로 판단
                if [[ &quot;$OWNER&quot; != &quot;$user&quot; &amp;amp;&amp;amp; &quot;$OWNER&quot; != &quot;root&quot; ]] || [[ &quot;$PERM_O_WRITE&quot; == &quot;w&quot; ]]; then
                    VULN_ENV_FILES=&quot;$VULN_ENV_FILES $target_file(소유자:$OWNER,권한:$PERMS)&quot;
                fi
            fi
        done
    fi
done &amp;lt; /etc/passwd

# [상세 해설] 취약 목록 존재 여부에 따른 결과 분기 출력
if [ -n &quot;$VULN_ENV_FILES&quot; ]; then
    WARN &quot;타사용자 쓰기 권한이 부여되었거나 소유자가 잘못 지정된 환경변수 파일이 존재합니다.&quot; &quot;취약 파일 내역: [ $VULN_ENV_FILES ]&quot;
elif [ &quot;$CHECK_COUNT&quot; -gt 0 ]; then
    OK &quot;모든 사용자 환경변수 파일의 소유자가 정상이며, 타사용자 쓰기 권한이 차단되어 있습니다.&quot; &quot;총 ${CHECK_COUNT}개의 환경변수 파일 점검 완료&quot;
else
    INFO &quot;시스템 내에 점검 대상인 사용자 환경변수 파일이 존재하지 않습니다.&quot; &quot;각 계정 홈 디렉터리 내 대상 파일 없음&quot;
fi
FINISH &quot;[ U-24 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 배포 자동화 스크립트가 root 계정으로 일반 애플리케이션 계정(.bashrc&lt;span&gt;&amp;nbsp;&lt;/span&gt;등)에 환경 변수를 주입하면서 소유권을 root로 변경해버리는 사례가 빈번합니다. 이 경우 애플리케이션 계정으로 구동되는 CI/CD 파이프라인이나 서비스 데몬이 세션 로드 시 권한 에러를 발생시킬 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: 변경 대상 계정의 쉘을 전환(su - &amp;lt;계정명&amp;gt; -c &quot;env&quot;)하여 환경변수가 정상적으로 로드되는지 확인해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경(MSA/컨테이너)&lt;/span&gt;: 컨테이너 이미지 빌드 시 불필요한 환경 파일(특히 패스워드가 기록되기 쉬운&lt;span&gt;&amp;nbsp;&lt;/span&gt;.netrc)은 배포 단계에서 완전히 제거하는 멀티스테이지 빌드 파이프라인 구성을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 파일 백업 (점검된 사용자 홈 디렉터리 기준)
cp -p /home/targetuser/.bashrc /home/targetuser/.bashrc_backup_$(date +%Y%m%d)

# 2. 소유권 및 권한 수정 (Other 쓰기 제거 및 본인 소유 지정)
chown targetuser:targetuser /home/targetuser/.bashrc
chmod o-w /home/targetuser/.bashrc
# 또는 안전 권한 644/600 부여
chmod 644 /home/targetuser/.bashrc

# 3. 변경 결과 확인
ls -l /home/targetuser/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-25] 홈디렉터리 및 주요 디렉터리 내 World Writable 파일 점검&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;World Writable 파일은 시스템 내의 모든 로컬 사용자가 수정하고 내용을 덮어쓸 수 있는 파일(권한&lt;span&gt;&amp;nbsp;&lt;/span&gt;o+w&lt;span&gt;&amp;nbsp;&lt;/span&gt;/&lt;span&gt;&amp;nbsp;&lt;/span&gt;xx2&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;xx3/xx6/xx7)을 의미합니다. 주요 디렉터리나 공용 디렉터리에 이러한 파일이 방치되면 비인가자가 정상 실행 파일, 라이브러리, 쉘 스크립트, 설정 파일을 변조하여 시스템 무력화나 권한 상승(Privilege Escalation)을 유도할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# ------------------------------------------------------------------------------
# U-25 점검 시작: 주요 디렉터리 내 Other 쓰기 권한(-002) 파일 검색
# ------------------------------------------------------------------------------
CODE &quot;[ U-25 ] 홈디렉터리 및 주요 디렉터리 내 World Writable 파일 점검&quot;

# [상세 해설] World Writable 점검 대상이 될 핵심 디렉터리 목록 설정
TARGET_DIRS=&quot;/home /root /etc /bin /sbin /usr/bin /usr/sbin&quot;

# [상세 해설] find 명령에 -xdev(동일 파일시스템 내 검색) 및 -perm -002(Other 쓰기 포함) 적용
# 60초 타임아웃을 적용하여 대용량 스토리지 점검 시 시스템 Hang 방지
WW_FILES=$(EXEC_TIMEOUT 60 &quot;find $TARGET_DIRS -xdev -type f -perm -002 2&amp;gt;/dev/null | head -n 5 | xargs&quot;)
EXIT_CODE=$?

# [상세 해설] 타임아웃 반환 코드(124) 및 결과 문자열 존재 여부에 따른 판정
if [ &quot;$EXIT_CODE&quot; -eq 124 ]; then
    INFO &quot;World Writable 파일 검색 중 응답 지연(60초 초과)이 발생하여 점검을 중단했습니다.&quot; &quot;수동 점검 요망&quot;
elif [ -n &quot;$WW_FILES&quot; ]; then
    WARN &quot;주요 디렉터리 내에 모든 사용자(Others)가 수정 가능한 파일이 존재하여 악의적인 변조 위험이 있습니다.&quot; &quot;발견된 파일(최대 5개): [ $WW_FILES ]&quot;
else
    OK &quot;지정된 주요 디렉터리 내에 불필요한 World Writable 파일이 발견되지 않았습니다.&quot; &quot;안전한 권한 설정 확인&quot;
fi
FINISH &quot;[ U-25 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 임시 디렉터리나 로그 디렉터리(app_log.txt)의 권한 문제를 해결하기 위해 엔지니어가 무심코&lt;span&gt;&amp;nbsp;&lt;/span&gt;chmod 777을 실행하여 World Writable 파일이 생성되는 경우가 많습니다. 또한&lt;span&gt;&amp;nbsp;&lt;/span&gt;/tmp나&lt;span&gt;&amp;nbsp;&lt;/span&gt;/var/tmp&lt;span&gt;&amp;nbsp;&lt;/span&gt;등 정상적으로 World Writable이 허용되어야 하는 공용 디렉터리의 Sticky Bit(chmod +t) 속성을 누락하여 타 사용자의 파일 삭제/변조 사고가 발생합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: 애플리케이션 로그 파일인 경우 프로세스 구동 계정 전용 그룹을 생성하여 그룹 쓰기 권한(chmod g+w)을 부여하고 Other 권한은 철저히 회수해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대용량 파일시스템 환경&lt;/span&gt;: NFS/NAS 마운트 디렉터리에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;find /를 실행하면 I/O 병목이 발생하므로 점검 스크립트 작성 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;-xdev&lt;span&gt;&amp;nbsp;&lt;/span&gt;플래그 사용이 필수적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 대상 파일 권한 확인 및 백업 (권한 상태 보존)
getfacl /path/to/vulnerable_file &amp;gt; /path/to/vulnerable_file_acl_backup.txt

# 2. 타사용자(Other) 쓰기 권한 회수 (World Writable 제거)
chmod o-w /path/to/vulnerable_file

# 3. 권한 변경 결과 확인
ls -l /path/to/vulnerable_file&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-26] /dev에 존재하지 않는 device 파일 점검&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/dev&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리는 리눅스 커널이 인식하는 디바이스 드라이버와 통신하기 위한 블록 디바이스(Block Device,&lt;span&gt;&amp;nbsp;&lt;/span&gt;b), 캐릭터 디바이스(Character Device,&lt;span&gt;&amp;nbsp;&lt;/span&gt;c) 또는 디렉터리(d)만 존재해야 합니다. 공격자는 탐지를 회피하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;/dev&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리 내에 백도어 쉘 스크립트, 악성 바이너리, 로그 은닉 파일 등의 일반 정규 파일(Regular File,&lt;span&gt;&amp;nbsp;&lt;/span&gt;-type f)을 숨겨두는 수법을 자주 사용합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# ------------------------------------------------------------------------------
# U-26 점검 시작: /dev 디렉터리 내 비정상 일반 정규 파일(-type f) 검출
# ------------------------------------------------------------------------------
CODE &quot;[ U-26 ] /dev에 존재하지 않는 device 파일 점검&quot;

# [상세 해설] /dev 디렉터리 내에서 블록/문자 특수 파일이 아닌 일반 파일(-type f) 탐색
DEV_FILES=$(find /dev -type f 2&amp;gt;/dev/null | head -n 5 | xargs)

# [상세 해설] 일반 파일이 검출된 경우 침해사고 의심(백도어 등) 경고 발생
if [ -n &quot;$DEV_FILES&quot; ]; then
    WARN &quot;/dev 디렉터리에 존재해서는 안 되는 일반 파일이 발견되었습니다. (백도어 의심)&quot; &quot;발견된 파일: [ $DEV_FILES ]&quot;
else
    OK &quot;/dev 디렉터리 내에 불필요한 일반 파일이 존재하지 않습니다.&quot; &quot;/dev 내 정상적인 디바이스 파일만 존재함&quot;
fi
FINISH &quot;[ U-26 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 일부 리눅스 배포판 및 커널 드라이버, 가상화 환경(예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/dev/.udev,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/dev/shm&lt;span&gt;&amp;nbsp;&lt;/span&gt;마운트 하위 파일)에서 시스템 구동 시 정상적인 일반 파일이나 런타임 파일이 생성될 수 있습니다. 이를 확인 없이 무조건 삭제하면 하드웨어 인식 장애나 udev 데몬 에러를 유발할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: 검출된 파일의 내용(file &amp;lt;파일명&amp;gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;strings &amp;lt;파일명&amp;gt;)과 패키지 귀속 여부(rpm -qf &amp;lt;파일명&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;dpkg -S &amp;lt;파일명&amp;gt;)를 확인하여 시스템 구성 요소인지 악성 파일인지 검증합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;조치 팁&lt;/span&gt;: 의심 파일 발견 시 즉시 삭제(rm)하기보다는 안전한 격리 디렉터리(/root/quarantine/)로 이동(mv)시킨 후 서비스 영향도를 관찰해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 의심 파일 내용 및 속성 확인
file /dev/suspicious_file
head -n 20 /dev/suspicious_file

# 2. 격리 디렉터리 생성 및 파일 격리 (삭제 대신 이동)
mkdir -p /root/quarantine_dev/
mv /dev/suspicious_file /root/quarantine_dev/

# 3. /dev 상태 재검증
find /dev -type f&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-27] $HOME/.rhosts, hosts.equiv 사용 금지&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/etc/hosts.equiv&lt;span&gt;&amp;nbsp;&lt;/span&gt;및 각 사용자 홈 디렉터리의&lt;span&gt;&amp;nbsp;&lt;/span&gt;.rhosts&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일은 r-command(rsh,&lt;span&gt;&amp;nbsp;&lt;/span&gt;rlogin,&lt;span&gt;&amp;nbsp;&lt;/span&gt;rcp&lt;span&gt;&amp;nbsp;&lt;/span&gt;등) 사용 시 패스워드 인증 없이 원격 호스트 및 계정의 접속을 신뢰하도록 허용하는 레거시 설정입니다. IP 스푸핑(Spoofing)이나 내부망 장악 시 패스워드 없이 원격 루트 권한 및 시스템 권한을 손쉽게 획득할 수 있으므로 해당 파일의 사용을 전면 금지해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# ------------------------------------------------------------------------------
# U-27 점검 시작: hosts.equiv 및 각 계정 .rhosts 파일 존재 여부 검사
# ------------------------------------------------------------------------------
CODE &quot;[ U-27 ] \$HOME/.rhosts, hosts.equiv 사용 금지&quot;

VULN_RHOSTS=&quot;&quot;

# [상세 해설] 1. 시스템 전역 신뢰 파일인 /etc/hosts.equiv 존재 여부 검사
if [ -f /etc/hosts.equiv ]; then
    VULN_RHOSTS=&quot;/etc/hosts.equiv &quot;
fi

# [상세 해설] 2. /etc/passwd의 모든 계정 홈 디렉터리를 순회하며 .rhosts 파일 탐색
while IFS=: read -r user _ _ _ _ home _; do
    if [ -d &quot;$home&quot; ] &amp;amp;&amp;amp; [ -f &quot;$home/.rhosts&quot; ]; then
        VULN_RHOSTS=&quot;$VULN_RHOSTS $home/.rhosts&quot;
    fi
done &amp;lt; /etc/passwd

# [상세 해설] 취약 파일이 발견될 경우 경고 발생
if [ -n &quot;$VULN_RHOSTS&quot; ]; then
    WARN &quot;인증 없이 원격 접속을 허용하는 취약한 설정 파일이 존재합니다.&quot; &quot;발견된 파일: [ $VULN_RHOSTS ]&quot;
else
    OK &quot;취약한 원격 접속 설정 파일(.rhosts, hosts.equiv)이 존재하지 않습니다.&quot; &quot;해당 파일 미발견 (안전)&quot;
fi
FINISH &quot;[ U-27 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 과거 유닉스 환경에서 작성된 오래된 배치 스크립트나 클러스터 관리 도구가 r-command 신뢰 파일에 의존하고 있는 경우가 있습니다. 해당 파일을 무작정 삭제할 경우 정기 데이터 동기화 배치가 중단될 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;: SSH 공개키 기반 비대칭키 인증(~/.ssh/authorized_keys) 체계로 전환하여 패스워드 없는 안전한 자동화 환경을 구축해야 합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;특수 환경 조치&lt;/span&gt;: 레거시 장비와의 통신으로 인해 즉시 삭제가 불가능한 유예 기간에는 소유자를 root 또는 해당 계정으로 지정하고 권한을&lt;span&gt;&amp;nbsp;&lt;/span&gt;600&lt;span&gt;&amp;nbsp;&lt;/span&gt;이하로 강력히 통제하여 파일 변조를 차단해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;dts&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 파일 백업 (보관용 디렉터리로 이동)
mkdir -p /root/backup_rhosts/
[ -f /etc/hosts.equiv ] &amp;amp;&amp;amp; mv /etc/hosts.equiv /root/backup_rhosts/

# 2. 사용자 계정 홈 디렉터리 내 .rhosts 파일 검색 및 삭제/이동
find /home -name &quot;.rhosts&quot; -exec mv {} /root/backup_rhosts/ \;

# 3. r-command 서비스 비활성화 확인 (systemd 기준)
systemctl stop rsh.socket rlogin.socket rexec.socket 2&amp;gt;/dev/null
systemctl disable rsh.socket rlogin.socket rexec.socket 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-28] 접속 IP 및 포트 제한&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 접근 제어는 인가된 관리자 IP 또는 내부 관리망 대역에서만 서버의 서비스 포트(SSH, DB 등)에 접근할 수 있도록 차단벽을 형성하는 핵심 보안 조치입니다. TCP Wrapper(/etc/hosts.allow,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/hosts.deny) 또는 커널 기반 방화벽(firewalld,&lt;span&gt;&amp;nbsp;&lt;/span&gt;iptables,&lt;span&gt;&amp;nbsp;&lt;/span&gt;nftables)을 통해 기본 거부(Default Deny,&lt;span&gt;&amp;nbsp;&lt;/span&gt;ALL:ALL) 정책을 수립하고 예외적으로 필요한 IP만 명시 허용해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# ------------------------------------------------------------------------------
# U-28 점검 시작: TCP Wrapper(/etc/hosts.deny) 기본 차단 정책(ALL:ALL) 확인
# ------------------------------------------------------------------------------
CODE &quot;[ U-28 ] 접속 IP 및 포트 제한&quot;

IP_LIMIT_SAFE=&quot;FALSE&quot;

# [상세 해설] /etc/hosts.deny 파일 내 ALL:ALL 차단 룰 적용 여부 정규식 검사
if [ -f /etc/hosts.deny ]; then
    if grep -E -q &quot;^[[:space:]]*ALL[[:space:]]*:[[:space:]]*ALL&quot; /etc/hosts.deny; then
        IP_LIMIT_SAFE=&quot;TRUE&quot;
    fi
fi

# [상세 해설] TCP Wrapper 미설정 시 방화벽(iptables/firewalld) 수동 검토 가이드 출력
if [[ &quot;$IP_LIMIT_SAFE&quot; == &quot;TRUE&quot; ]]; then
    OK &quot;TCP Wrapper(hosts.deny)를 통해 기본적으로 모든 접속을 통제하고 있습니다.&quot; &quot;hosts.deny에 ALL:ALL 설정 적용됨&quot;
else
    WARN &quot;TCP Wrapper(hosts.deny) 설정이 미흡합니다. (방화벽/iptables 수동 점검 필요)&quot; &quot;hosts.deny 파일 없거나 ALL:ALL 설정 누락&quot;
    INFO &quot;네트워크 장비(방화벽)나 iptables, firewalld를 통해 접근 통제 중이라면 양호(OK) 처리 가능합니다.&quot; &quot;수동 확인 대상: iptables -L 등&quot;
fi
FINISH &quot;[ U-28 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례 (세션 락아웃 주의)&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/hosts.deny에&lt;span&gt;&amp;nbsp;&lt;/span&gt;ALL:ALL을 먼저 기입하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/hosts.allow에 본인의 접속 IP를 누락하거나 오타를 낸 상태로 기존 터미널을 닫으면 즉시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;서버 접근 불가(Session Lockout)&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상태에 빠집니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전 검증 절차&lt;/span&gt;:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;현재 접속 중인 SSH 세션을 닫지 않고 유지&lt;/span&gt;합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;별도의 새로운 터미널 창을 열어 SSH 접속이 정상적으로 이루어지는지 확인합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;RHEL 8/9 및 Ubuntu 22.04+ 환경에서는 최신 OpenSSH 데몬이&lt;span&gt;&amp;nbsp;&lt;/span&gt;libwrap(TCP Wrapper) 라이브러리 링크를 기본적으로 지원하지 않으므로, 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;firewalld나&lt;span&gt;&amp;nbsp;&lt;/span&gt;nftables/iptables를 기본 접근 제어 수단으로 채택해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 기존 TCP Wrapper 파일 백업
cp -p /etc/hosts.allow /etc/hosts.allow_backup_$(date +%Y%m%d)
cp -p /etc/hosts.deny /etc/hosts.deny_backup_$(date +%Y%m%d)

# 2. hosts.allow에 관리자 허용 IP 우선 등록 (반드시 deny보다 먼저 적용)
echo &quot;sshd : 192.168.1.100, 10.10.0.0/255.255.0.0&quot; &amp;gt;&amp;gt; /etc/hosts.allow

# 3. hosts.deny에 전체 거부(Default Deny) 적용
echo &quot;ALL : ALL&quot; &amp;gt;&amp;gt; /etc/hosts.deny

# 4. [대안/권장] 최신 OS(RHEL 8/9, Ubuntu 20.04+)의 Firewalld 접근 제어
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --permanent --zone=trusted --add-source=192.168.1.100/32
firewall-cmd --reload
firewall-cmd --list-all --zone=trusted&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 그룹 스크립트 한계점 및 예외 처리 종합 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.1. 기술적 한계점 분석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;TCP Wrapper 폐지 추세 미반영&lt;/span&gt;: 최신 OS(RHEL 8/9, Rocky Linux 8/9, Ubuntu 20.04 이상)는 OpenSSH 빌드 시 TCP Wrapper 연동을 중단했습니다. 따라서&lt;span&gt;&amp;nbsp;&lt;/span&gt;hosts.deny&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일만 검사할 경우 실제로는 방화벽으로 완벽히 통제되고 있음에도 취약으로 오탐되거나, 반대로&lt;span&gt;&amp;nbsp;&lt;/span&gt;hosts.deny&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정이 적용되지 않는데도 양호로 오탐될 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;NFS/외부 파일시스템 스캔 병목&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;U-25의 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;-xdev&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션이 적용되어 있으나, 마운트 포인트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;/home&lt;span&gt;&amp;nbsp;&lt;/span&gt;하위에 별도 파티션으로 존재하는 환경에서는 하위 디렉터리 검색이 누락될 가능성이 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;사용자 환경변수 Include 분할 설정&lt;/span&gt;: Bash 최신 버전이나 커스텀 환경에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;.bashrc&lt;span&gt;&amp;nbsp;&lt;/span&gt;내부가 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;~/.bashrc.d/*.sh&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/profile.d/*.sh&lt;span&gt;&amp;nbsp;&lt;/span&gt;형태로 분할된 스크립트의 소유권 및 권한 점검이 누락될 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.2. 보완 및 개선 코드 스니펫 (Code Snippet)&lt;/h3&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫] TCP Wrapper 미지원 최신 OS 대상 firewalld / iptables 방화벽 활성화 복합 검증 로직
CHECK_FIREWALL_ACTIVE=&quot;FALSE&quot;
if command -v firewall-cmd &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;amp; systemctl is-active --quiet firewalld; then
    # firewalld 활성 상태 및 SSH 접근 제어 룰셋 존재 검증
    DEFAULT_ZONE=$(firewall-cmd --get-default-zone 2&amp;gt;/dev/null)
    CHECK_FIREWALL_ACTIVE=&quot;TRUE (Firewalld: $DEFAULT_ZONE Zone 활성)&quot;
elif command -v ufw &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;amp; ufw status 2&amp;gt;/dev/null | grep -q &quot;Status: active&quot;; then
    CHECK_FIREWALL_ACTIVE=&quot;TRUE (UFW 방화벽 활성)&quot;
elif iptables -L -n 2&amp;gt;/dev/null | grep -E -q &quot;DROP|REJECT&quot;; then
    CHECK_FIREWALL_ACTIVE=&quot;TRUE (iptables 차단 정책 활성)&quot;
fi
echo &quot;[보안 진단 참고] 네트워크 계층 방화벽 상태: $CHECK_FIREWALL_ACTIVE&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #주요정보통신기반시설 #보안진단가이드 #서버보안 #파일권한설정 #환경변수보안 #접근통제 #방화벽설정 #침해사고예방 #보안스크립트 #취약점점검 #U-24 #U-25 #U-26 #U-27 #U-28</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/108</guid>
      <comments>https://ismsp-case.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 10 Sep 2026 13:16:13 +0900</pubDate>
    </item>
    <item>
      <title>회원 탈퇴 후 Data Lake에 남은 개인정보, 어디까지 파기해야 할까?</title>
      <link>https://ismsp-case.tistory.com/105</link>
      <description>&lt;h1&gt;회원 탈퇴 후 Data Lake에 남은 개인정보, 어디까지 파기해야 할까?&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;mdash; ISMS-P 3.4.1&amp;middot;3.4.2 관점에서 보는 데이터 레이크 개인정보 파기&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 글은 ISMS-P 개인정보 파기 기준을 이해하기 위한 가상의 시나리오를 바탕으로 작성한 실무 사례형 콘텐츠입니다. 특정 기업의 실제 심사 사례나 실제 결함 사례가 아니며, 기업명&amp;middot;인물&amp;middot;데이터&amp;middot;증적은 설명을 위해 구성한 예시입니다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 운영 DB에서 삭제했는데 Data Lake에는 개인정보가 남아 있다면?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 기업의 데이터 처리환경은 하나의 데이터베이스로 끝나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 구조를 생각해 볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;회원 서비스
    │
    ▼
Aurora PostgreSQL
    │
    │ CDC
    ▼
Debezium
    │
    ▼
Kafka
    │
    ▼
AWS S3 Data Lake
    │
    ├── AWS Glue
    ├── Athena
    │
    ▼
Snowflake
    │
    ▼
AI 추천 분석
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서는 회원 탈퇴나 보유기간 만료에 따라 개인정보를 삭제하고 있는데, 이미 다른 시스템으로 복제된 개인정보까지 동일하게 처리되고 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Data Lake 환경에서는 다음과 같은 문제가 발생할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서는 개인정보가 삭제되었지만, 과거에 적재된 S3 Parquet 파일에는 해당 개인정보가 그대로 남아 있는 경우&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 S3의 데이터를 Snowflake와 같은 분석환경으로 다시 적재하고 있다면, S3에서 데이터를 처리하더라도 Snowflake에는 기존 데이터가 남아 있을 수 있다.&lt;/p&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;&amp;ldquo;운영 DB에서 DELETE가 실행되었는가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만 확인해서는 충분하지 않다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 가상의 데이터 처리 환경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 가상의 환경을 가정해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분구성&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;회원/주문 DB&lt;/td&gt;
&lt;td&gt;Amazon Aurora PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;변경 데이터 수집&lt;/td&gt;
&lt;td&gt;Debezium CDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메시지 전달&lt;/td&gt;
&lt;td&gt;Apache Kafka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Lake&lt;/td&gt;
&lt;td&gt;Amazon S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETL&lt;/td&gt;
&lt;td&gt;AWS Glue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;조회&lt;/td&gt;
&lt;td&gt;Amazon Athena&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;분석 DW&lt;/td&gt;
&lt;td&gt;Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;활용 목적&lt;/td&gt;
&lt;td&gt;구매 패턴 분석 및 AI 추천&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 형식&lt;/td&gt;
&lt;td&gt;Parquet 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서 발생한 INSERT, UPDATE 등의 변경사항은 CDC를 통해 Data Lake로 전달되고, 이후 분석 및 AI 추천을 위해 Snowflake로 적재된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 &lt;b&gt;DELETE 이벤트를 어떻게 처리할 것인가&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 데이터가 발생할 때에는 데이터를 추가하면 되지만, 이미 Data Lake에 적재된 데이터가 이후 삭제 대상이 된 경우에는 별도의 파기 로직이 필요할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 가상의 개인정보 파기 시나리오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 USER-000123이 탈퇴했다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서는 탈퇴 처리가 정상적으로 수행되었다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
Aurora PostgreSQL
   &amp;darr;
탈퇴 처리 및 삭제
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 해당 회원의 과거 주문 데이터가 이미 Data Lake에 적재되어 있었다.&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;S3 Data Lake

order_id       user_id
--------------------------------
ORDER-000001   USER-000123
ORDER-000002   USER-000456
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 주문 데이터에는 다음과 같은 개인정보 항목이 포함되어 있다고 가정한다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;shipping_recipient_name
shipping_phone
shipping_address
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서는 USER-000123의 개인정보가 삭제되었지만, S3의 과거 적재 데이터에는 여전히 해당 정보가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상황에서 바로 &lt;b&gt;&amp;ldquo;ISMS-P 결함이다&amp;rdquo;&lt;/b&gt;라고 판단하는 것이 적절할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 그렇지는 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 다음을 확인해야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 데이터가 현재도 보유할 필요가 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;계속 보유해야 한다면 그 근거가 무엇인가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 가지를 확인한 후 3.4.1과 3.4.2 관점에서 판단해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. ISMS-P 3.4.1 / 3.4.2 기준으로 판단하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 ISMS-P 인증기준에서 3.4는 **「개인정보 파기 시 보호조치」**이며, 3.4에는 2개의 인증기준이 포함되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사례를 판단할 때 핵심적인 질문은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Data Lake에 개인정보가 존재하는가?
            &amp;darr;
해당 개인정보가 현재도 필요한가?
            &amp;darr;
계속 보존해야 할 법적 근거가 있는가?
       ┌────────┴────────┐
       │                 │
      없음               있음
       │                 │
       ▼                 ▼
     3.4.1             3.4.2
       │                 │
       ▼                 ▼
      파기             분리&amp;middot;관리
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.1 3.4.1 개인정보 파기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조는 보유기간의 경과, 처리 목적 달성 등으로 개인정보가 불필요하게 된 경우 &lt;b&gt;지체 없이 파기&lt;/b&gt;하도록 규정하고 있다. 또한 파기할 때에는 복구 또는 재생되지 않도록 조치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 3.4.1 관점에서는 다음 사항을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인 항목주요 확인사항&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개인정보 존재 여부&lt;/td&gt;
&lt;td&gt;S3, Snowflake 등에 개인정보가 남아 있는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;처리 목적&lt;/td&gt;
&lt;td&gt;해당 데이터가 현재도 처리 목적에 필요한가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보유기간&lt;/td&gt;
&lt;td&gt;정해진 보유기간이 종료되었는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;법적 보존&lt;/td&gt;
&lt;td&gt;계속 보존해야 할 법적 근거가 있는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파기 범위&lt;/td&gt;
&lt;td&gt;어떤 개인정보 항목을 파기해야 하는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파기 방법&lt;/td&gt;
&lt;td&gt;복구&amp;middot;재생이 어렵도록 파기하는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파기 이력&lt;/td&gt;
&lt;td&gt;파기 결과를 확인할 수 있는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;Data Lake에 개인정보가 남아 있다&amp;rdquo;는 사실보다 &amp;ldquo;더 이상 필요하지 않은 개인정보가 파기되지 않고 남아 있는가&amp;rdquo;가 핵심이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.2 3.4.1 관점의 판단 예시&lt;/h2&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;회원이 탈퇴했다.&lt;/li&gt;
&lt;li&gt;AI 추천 서비스에서 해당 회원의 개인 식별정보를 계속 이용할 필요가 없다.&lt;/li&gt;
&lt;li&gt;해당 데이터에 별도의 법적 보존 근거가 없다.&lt;/li&gt;
&lt;li&gt;내부적으로 정한 보유기간도 종료되었다.&lt;/li&gt;
&lt;li&gt;운영 DB에서는 삭제되었다.&lt;/li&gt;
&lt;li&gt;그러나 S3 Data Lake의 과거 데이터에는 이름&amp;middot;연락처&amp;middot;주소가 그대로 존재한다.&lt;/li&gt;
&lt;li&gt;Snowflake에도 동일 데이터가 적재되어 있다.&lt;/li&gt;
&lt;li&gt;Data Lake에 대한 별도의 파기 절차가 존재하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에는 &lt;b&gt;운영 DB의 삭제만으로 개인정보 파기가 완료되었다고 보기 어렵다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake와 분석계에 동일 개인정보가 존재한다면 해당 시스템에도 개인정보 파기 절차가 적용되는지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 3.4.2 처리목적 달성 후 보유 시 조치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 모든 탈퇴 회원 데이터를 반드시 즉시 삭제해야 하는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 특정 개인정보가 다른 법령에 따라 일정 기간 보존되어야 한다면 해당 정보를 계속 보존할 수 있는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조는 다른 법령에 따라 보존해야 하는 경우 파기하지 않을 수 있도록 하고 있으며, 이 경우 해당 개인정보 또는 개인정보파일을 다른 개인정보와 분리하여 저장&amp;middot;관리하도록 규정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 질문이 필요하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 보존하는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무엇을 보존해야 하는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제까지 보존해야 하는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보존하는 동안 다른 목적으로 이용하고 있지는 않은가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.1 법적 보존과 일반적인 서비스 이용은 구분해야 한다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 거래 관련 정보 중 일부를 법령에 따라 보존해야 한다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다고 해서 탈퇴 회원의 모든 개인정보를 Data Lake에 계속 보존할 수 있다는 의미는 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 구분해야 한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;탈퇴 회원 데이터
       │
       ├── 계속 보존할 필요 없음
       │       &amp;darr;
       │      파기
       │
       └── 법적 보존 필요
               &amp;darr;
          필요한 범위만 보존
               &amp;darr;
          분리&amp;middot;저장&amp;middot;관리
               &amp;darr;
          보존기간 종료
               &amp;darr;
              파기
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;법적 보존이 필요한 데이터와 일반적인 서비스 운영 데이터를 동일한 영역에 계속 보관하는 구조&lt;/b&gt;라면 별도의 관리가 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 이 사례를 3.4.1과 3.4.2로 구분해 보면&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인 결과주요 판단 관점&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개인정보가 더 이상 필요하지 않음&lt;/td&gt;
&lt;td&gt;3.4.1 개인정보 파기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보유기간이 종료됨&lt;/td&gt;
&lt;td&gt;3.4.1 개인정보 파기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;처리 목적이 달성됨&lt;/td&gt;
&lt;td&gt;3.4.1 개인정보 파기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;별도의 법적 보존 근거가 없음&lt;/td&gt;
&lt;td&gt;3.4.1 개인정보 파기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다른 법령에 따라 보존 필요&lt;/td&gt;
&lt;td&gt;3.4.2 관점에서 분리&amp;middot;관리 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;법적 보존 대상과 일반 개인정보가 함께 저장됨&lt;/td&gt;
&lt;td&gt;3.4.2 관점에서 분리&amp;middot;관리 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보존 데이터를 AI 추천 등 다른 목적으로 계속 이용&lt;/td&gt;
&lt;td&gt;보존 근거와 별도로 이용 목적 및 적법성 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보존기간 종료 후에도 데이터가 남아 있음&lt;/td&gt;
&lt;td&gt;3.4.1 파기 여부 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 사례에서는 &lt;b&gt;3.4.1과 3.4.2를 서로 완전히 분리된 문제로 보기보다는 개인정보 생명주기에 따라 연속적으로 판단하는 것이 중요하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 운영 DB에서 삭제했는데 Data Lake에는 왜 남아 있을까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 기술적인 부분을 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상의 데이터 흐름은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Aurora PostgreSQL
       │
       ▼
   Debezium
       │
       ▼
     Kafka
       │
       ▼
   S3 Data Lake
       │
       ├── AWS Glue
       └── Athena
       │
       ▼
   Snowflake
       │
       ▼
   AI 분석
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서 다음과 같이 삭제했다고 하자.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DELETE FROM customer
WHERE user_id = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 작업 자체는 정상적으로 수행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이미 S3에 적재된 데이터는 자동으로 삭제되지 않을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 구조라면,&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;s3://example-datalake/orders/
    ├── year=2026/
    │   ├── month=08/
    │   │   ├── day=01/
    │   │   └── day=02/
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8월 1일에 생성된 데이터가 9월에 탈퇴 처리되었다고 해서 8월 1일의 Parquet 파일이 자동으로 변경되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원천 DB의 현재 상태와 Data Lake에 저장된 과거 데이터의 상태는 서로 다를 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. 기술적 원인&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제는 크게 네 가지 관점에서 확인할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8.1 DELETE 이벤트 미처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDC 파이프라인이 INSERT와 UPDATE 중심으로 설계되어 있고 DELETE 이벤트를 downstream 시스템의 파기 처리에 활용하지 않는 경우다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;INSERT &amp;rarr; 처리
UPDATE &amp;rarr; 처리
DELETE &amp;rarr; 미처리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 운영 DB에서는 삭제되지만 Data Lake에는 기존 데이터가 남을 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8.2 Immutable 데이터 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake에서는 Parquet와 같은 파일 기반 데이터가 날짜나 파티션 단위로 저장되는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 특정 사용자의 데이터를 제거하려면 단순히 원천 DB의 DELETE만으로는 부족하고, 기존 데이터셋에 대한 별도의 처리 과정이 필요할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8.3 분석계 데이터 잔존&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3에서 개인정보를 처리했다고 하더라도 Snowflake와 같은 DW에 이미 적재된 데이터가 남아 있을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;S3
 &amp;darr;
ETL
 &amp;darr;
Snowflake
 &amp;darr;
AI 분석
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 파기 프로세스는 특정 저장소 하나만 대상으로 하면 안 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8.4 ETL 재실행에 따른 재생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 가지 더 주의할 점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3에서 특정 데이터를 삭제했더라도 원천 데이터나 다른 저장소에 동일 데이터가 남아 있다면 ETL을 다시 실행하면서 삭제 대상 데이터가 다시 생성될 수 있다.&lt;/p&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;삭제 &amp;rarr; 검증&lt;/b&gt;&lt;/p&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;삭제 &amp;rarr; 검증 &amp;rarr; 재생성 여부 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 고려할 필요가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 개선 방향&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9.1 개인정보가 존재하는 위치를 식별한다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 동일 개인정보가 어느 시스템에 존재하는지 확인한다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Aurora
S3 Data Lake
Snowflake
Backup
Archive
AI 분석 데이터
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 처리 흐름도를 기준으로 저장 위치를 관리하면 파기 누락을 줄일 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9.2 탈퇴 이벤트와 파기 프로세스를 연결한다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 탈퇴가 발생했을 때 단순히 운영 DB만 삭제하는 것이 아니라 후속 시스템의 파기 프로세스까지 연결한다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
삭제 대상 식별
   &amp;darr;
파기 이벤트 생성
   &amp;darr;
Data Lake 처리
   &amp;darr;
DW 처리
   &amp;darr;
분석 데이터 처리
   &amp;darr;
결과 검증
   &amp;darr;
파기 이력 기록
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;회원 탈퇴 처리와 개인정보 파기 처리를 하나의 데이터 생명주기로 관리하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 개인정보 파기와 마스킹은 구분해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 사례에서 가장 주의해야 할 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 데이터를 변경했다고 하자.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;홍길동
010-1234-5678
서울특별시 ○○구 ○○로
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[DELETED_USER]
[DELETED]
[PURGED_ADDRESS]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 곧바로 &lt;b&gt;&amp;ldquo;개인정보 파기 완료&amp;rdquo;&lt;/b&gt;라고 표현해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 데이터를 다른 값으로 치환한 것이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조는 개인정보를 파기할 때 복구 또는 재생되지 않도록 조치하도록 규정하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 기술적 조치의 목적을 다음과 같이 구분하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조치목적&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;데이터 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;객체 삭제&lt;/td&gt;
&lt;td&gt;Data Lake 파일 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터셋 재작성&lt;/td&gt;
&lt;td&gt;특정 데이터를 제거한 데이터셋 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;마스킹&lt;/td&gt;
&lt;td&gt;표시&amp;middot;분석 과정에서 식별정보 노출 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가명처리&lt;/td&gt;
&lt;td&gt;가명정보 처리 목적에 따른 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;분리 저장&lt;/td&gt;
&lt;td&gt;법적 보존 대상의 별도 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;마스킹&amp;middot;가명처리와 파기는 동일한 개념이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. 개선 코드 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 운영환경에서는 데이터 구조와 저장 방식에 따라 구현방법이 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 개념을 설명하기 위한 단순한 PySpark 예시다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName(&quot;PersonalInformationPurge&quot;) \
    .getOrCreate()

target_user = &quot;USER-000123&quot;

df = spark.read.parquet(
    &quot;s3://example-data-lake/customer/&quot;
)

purged_df = df.filter(
    df.user_id != target_user
)

purged_df.write \
    .mode(&quot;overwrite&quot;) \
    .parquet(
        &quot;s3://example-data-lake/customer-purged/&quot;
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 &lt;b&gt;파기 개념을 설명하기 위한 예시&lt;/b&gt;다.&lt;/p&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;동일 사용자의 데이터가 다른 파티션에도 존재하는지&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;Snowflake 등에 이미 적재된 데이터가 있는지&lt;/li&gt;
&lt;li&gt;ETL 재실행으로 데이터가 재생성되지 않는지&lt;/li&gt;
&lt;li&gt;파기 대상과 보존 대상이 정확하게 구분되는지&lt;/li&gt;
&lt;li&gt;파기 결과를 검증할 수 있는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;특정 Spark 코드를 실행했다는 사실 자체가 파기 완료를 의미하지는 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. 법적 보존 데이터는 별도로 관리한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;법령에 따라 일정 기간 보존해야 하는 개인정보가 있다면 해당 정보를 무조건 삭제해서도 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 다음과 같이 관리할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
개인정보 항목별 분류
   │
   ├── 보존 필요 없음
   │       &amp;darr;
   │      파기
   │
   └── 법적 보존 필요
           &amp;darr;
       별도 저장&amp;middot;관리
           &amp;darr;
       보존기간 관리
           &amp;darr;
       기간 종료
           &amp;darr;
          파기
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조 제3항은 법령에 따라 보존하는 개인정보를 다른 개인정보와 분리하여 저장&amp;middot;관리하도록 규정하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 법적 보존 대상과 일반 서비스 데이터를 동일한 영역에 계속 보관하는 경우에는 &lt;b&gt;보존 근거, 범위, 기간 및 분리&amp;middot;관리 방법&lt;/b&gt;을 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. 개선 후에는 파기 결과를 검증한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 프로세스를 구축했다면 실제로 데이터가 없어졌는지 검증해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 USER-000123을 파기 대상으로 지정했다고 하자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;13.1 운영 DB 확인&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT *
FROM customer
WHERE user_id = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상 결과:&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;0 rows
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;13.2 Data Lake 확인&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT COUNT(*)
FROM customer
WHERE user_id = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상 결과:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;13.3 Snowflake 확인&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT COUNT(*)
FROM CUSTOMER
WHERE USER_ID = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상 결과:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;13.4 파기 결과 기록&lt;/h2&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;대상 사용자 : USER-000123
파기 요청   : 2026-09-29 10:00
Aurora      : 완료
S3          : 완료
Snowflake   : 완료
검증        : 정상
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 단순히 &lt;b&gt;&amp;ldquo;삭제 명령을 실행했다&amp;rdquo;&lt;/b&gt;는 로그가 아니라,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;삭제 대상이 실제로 존재하지 않는다는 검증 결과&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 남기는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. 실제 점검에서는 어떤 증적을 확인할까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake 환경의 개인정보 파기를 점검한다면 다음과 같은 자료를 확인할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;개인정보 보유기간 정책&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;li&gt;Data Lake 운영정책&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기술적 증적&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 삭제 로그&lt;/li&gt;
&lt;li&gt;CDC 처리 로그&lt;/li&gt;
&lt;li&gt;Kafka 이벤트 처리 로그&lt;/li&gt;
&lt;li&gt;S3 데이터 조회 결과&lt;/li&gt;
&lt;li&gt;S3 삭제 로그&lt;/li&gt;
&lt;li&gt;Snowflake 데이터 처리 로그&lt;/li&gt;
&lt;li&gt;ETL 실행 로그&lt;/li&gt;
&lt;li&gt;파기 배치 실행 로그&lt;/li&gt;
&lt;li&gt;파기 결과 검증 로그&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;담당자 인터뷰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 질문도 유용하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;회원 탈퇴가 발생하면 Data Lake의 개인정보는 어떻게 처리됩니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이미 S3에 적재된 과거 데이터는 어떻게 처리합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;Snowflake에 적재된 데이터는 어떻게 처리합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;법적 보존 대상과 파기 대상은 어떻게 구분합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;파기 결과는 어떻게 검증합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;ETL을 다시 실행했을 때 삭제 대상 데이터가 재생성되지 않도록 어떻게 관리합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 &lt;b&gt;문서에 적힌 절차와 실제 시스템의 동작이 일치하는지&lt;/b&gt;를 함께 확인하는 것이 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 실무 점검 체크리스트&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;처리 목적 달성 후 파기 기준이 정의되어 있는가?&lt;/li&gt;
&lt;li&gt;법적 보존 대상이 식별되어 있는가?&lt;/li&gt;
&lt;li&gt;법적 보존기간이 관리되고 있는가?&lt;/li&gt;
&lt;li&gt;회원 탈퇴와 개인정보 파기 프로세스가 연계되어 있는가?&lt;/li&gt;
&lt;li&gt;운영 DB 외 Data Lake에도 파기 절차가 적용되는가?&lt;/li&gt;
&lt;li&gt;DW 및 분석계에도 파기 절차가 적용되는가?&lt;/li&gt;
&lt;li&gt;백업 및 복제 영역에 대한 관리 기준이 있는가?&lt;/li&gt;
&lt;li&gt;CDC DELETE 이벤트가 적절하게 처리되는가?&lt;/li&gt;
&lt;li&gt;과거 Data Lake 적재 데이터가 파기 대상에서 누락되지 않는가?&lt;/li&gt;
&lt;li&gt;Snowflake 등 분석계에 잔존 데이터가 없는지 확인하는가?&lt;/li&gt;
&lt;li&gt;ETL 재실행으로 삭제 대상 데이터가 재생성되지 않는가?&lt;/li&gt;
&lt;li&gt;파기 결과를 검증하는 절차가 있는가?&lt;/li&gt;
&lt;li&gt;파기 이력이 기록되는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;보존 대상 개인정보 항목이 명확한가?&lt;/li&gt;
&lt;li&gt;보존기간이 명확한가?&lt;/li&gt;
&lt;li&gt;일반 개인정보와 분리하여 저장&amp;middot;관리하는가?&lt;/li&gt;
&lt;li&gt;보존 목적 외 이용을 제한하고 있는가?&lt;/li&gt;
&lt;li&gt;보존기간 종료 후 파기하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 자주 발생하는 판단 오류&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 1. &amp;ldquo;탈퇴했으니 모든 개인정보를 즉시 삭제해야 한다.&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탈퇴 사실만으로 모든 개인정보의 처리&amp;middot;보존 여부를 일률적으로 판단해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 항목별로 처리 목적과 보유기간, 법적 보존 필요성을 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 2. &amp;ldquo;S3에 개인정보가 있으니 무조건 ISMS-P 결함이다.&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3에 개인정보가 존재한다는 사실만으로 판단을 끝내서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 데이터가 아직 필요한지, 법령 등에 따라 보존해야 하는지 먼저 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 3. &amp;ldquo;운영 DB에서 삭제했으니 파기 완료다.&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake, DW, 분석계, 백업 등으로 개인정보가 복제되는 환경에서는 전체 데이터 흐름을 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 4. &amp;ldquo;마스킹했으니 파기했다.&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마스킹과 파기는 목적과 기술적 조치가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 대상 개인정보를 단순히 다른 문자열로 치환한 경우에는 이를 곧바로 파기라고 표현하지 않는 것이 안전하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 5. &amp;ldquo;5일 이내 파기하지 않으면 개인정보 보호법 위반이다.&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조의 법률상 표현은 &lt;b&gt;&amp;ldquo;지체 없이&amp;rdquo;&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조직이 개인정보 처리방침이나 내부 절차에서 별도의 구체적인 파기기한을 정할 수는 있지만, 이를 법률 자체의 문구와 동일하게 표현해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 ISMS-P 누리집의 개인정보 처리방침에서도 법률상 &amp;ldquo;지체 없이&amp;rdquo;라는 원칙과 별도로 내부 절차상 &lt;b&gt;&amp;ldquo;5일 이내&amp;rdquo;&lt;/b&gt;라는 구체적인 기한을 정한 사례를 확인할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 이 사례에서 가장 중요한 판단 흐름&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 사례의 판단은 다음과 같이 정리할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;① 개인정보가 Data Lake에 존재하는가?
                &amp;darr;
② 해당 개인정보가 현재도 필요한가?
                &amp;darr;
③ 계속 보존해야 할 법적 근거가 있는가?
          │
      ┌───┴───┐
      │       │
     없음     있음
      │       │
      ▼       ▼
   3.4.1    3.4.2
      │       │
      ▼       ▼
     파기   분리&amp;middot;관리
      │       │
      └───┬───┘
          &amp;darr;
    보존기간 종료 여부
          &amp;darr;
       종료 시 파기
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 사례에서 가장 중요한 질문은 세 가지다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫째, 해당 개인정보가 더 이상 필요하지 않은 상태인가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;둘째, 계속 보존해야 한다면 명확한 근거가 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;셋째, 파기 또는 보존 조치가 Data Lake&amp;middot;DW&amp;middot;분석계 등 실제 개인정보 처리환경 전체에 적용되고 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. 마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake, DW, AI 분석환경과 같은 현대적인 데이터 처리환경에서는 개인정보가 하나의 DB에만 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서 생성된 개인정보가 아래와 같이 여러 시스템으로 복제될 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;CDC
 &amp;darr;
Kafka
 &amp;darr;
Data Lake
 &amp;darr;
DW
 &amp;darr;
AI 분석
 &amp;darr;
Backup / Archive
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개인정보 파기를 특정 DB의 DELETE 명령에만 의존해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인정보가 어디에 존재하는지 확인하고, 언제까지 필요한지를 판단한 뒤, 불필요하게 된 개인정보가 실제 처리환경에서 파기되었는지를 검증하는 것&lt;/b&gt;이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 ISMS-P 3.4.1과 3.4.2를 적용할 때에는 다음과 같은 흐름으로 접근할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불필요해진 개인정보인가? &amp;rarr; 파기한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;법령 등에 따라 계속 보존해야 하는가? &amp;rarr; 필요한 범위에서 분리&amp;middot;관리한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보존기간이 종료되었는가? &amp;rarr; 다시 파기한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 Data Lake 환경에서 개인정보 파기는 단순한 데이터베이스 작업이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;개인정보의 전체 생명주기를 추적하고, 불필요하게 된 개인정보를 적절한 시점에 파기하며, 계속 보존해야 하는 개인정보는 별도로 관리하는 데이터 관리체계&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 문제라고 볼 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 줄 정리&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;운영 DB에서 삭제했는지가 아니라, 불필요해진 개인정보가 실제로 존재하는 모든 처리환경에서 적절하게 파기되었는지를 확인해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 법적으로 계속 보존해야 하는 개인정보라면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;왜 보존하는가, 무엇을 보존하는가, 언제까지 보존하는가, 어떻게 분리&amp;middot;관리하는가&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 Data Lake 환경에서 ISMS-P 3.4.1과 3.4.2를 적용할 때 중요한 실무 포인트다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;b&gt;ISMS-P 누리집 &amp;mdash; ISMS-P 인증기준&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3. 개인정보 처리단계 요구사항&lt;/li&gt;
&lt;li&gt;3.4 개인정보 파기 시 보호조치&lt;br /&gt;&lt;a href=&quot;https://www.isms-p.or.kr/sysm/intro/selectSysmCertDetail.do?utm_source=chatgpt.com&quot;&gt;ISMS-P 인증기준&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ISMS-P 누리집 &amp;mdash; 자료실&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISMS-P 인증기준 안내서&lt;/li&gt;
&lt;li&gt;ISMS-P 세부점검항목 관련 자료&lt;br /&gt;&lt;a href=&quot;https://www.isms-p.or.kr/ntcn/rcsrm/selectGnrlRcsrmList.do?utm_source=chatgpt.com&quot;&gt;ISMS-P 자료실&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;국가법령정보센터 &amp;mdash; 개인정보 보호법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제21조 개인정보의 파기&lt;br /&gt;&lt;a href=&quot;https://www.law.go.kr/lsInfoP.do?lsiSeq=152302&amp;amp;utm_source=chatgpt.com&quot;&gt;국가법령정보센터 &amp;mdash; 개인정보 보호법&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>#ISMS_P #인증심사 #KISA #개인정보의파기 #3.4 개인정보 파기 #보안결함 #AWS #PostgreSQL #보안담당자 #보안설정</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/105</guid>
      <comments>https://ismsp-case.tistory.com/105#entry105comment</comments>
      <pubDate>Wed, 9 Sep 2026 11:12:48 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안 점검 요약] 파일 및 디렉터리 관리(U-19 ~ U-23) 종합 진단 및 실무 조치 가이드</title>
      <link>https://ismsp-case.tistory.com/104</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ddd.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxqhE0/dJMcaa7RFaO/ApcFtIzJfJkZdVMh7XoFo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxqhE0/dJMcaa7RFaO/ApcFtIzJfJkZdVMh7XoFo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxqhE0/dJMcaa7RFaO/ApcFtIzJfJkZdVMh7XoFo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxqhE0%2FdJMcaa7RFaO%2FApcFtIzJfJkZdVMh7XoFo1%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;1672&quot; height=&quot;941&quot; data-filename=&quot;ddd.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파일 및 디렉터리 보안 그룹(U-19 ~ U-23)에 대한 KISA 보안 가이드라인 분석과 자동 진단 스크립트 해설을 제공합니다. 주요 시스템 설정 파일의 변조 방지와 권한 오남용을 예방하기 위한 자동 진단 로직, 장애를 방지하는 안전한 조치 및 백업 절차를 실무 관점에서 상세히 안내해 드립니다.&lt;/p&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;1. 파일 및 서비스 설정 권한 관리 점검 항목 종합 요약&lt;/h2&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;table-wrapper&quot;&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-streamdown=&quot;table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-streamdown=&quot;table-body&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검코드&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;점검 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;주요 점검 대상 파일&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;판단 기준 (양호)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #101828; text-align: start;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-19&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/hosts 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/hosts&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;소유자가 root이고, 권한이 600 이하인 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-20&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/(x)inetd.conf 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/inetd.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/xinetd.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/xinetd.d/*&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;파일이 미존재하거나, 소유자가 root이고 권한이 600 이하인 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-21&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/(r)syslog.conf 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/syslog.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/rsyslog.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/rsyslog.d/*&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;소유자가 root(또는 syslog)이고, 권한이 640 이하인 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-22&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/services 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;/etc/services&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;소유자가 root이고, 권한이 644 이하인 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-streamdown=&quot;table-row&quot;&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;U-23&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;SUID, SGID, Sticky bit 설정 파일 점검&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;시스템 주요 실행 파일 전체&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;주요 실행 파일의 SUID/SGID 권한이 불필요하게 부여되지 않고 관리되는 경우&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot; data-streamdown=&quot;table-cell&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.1. [U-19] /etc/hosts 파일 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/etc/hosts&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일은 IP 주소와 호스트명을 매핑하는 로컬 네임 해석 파일입니다. DNS 쿼리보다 우선순위가 높기 때문에 악의적인 공격자가 이 파일을 변조할 경우 피싱 사이트 유도, 내부 통신 가로채기(DNS Spoofing 및 중간자 공격)가 발생할 수 있습니다. 따라서 root 소유자 및 일반 사용자의 읽기/쓰기 권한을 엄격히 통제해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-19 점검 코드 식별자 선언
CODE &quot;[ U-19 ] /etc/hosts 파일 소유자 및 권한 설정&quot;

# [상세 해설] /etc/hosts 파일의 실제 존재 여부를 검증
if [ -f /etc/hosts ]; then
    # [상세 해설] ls -l 결과의 3번째 필드(소유자 계정명)를 추출
    OWNER=$(ls -l /etc/hosts | awk '{print $3}')
    # [상세 해설] ls -l 결과의 1번째 필드(권한 문자열 전체)를 추출
    PERMS=$(ls -l /etc/hosts | awk '{print $1}')
    # [상세 해설] 그룹(Group) 권한 3자리 문자열 슬라이싱
    PERM_G=$(echo &quot;$PERMS&quot; | cut -c 5-7)
    # [상세 해설] 기타 사용자(Other) 권한 3자리 문자열 슬라이싱
    PERM_O=$(echo &quot;$PERMS&quot; | cut -c 8-10)

    # [상세 해설] 소유자가 root이며 그룹과 기타 사용자에 모든 권한(---)이 제거되었는지(600 이하) 검증
    if [ &quot;$OWNER&quot; == &quot;root&quot; ] &amp;amp;&amp;amp; [[ &quot;$PERM_G&quot; == &quot;---&quot; &amp;amp;&amp;amp; &quot;$PERM_O&quot; == &quot;---&quot; ]]; then
        OK &quot;/etc/hosts 파일 소유자가 root이고, 권한이 600 이하입니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    else
        WARN &quot;/etc/hosts 파일의 소유자가 root가 아니거나, 권한이 600을 초과합니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    fi
else
    WARN &quot;/etc/hosts 파일이 존재하지 않습니다.&quot; &quot;파일 누락&quot;
fi
FINISH &quot;[ U-19 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: KISA 가이드(600 권한)를 준수하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;chmod 600 /etc/hosts를 적용할 경우, 일반 계정 권한으로 동작하는 웹 애플리케이션(예: Tomcat, Nginx, Node.js 데몬) 또는 컨테이너 프로세스가 로컬 루프백(localhost,&lt;span&gt;&amp;nbsp;&lt;/span&gt;127.0.0.1) 해석에 실패하여 내부 DB 연결 실패나 네트워크 장애를 유발할 수 있습니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전성 검증 절차&lt;/span&gt;: 권한 변경 후 즉시 비인가 일반 계정으로 전환하여 호스트명 해석이 정상 동작하는지 테스트합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;su - nobody -s /bin/bash -c &quot;getent hosts localhost&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대안 권장 아키텍처&lt;/span&gt;: MSA 또는 WAS 데몬이 일반 사용자로 격리 구동되는 환경에서는 쓰기 권한만 제한하고 읽기 권한을 허용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;644(-rw-r--r--) 권한을 표준으로 정의하거나, Ansible 플레이북을 통해 파일 무결성을 실시간 검증하는 방식을 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 파일 백업
cp -p /etc/hosts /etc/hosts.bak_$(date +%Y%m%d)

# 2. 소유자 및 권한 수정 (보안 권고: root 소유, 600 이하 또는 서비스 환경에 맞춘 644)
chown root:root /etc/hosts
chmod 600 /etc/hosts

# 3. 권한 변경 결과 확인
ls -l /etc/hosts&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.2. [U-20] /etc/(x)inetd.conf 파일 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;inetd&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;xinetd는 네트워크 요청을 리스닝하여 하위 서브 데몬을 실행시키는 수퍼 데몬입니다. 이 설정 파일이 변조되면 비인가 악성 서비스가 백그라운드로 자동 구동되거나 서비스 거부(DoS) 상태를 유발할 수 있으므로, root 전용 접근 권한(600)을 설정해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-20 점검 코드 식별자 선언
CODE &quot;[ U-20 ] /etc/(x)inetd.conf 파일 소유자 및 권한 설정&quot;

# [상세 해설] 레거시 슈퍼 데몬 설정 파일 경로 목록 정의
INET_FILES=&quot;/etc/inetd.conf /etc/xinetd.conf&quot;
CHECKED=&quot;FALSE&quot;
VULN_MSG=&quot;&quot;

# [상세 해설] 각 설정 파일의 존재 여부 및 권한을 루프 순회하여 확인
for f in $INET_FILES; do
    if [ -f &quot;$f&quot; ]; then
        CHECKED=&quot;TRUE&quot;
        OWNER=$(ls -l &quot;$f&quot; | awk '{print $3}')
        PERMS=$(ls -l &quot;$f&quot; | awk '{print $1}')
        PERM_G=$(echo &quot;$PERMS&quot; | cut -c 5-7)
        PERM_O=$(echo &quot;$PERMS&quot; | cut -c 8-10)

        # [상세 해설] 소유자가 root가 아니거나 그룹/기타 권한이 '---'가 아닌 경우 취약 문자열에 추가
        if [ &quot;$OWNER&quot; != &quot;root&quot; ] || [[ &quot;$PERM_G&quot; != &quot;---&quot; || &quot;$PERM_O&quot; != &quot;---&quot; ]]; then
            VULN_MSG=&quot;$VULN_MSG $f(소유자:$OWNER, 권한:$PERMS)&quot;
        fi
    fi
done

# [상세 해설] 파일 미존재(최신 systemd 환경) 시 양호 처리, 취약 발견 시 경고 출력
if [ &quot;$CHECKED&quot; == &quot;FALSE&quot; ]; then
    OK &quot;/etc/inetd.conf 및 /etc/xinetd.conf 파일이 존재하지 않습니다.&quot; &quot;해당 네트워크 서비스(슈퍼 데몬) 미사용 환경&quot;
elif [ -n &quot;$VULN_MSG&quot; ]; then
    WARN &quot;inetd/xinetd 관련 파일의 소유자 또는 권한이 취약합니다. (기준: root, 600 이하)&quot; &quot;취약 발견: [ $VULN_MSG ]&quot;
else
    OK &quot;inetd/xinetd 설정 파일의 소유자(root) 및 권한(600 이하)이 안전합니다.&quot; &quot;모든 관련 파일 정상&quot;
fi
FINISH &quot;[ U-20 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: RHEL 8/9, Ubuntu 22.04 등 최신 OS는&lt;span&gt;&amp;nbsp;&lt;/span&gt;systemd&lt;span&gt;&amp;nbsp;&lt;/span&gt;소켓 기반 아키텍처를 기본 채택하므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;xinetd를 거의 사용하지 않습니다. 그러나 레거시 환경에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;xinetd&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/xinetd.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;외에&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/xinetd.d/&lt;span&gt;&amp;nbsp;&lt;/span&gt;디렉터리 내 개별 서비스 설정 파일의 권한을 누락하여 취약점으로 지적되는 경우가 빈번합니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전성 검증 절차&lt;/span&gt;: 설정 파일 권한 수정 후 슈퍼 데몬 서비스의 문법 정상 동작 여부를 확인합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;xinetd -d 2&amp;gt;&amp;amp;1 | head -n 10&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대안 권장 아키텍처&lt;/span&gt;: 슈퍼 데몬 의존 서비스를 점진적으로 독립적인&lt;span&gt;&amp;nbsp;&lt;/span&gt;systemd&lt;span&gt;&amp;nbsp;&lt;/span&gt;서비스(*.service&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;*.socket)로 전환하고 패키지 자체를 삭제(yum remove xinetd)하는 것이 바람직합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 대상 파일 백업
[ -f /etc/xinetd.conf ] &amp;amp;&amp;amp; cp -p /etc/xinetd.conf /etc/xinetd.conf.bak_$(date +%Y%m%d)
[ -d /etc/xinetd.d ] &amp;amp;&amp;amp; cp -rp /etc/xinetd.d /etc/xinetd.d.bak_$(date +%Y%m%d)

# 2. 소유자 및 권한 설정 (600 적용)
if [ -f /etc/xinetd.conf ]; then
    chown root:root /etc/xinetd.conf
    chmod 600 /etc/xinetd.conf
fi

if [ -d /etc/xinetd.d ]; then
    chown -R root:root /etc/xinetd.d
    chmod 600 /etc/xinetd.d/*
fi

# 3. 서비스 리로드 (xinetd 구동 중인 경우)
systemctl reload xinetd 2&amp;gt;/dev/null || systemctl restart xinetd 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.3. [U-21] /etc/(r)syslog.conf 파일 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 로그 데몬 설정 파일(/etc/rsyslog.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;등)은 로그 저장 위치, 로깅 레벨, 원격 SIEM 전송 규칙을 정의합니다. 해당 설정이 비인가자에 의해 변조되면 보안 감사 로그 저장이 누락되거나 침입 흔적이 삭제될 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-21 점검 코드 식별자 선언
CODE &quot;[ U-21 ] /etc/(r)syslog.conf 파일 소유자 및 권한 설정&quot;

# [상세 해설] 전통적인 syslog 및 최신 rsyslog 설정 경로 지정
SYSLOG_FILES=&quot;/etc/syslog.conf /etc/rsyslog.conf&quot;
CHECKED=&quot;FALSE&quot;
VULN_MSG=&quot;&quot;

# [상세 해설] 설정 파일별 소유자 및 권한 추출 검증
for f in $SYSLOG_FILES; do
    if [ -f &quot;$f&quot; ]; then
        CHECKED=&quot;TRUE&quot;
        OWNER=$(ls -l &quot;$f&quot; | awk '{print $3}')
        PERMS=$(ls -l &quot;$f&quot; | awk '{print $1}')
        PERM_G=$(echo &quot;$PERMS&quot; | cut -c 5-7)
        PERM_O=$(echo &quot;$PERMS&quot; | cut -c 8-10)

        # [상세 해설] 소유자가 root가 아니거나, 그룹에 쓰기/실행 권한이 있거나, 기타 사용자에게 권한이 부여된 경우 취약 처리 (640 초과)
        if [ &quot;$OWNER&quot; != &quot;root&quot; ] || echo &quot;$PERM_G&quot; | grep -q &quot;[wx]&quot; || [[ &quot;$PERM_O&quot; != &quot;---&quot; ]]; then
            VULN_MSG=&quot;$VULN_MSG $f(소유자:$OWNER, 권한:$PERMS)&quot;
        fi
    fi
done

# [상세 해설] 진단 결과 판정 분기
if [ &quot;$CHECKED&quot; == &quot;FALSE&quot; ]; then
    INFO &quot;syslog/rsyslog 설정 파일을 찾을 수 없습니다.&quot; &quot;OS 기본 로깅 체계(systemd-journald 등) 환경 수동 확인 요망&quot;
elif [ -n &quot;$VULN_MSG&quot; ]; then
    WARN &quot;syslog 관련 파일의 소유자 또는 권한이 취약합니다. (기준: root, 640 이하)&quot; &quot;취약 발견: [ $VULN_MSG ]&quot;
else
    OK &quot;syslog 설정 파일의 소유자(root) 및 권한(640 이하)이 안전합니다.&quot; &quot;모든 관련 파일 정상&quot;
fi
FINISH &quot;[ U-21 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: Ubuntu/Debian 계열 OS에서는 rsyslog 데몬이&lt;span&gt;&amp;nbsp;&lt;/span&gt;syslog 계정으로 실행됩니다. 설정 파일 및 로그 파일의 권한을 무리하게&lt;span&gt;&amp;nbsp;&lt;/span&gt;root:root 600으로 일괄 변경할 경우 rsyslog 프로세스가 파일을 읽지 못해 서비스가 기동 실패(Failed) 상태로 빠집니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전성 검증 절차&lt;/span&gt;: 설정 변경 후 반드시 rsyslog 자체 문법 검증 플래그를 실행하여 오류를 사전에 방지합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;rsyslogd -N1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대안 권장 아키텍처&lt;/span&gt;: Ubuntu 환경의 경우 소유자를&lt;span&gt;&amp;nbsp;&lt;/span&gt;root:syslog로 지정하고 권한은&lt;span&gt;&amp;nbsp;&lt;/span&gt;640(-rw-r-----)으로 유지하여 데몬 권한과 보안 요구사항을 동시에 충족시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 파일 백업
[ -f /etc/rsyslog.conf ] &amp;amp;&amp;amp; cp -p /etc/rsyslog.conf /etc/rsyslog.conf.bak_$(date +%Y%m%d)
[ -d /etc/rsyslog.d ] &amp;amp;&amp;amp; cp -rp /etc/rsyslog.d /etc/rsyslog.d.bak_$(date +%Y%m%d)

# 2. 소유자 및 권한 부여 (RHEL 계열: root:root / Debian 계열: root:syslog 고려)
chown root:root /etc/rsyslog.conf
chmod 640 /etc/rsyslog.conf

if [ -d /etc/rsyslog.d ]; then
    chown -R root:root /etc/rsyslog.d
    chmod 640 /etc/rsyslog.d/*.conf 2&amp;gt;/dev/null
fi

# 3. 설정 문법 유효성 검증
rsyslogd -N1

# 4. 서비스 재시작
systemctl restart rsyslog&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.4. [U-22] /etc/services 파일 소유자 및 권한 설정&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;/etc/services&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일은 포트 번호와 네트워크 서비스 이름 간의 매핑 테이블을 제공합니다. 악의적인 사용자가 이 파일을 변조하여 표준 포트 번호(예: 22, 80) 매핑을 변경할 경우 정상적인 네트워크 서비스 기동 실패 또는 비인가 서비스로의 트래픽 리다이렉션이 발생할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-22 점검 코드 식별자 선언
CODE &quot;[ U-22 ] /etc/services 파일 소유자 및 권한 설정&quot;

# [상세 해설] /etc/services 파일 존재 유무 검증
if [ -f /etc/services ]; then
    OWNER=$(ls -l /etc/services | awk '{print $3}')
    PERMS=$(ls -l /etc/services | awk '{print $1}')
    PERM_G=$(echo &quot;$PERMS&quot; | cut -c 5-7)
    PERM_O=$(echo &quot;$PERMS&quot; | cut -c 8-10)

    # [상세 해설] 그룹 및 기타 사용자에게 쓰기(w) 및 실행(x) 권한이 없는지(644 이하) 검증
    if [ &quot;$OWNER&quot; == &quot;root&quot; ] &amp;amp;&amp;amp; ! echo &quot;$PERM_G&quot; | grep -q &quot;[wx]&quot; &amp;amp;&amp;amp; ! echo &quot;$PERM_O&quot; | grep -q &quot;[wx]&quot;; then
        OK &quot;/etc/services 파일 소유자가 root이고, 권한이 644 이하입니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    else
        WARN &quot;/etc/services 파일의 소유자가 root가 아니거나, 권한이 644를 초과합니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    fi
else
    WARN &quot;/etc/services 파일이 존재하지 않습니다.&quot; &quot;파일 누락&quot;
fi
FINISH &quot;[ U-22 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 관리자가 보안을 강화하겠다는 목적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/services의 권한을&lt;span&gt;&amp;nbsp;&lt;/span&gt;600&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;640으로 축소하여 일반 계정의 읽기 권한을 차단하는 경우가 있습니다. 이 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;getservbyname()&lt;span&gt;&amp;nbsp;&lt;/span&gt;C 라이브러리 함수를 호출하는 모든 일반 프로세스(DB 클라이언트, 모니터링 에이전트 등)에서 서비스 이름 해석 오류가 발생하여 서비스 장애로 직결됩니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전성 검증 절차&lt;/span&gt;: 권한 변경 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;getent&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 사용하여 정상 조회가 가능한지 즉시 검증합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;getent services ssh
getent services http&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;대안 권장 아키텍처&lt;/span&gt;: 해당 파일은 시스템 표준 참조 데이터이므로 쓰기 권한만 완전히 제거된&lt;span&gt;&amp;nbsp;&lt;/span&gt;644(-rw-r--r--) 상태를 기본 정책으로 유지해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 파일 백업
cp -p /etc/services /etc/services.bak_$(date +%Y%m%d)

# 2. 소유자 및 권한 설정 (644 필수)
chown root:root /etc/services
chmod 644 /etc/services

# 3. 설정 상태 검증
ls -l /etc/services
getent services 22/tcp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;2.5. [U-23] SUID, SGID, Sticky bit 설정 파일 점검&lt;/h3&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;① 점검 목적 및 개요&lt;/h4&gt;
&lt;p style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SUID(4000) 및 SGID(2000) 비트가 부여된 바이너리는 일반 사용자가 실행하더라도 소유자(주로 root)의 권한으로 실행됩니다. 불필요한 시스템 유틸리티에 SUID/SGID가 남아있거나 공격자가 취약한 바이너리를 악용할 경우 로컬 권한 상승(Local Privilege Escalation) 경로로 악용됩니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;② 자동 진단 스크립트 분석&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [상세 해설] U-23 점검 코드 식별자 선언
CODE &quot;[ U-23 ] SUID, SGID, Sticky bit 설정 파일 점검&quot;

# [상세 해설] 검색 대상 주요 시스템 및 데이터 파티션 디렉터리 지정
TARGET_DIRS=&quot;/ /usr /bin /sbin /home /var /tmp /opt&quot;

# [상세 해설] find 명령어로 root 소유의 SUID/SGID 파일 검색 (타임아웃 60초 및 xdev 마운트 격리 적용)
SUID_FILES=$(EXEC_TIMEOUT 60 &quot;find $TARGET_DIRS -xdev -user root -type f \( -perm -04000 -o -perm -02000 \) 2&amp;gt;/dev/null | head -n 5 | xargs&quot;)
EXIT_CODE=$?

# [상세 해설] 검색 타임아웃 발생 및 탐지 결과에 따른 분기 처리
if [ &quot;$EXIT_CODE&quot; -eq 124 ]; then
    INFO &quot;SUID/SGID 파일 검색 중 응답 지연(60초 초과)이 발생하여 점검을 중단했습니다.&quot; &quot;수동 점검 요망&quot;
elif [ -n &quot;$SUID_FILES&quot; ]; then
    INFO &quot;로컬 파티션 내에 SUID/SGID가 설정된 파일이 발견되었습니다. 불필요한 파일인지 수동 검토가 필요합니다.&quot; &quot;발견된 파일(최대 5개): [ $SUID_FILES ]&quot;
else
    OK &quot;지정된 파티션 내에 불필요한 SUID/SGID가 설정된 파일이 발견되지 않았습니다.&quot; &quot;안전한 권한 설정 확인&quot;
fi
FINISH &quot;[ U-23 ] 점검완료&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;③ 보안실무자 J의 노하우 및 장애 방지 포인트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;실무 장애 사례&lt;/span&gt;: 일괄 스크립트를 작성하여 시스템 내 모든 SUID 비트를 일괄 제거(chmod -s)하는 치명적인 실수가 종종 발생합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;passwd,&lt;span&gt;&amp;nbsp;&lt;/span&gt;sudo,&lt;span&gt;&amp;nbsp;&lt;/span&gt;su,&lt;span&gt;&amp;nbsp;&lt;/span&gt;gpasswd,&lt;span&gt;&amp;nbsp;&lt;/span&gt;newgrp&lt;span&gt;&amp;nbsp;&lt;/span&gt;등의 필수 바이너리에서 SUID가 제거되면 일반 사용자의 비밀번호 변경이 불가능해지거나 관리자 권한 상승(sudo)이 불가능하여 전체 인프라 운영 마비가 초래됩니다.&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;주요 제거 권고 대상 목록&lt;/span&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;/usr/bin/traceroute,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr/bin/wall,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr/bin/write&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;/usr/bin/rlogin,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr/bin/rsh,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr/bin/rcp&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;/sbin/netreport,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr/sbin/usernetctl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;안전성 검증 절차&lt;/span&gt;: 권한 제거 전 목록을 백업하고, 제거 후 일반 계정에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;sudo&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;passwd가 정상 구동되는지 즉시 검증합니다.
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;llvm&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;su - testuser -c &quot;passwd --status&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-4&quot; data-ke-size=&quot;size20&quot;&gt;④ 안전한 조치 절차&lt;/h4&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# 1. 시스템 내 전체 SUID/SGID 파일 현황 백업 및 기록
find / -xdev -type f \( -perm -04000 -o -perm -02000 \) -ls &amp;gt; /root/suid_list_$(date +%Y%m%d).txt 2&amp;gt;/dev/null

# 2. 업무상 불필요한 바이너리의 SUID/SGID 제거 예시
chmod -s /usr/bin/traceroute 2&amp;gt;/dev/null || true
chmod -s /usr/bin/write 2&amp;gt;/dev/null || true
chmod -s /usr/bin/wall 2&amp;gt;/dev/null || true

# 3. 변경 결과 확인
ls -l /usr/bin/traceroute /usr/bin/write /usr/bin/wall&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-2&quot; data-ke-size=&quot;size26&quot;&gt;3. 스크립트 한계점 분석 및 예외 처리 개선 제안&lt;/h2&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.1. 기술적 한계점 분석&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #101828; text-align: start;&quot; data-streamdown=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;Include 분할 설정 디렉터리 미검색 문제&lt;/span&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;최신 Linux 배포판은 단일 설정 파일 대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/rsyslog.d/*.conf,&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/xinetd.d/*와 같이 디렉터리 분할 방식을 표준으로 사용합니다. 기존 스크립트는 단일 설정 파일만 검사하여 서브 디렉터리의 취약 권한을 오탐하거나 누락할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;원격 네트워크 파일시스템(NFS/CIFS) 부하 문제&lt;/span&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-streamdown=&quot;unordered-list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;U-23&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목의 경우 대용량 NFS 마운트 포인트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;/mnt나&lt;span&gt;&amp;nbsp;&lt;/span&gt;/data에 위치해 있을 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;-xdev&lt;span&gt;&amp;nbsp;&lt;/span&gt;플래그가 개별 마운트 포인트를 완전히 커버하지 못하거나 I/O 병목을 유발할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;heading-3&quot; data-ke-size=&quot;size23&quot;&gt;3.2. 개선 코드 스니펫&lt;/h3&gt;
&lt;div style=&quot;color: #101828; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #24292e;&quot;&gt;&lt;code&gt;# [개선 스니펫] *.d 디렉터리 내 분할 설정 파일까지 일괄 정밀 진단하는 로직
AUDIT_TARGETS=&quot;/etc/rsyslog.conf $(ls /etc/rsyslog.d/*.conf 2&amp;gt;/dev/null)&quot;
for target in $AUDIT_TARGETS; do
    [ -f &quot;$target&quot; ] || continue
    # stat 명령어를 통한 8진수 권한 및 소유자 정밀 추출
    OCT_PERM=$(stat -c &quot;%a&quot; &quot;$target&quot;)
    FILE_USER=$(stat -c &quot;%U&quot; &quot;$target&quot;)
    if [ &quot;$FILE_USER&quot; != &quot;root&quot; ] || [ &quot;$OCT_PERM&quot; -gt 640 ]; then
        echo &quot;[취약] $target (소유자: $FILE_USER, 권한: $OCT_PERM)&quot;
    fi
done&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-streamdown=&quot;horizontal-rule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&gt;안내문 및 면책조항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #101828; text-align: start;&quot; data-ke-list-type=&quot;disc&quot; data-streamdown=&quot;unordered-list&quot;&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;본 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하시기 바랍니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li data-streamdown=&quot;list-item&quot;&gt;&lt;span data-streamdown=&quot;strong&quot;&gt;리눅스 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서버 진단&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본을 공유받기 원하시는 분은 하단의 비밀 댓글로 이메일 주소&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 남겨 주시면 확인 후 일괄 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;에게 있습니다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.07.28 - [보안취약점점검/보안취약점점검_리눅스] - [리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안 #취약점진단 #보안점검가이드 #서버보안 #호스트파일설정 #로그설정권한 #서비스포트관리 #특수권한관리 #실무보안설정 #시스템엔지니어링 #침해사고예방 #보안가이드라인 #U19 #U20 #U21 #U22 #U23</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/104</guid>
      <comments>https://ismsp-case.tistory.com/104#entry104comment</comments>
      <pubDate>Wed, 9 Sep 2026 11:05:40 +0900</pubDate>
    </item>
    <item>
      <title>Data Lake에 개인정보를 평문으로 저장해도 될까?</title>
      <link>https://ismsp-case.tistory.com/101</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※ 본 글은 ISMS-P 인증심사 및 개인정보보호 실무 학습을 위한 가상의 사례를 바탕으로 작성한 교육용 콘텐츠다. 특정 기업이나 실제 심사 결과를 의미하지 않는다. 시스템 구성, 인터뷰 내용, 증적 및 수치는 이해를 돕기 위해 가공한 예시다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Data Lake에 개인정보를 평문으로 저장해도 될까?&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;mdash; ISMS-P 2.7 관점에서 보는 클라우드 데이터 암호화 통제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS S3와 같은 클라우드 스토리지에 개인정보를 저장하고 Athena, Spark 등의 분석 도구로 활용하는 데이터레이크 환경이 빠르게 늘어나고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 운영 DB에서는 보호되고 있던 개인정보가 &lt;b&gt;분석이나 마케팅 연계를 위해 Data Lake로 이동하는 과정에서 평문으로 저장되는 경우&lt;/b&gt;다.&lt;/p&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;분석 쿼리 성능을 높이기 위해&lt;/li&gt;
&lt;li&gt;외부 CRM API와 바로 매칭하기 위해&lt;/li&gt;
&lt;li&gt;복호화 과정에서 발생하는 처리시간을 줄이기 위해&lt;/li&gt;
&lt;li&gt;기존 시스템과의 호환성을 유지하기 위해&lt;/li&gt;
&lt;li&gt;데이터 처리 구조를 단순화하기 위해&lt;/li&gt;
&lt;/ul&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;운영 DB &amp;rarr; AWS S3 Data Lake &amp;rarr; Athena &amp;rarr; 외부 CRM&lt;/b&gt;으로 이어지는 개인정보 처리 흐름을 살펴보고, ISMS-P 암호화 적용 관점에서 어떤 부분을 확인해야 하는지 정리한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1. 가상 기업 및 운영 환경&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.1 기업 환경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기업&lt;/td&gt;
&lt;td&gt;A사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;서비스&lt;/td&gt;
&lt;td&gt;전자책 구독 및 소장 플랫폼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;회원 규모&lt;/td&gt;
&lt;td&gt;약 350만 명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 개인정보&lt;/td&gt;
&lt;td&gt;이메일, 휴대폰번호, 회원 식별자 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영 DB&lt;/td&gt;
&lt;td&gt;AWS Aurora MySQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Lake&lt;/td&gt;
&lt;td&gt;AWS S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;분석&lt;/td&gt;
&lt;td&gt;AWS Athena&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETL&lt;/td&gt;
&lt;td&gt;PySpark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;외부 연계&lt;/td&gt;
&lt;td&gt;Cloud CRM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 목적&lt;/td&gt;
&lt;td&gt;맞춤형 도서 추천 및 타겟 마케팅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A사는 사용자의 독서 패턴과 구매 이력을 활용한 맞춤형 추천 및 타겟 마케팅 서비스를 신규 도입했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 데이터 흐름은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[Aurora MySQL]
       │
       │ PySpark ETL
       ▼
[AWS S3 Data Lake]
       │
       ├── AWS Athena 분석
       │
       └── Target Group 추출
                  │
                  ▼
          [외부 Cloud CRM]
                  │
                  ├── Email
                  └── App Push
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 &lt;b&gt;Aurora에서는 보호되고 있던 개인정보가 Data Lake에서는 평문으로 저장되는 구조&lt;/b&gt;가 만들어졌다는 점이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 현장에서 확인된 운영 관행&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상의 인터뷰에서는 다음과 같은 답변이 확인됐다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;운영 DB에서는 개인정보를 보호하고 있으며 S3 역시 IAM과 버킷 접근제어를 적용하고 있다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지만 보면 특별한 문제가 없어 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 Data Lake 내부의 실제 데이터 처리 방식을 확인한 결과, S3의 analytics_user_profile 데이터셋에는 외부 CRM API와의 수신자 매칭을 위해 이메일과 휴대폰번호가 평문으로 저장되고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 담당자는 그 이유를 다음과 같이 설명한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;추출 시점에 마스킹이나 해시를 적용하면 CRM에서 수신자를 식별하지 못하는 문제가 발생하기 때문에 Data Lake와 CRM 연동 구간에서는 원본 값을 유지하고 있다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 단순히 &lt;b&gt;왜 평문을 사용했는가&lt;/b&gt;가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 사항을 확인해야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 개인정보에 대해 암호화 정책과 위험분석 결과에 따른 보호조치가 실제 처리환경에 적용되어 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. 데이터 처리 파이프라인에서 발생하는 문제&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상의 ETL 과정은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;raw_user_df = spark.read.jdbc(
    jdbc_url,
    &quot;user_master&quot;,
    properties=connection_properties
)

raw_reading_df = spark.read.jdbc(
    jdbc_url,
    &quot;user_reading_log&quot;,
    properties=connection_properties
)

transformed_df = raw_user_df.join(
    raw_reading_df,
    &quot;user_id&quot;,
    &quot;inner&quot;
).select(
    &quot;user_id&quot;,
    &quot;user_email&quot;,
    &quot;phone_number&quot;,
    &quot;age_group&quot;,
    &quot;gender&quot;,
    &quot;preferred_genre&quot;,
    &quot;last_read_date&quot;
)

transformed_df.write \
    .mode(&quot;overwrite&quot;) \
    .partitionBy(&quot;preferred_genre&quot;) \
    .parquet(
        &quot;s3://analytics-datalake/user_profile/&quot;
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서는 다음과 같은 데이터가 Data Lake에 생성될 수 있다.&lt;/p&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;user_id
user_email
phone_number
age_group
gender
preferred_genre
last_read_date
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 user_email과 phone_number가 원본 문자열 그대로 저장된다면 S3 객체 자체가 직접 식별 가능한 개인정보 저장소가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문에서도 PySpark ETL 과정에서 이메일과 휴대폰번호를 평문 상태로 S3 Parquet 데이터셋에 저장하도록 구성되어 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. &amp;ldquo;S3 접근권한을 잘 막았으니 괜찮다&amp;rdquo;는 판단의 한계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현장에서 자주 나오는 설명 중 하나가 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;S3 버킷은 외부 공개가 차단되어 있고 IAM 권한도 제한되어 있으므로 평문으로 저장해도 안전하다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 암호화와 접근통제는 서로 대체 관계가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 상황을 생각할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;S3
 │
 ├─ IAM 권한
 │    └─ 분석팀 접근 가능
 │
 ├─ Athena
 │    └─ 쿼리 가능
 │
 └─ CRM Pipeline
      └─ 원본 데이터 접근
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IAM 설정이 잘못되거나,&lt;/p&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;분석 계정이 탈취되거나&lt;/li&gt;
&lt;li&gt;역할(Role)이 잘못 위임되거나&lt;/li&gt;
&lt;li&gt;S3 객체가 다른 계정으로 공유되거나&lt;/li&gt;
&lt;li&gt;ETL 작업 권한이 과도하게 부여되거나&lt;/li&gt;
&lt;li&gt;데이터가 임시 스테이징 영역으로 복사되는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평문 데이터가 그대로 노출될 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 점검에서는 단순히&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;S3가 외부에서 접근되지 않는다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만 확인할 것이 아니라,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개인정보가 저장&amp;middot;전송&amp;middot;전달되는 각 구간에 어떤 보호조치가 적용되어 있는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. ISMS-P에서는 어떤 기준을 확인해야 할까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사례의 핵심 기준은 &lt;b&gt;ISMS-P 2.7 암호화 적용&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 ISMS-P 인증기준에서도 2.7은 &lt;b&gt;&amp;lsquo;암호화 적용&amp;rsquo;&lt;/b&gt; 항목으로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세부적으로는 다음 사항을 중심으로 확인할 필요가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;암호정책 적용&lt;/h3&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;관련 법적 요구사항을 반영했는가?&lt;/li&gt;
&lt;li&gt;개인정보 유형별 암호화 기준이 있는가?&lt;/li&gt;
&lt;li&gt;저장 시 암호화가 필요한 데이터가 정의되어 있는가?&lt;/li&gt;
&lt;li&gt;전송&amp;middot;전달 구간에 암호화가 적용되는가?&lt;/li&gt;
&lt;li&gt;안전한 암호 알고리즘 및 보안강도를 사용하는가?&lt;/li&gt;
&lt;li&gt;암호화 예외가 있다면 근거와 승인절차가 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;암호키 관리&lt;/h3&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;KMS 등 안전한 키 관리수단을 사용하는가?&lt;/li&gt;
&lt;li&gt;키 접근권한이 최소화되어 있는가?&lt;/li&gt;
&lt;li&gt;키의 생성&amp;middot;변경&amp;middot;폐기 절차가 존재하는가?&lt;/li&gt;
&lt;li&gt;운영환경과 개발환경의 키가 분리되어 있는가?&lt;/li&gt;
&lt;li&gt;키가 소스코드나 설정파일에 하드코딩되어 있지 않은가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사례에서는 단순히 S3의 암호화 기능 활성화 여부만 확인할 것이 아니라 &lt;b&gt;조직의 암호화 정책에서 해당 데이터와 처리구간을 어떻게 정의하고 있는지&lt;/b&gt;를 먼저 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 개인정보 보호법 제29조와 함께 확인해야 하는 이유&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제29조는 개인정보처리자가 개인정보의 유출 등을 방지하기 위해 대통령령에서 정하는 바에 따라 안전성 확보에 필요한 기술적&amp;middot;관리적&amp;middot;물리적 조치를 하도록 규정하고 있다. 현재 법령에도 이러한 안전조치의무가 규정되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 시행령 제30조에서는 접근권한 제한 등 개인정보의 안전성 확보를 위한 구체적인 조치를 규정하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 개인정보보호위원회는 2024년 「개인정보의 안전성 확보조치 기준 안내서」를 공개하면서 개정된 안전성 확보조치 기준과 문의사례 등을 반영했다고 안내하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 사례를 단순히&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;S3에 평문 저장했으니 법 위반이다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 결론내리는 것은 적절하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다 정확한 접근은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 개인정보의 종류와 처리환경에 적용되는 안전조치 요구사항을 확인하고, 내부 암호화 정책 및 위험분석 결과에 따라 적절한 보호조치가 적용되어 있는지를 확인한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 평문 저장이라는 사실 자체만으로 모든 법적 판단이 끝나는 것이 아니라 &lt;b&gt;해당 환경에 요구되는 보호조치와 실제 운영상태를 함께 확인해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 마스킹과 암호화는 같은 조치가 아니다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 자주 혼동하는 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;마스킹&lt;/td&gt;
&lt;td&gt;화면 등에서 개인정보 표시 제한&lt;/td&gt;
&lt;td&gt;ab***@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;암호화&lt;/td&gt;
&lt;td&gt;원본 데이터를 암호문으로 변환하여 보호&lt;/td&gt;
&lt;td&gt;AES 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;해시&lt;/td&gt;
&lt;td&gt;특정 값을 다른 값으로 변환&lt;/td&gt;
&lt;td&gt;SHA-256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가명처리&lt;/td&gt;
&lt;td&gt;추가정보 등을 이용하지 않고는 특정 개인을 알아보기 어렵게 처리&lt;/td&gt;
&lt;td&gt;가명 식별자 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 표현은 주의해야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이메일을 화면에서 ab***@example.com으로 표시했으므로 암호화했다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;이고 저장 데이터에 대한 암호화와는 별개의 보호조치다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문에서도 웹 Dashboard에서는 이메일 일부를 마스킹하고 있었지만, 실제 S3 Parquet 데이터셋에서는 이메일과 휴대폰번호를 평문으로 유지하는 구조가 확인된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. SHA-256을 적용하면 개인정보가 없어지는가?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 역시 자주 나오는 오해다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 처리했다고 가정한다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;.withColumn(
    &quot;user_hash_id&quot;,
    sha2(col(&quot;user_id&quot;), 256)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 생성된 값은 원래의 user_id 대신 사용할 수 있는 식별자로 활용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 단순히 SHA-256을 적용했다는 사실만으로 &lt;b&gt;자동으로 가명처리가 완료되거나 개인정보 위험이 사라지는 것은 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이메일이나 전화번호처럼 가능한 원본값의 범위가 제한된 데이터는 추측이나 대조를 통해 원본을 알아낼 가능성을 검토해야 한다.&lt;/p&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;어떤 값을 해시하는가?&lt;/li&gt;
&lt;li&gt;Salt 또는 별도 비밀값을 사용하는가?&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;SHA-256 적용 = 안전&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라는 단순한 공식으로 판단해서는 안 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. Data Lake에서는 저장영역을 분리하는 것이 중요하다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보가 필요한 모든 분석 작업에 원본 이메일과 전화번호를 제공하는 구조는 피할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 영역을 구분할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;                    ┌─────────────────────┐
                    │    Aurora MySQL     │
                    │  원본 개인정보 관리  │
                    └──────────┬──────────┘
                               │
                         ETL / 통제
                               │
                ┌──────────────▼──────────────┐
                │       Restricted Zone       │
                │ 최소한의 원본 개인정보      │
                │ 접근권한 최소화              │
                └──────────────┬──────────────┘
                               │
                       가명/분석 데이터
                               │
                ┌──────────────▼──────────────┐
                │       Analytics Zone        │
                │ 가명식별자 중심 분석         │
                │ Athena 조회                 │
                └──────────────┬──────────────┘
                               │
                       필요한 경우에만
                               │
                ┌──────────────▼──────────────┐
                │        CRM Zone             │
                │ 목적에 필요한 데이터만 전달 │
                └─────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;모든 데이터셋에서 동일한 수준의 개인정보를 사용할 필요가 없도록 설계하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석업무에 이메일 주소가 필요하지 않다면 분석영역까지 원본 이메일을 전달하지 않는 것이 더 적절한 통제가 될 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 외부 CRM 연동에서는 별도의 통제가 필요하다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 Cloud CRM을 사용한다면 암호화 문제만 확인해서는 부족하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 사항도 별도로 확인할 필요가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;처리 목적&lt;/h3&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;처리 목적과 실제 CRM 활용 범위가 일치하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;외부 제공&amp;middot;위탁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 CRM 사업자의 역할은 무엇인가?&lt;/li&gt;
&lt;li&gt;개인정보 처리위탁에 해당하는가?&lt;/li&gt;
&lt;li&gt;제3자 제공에 해당하는가?&lt;/li&gt;
&lt;li&gt;계약 및 관리&amp;middot;감독 절차가 마련되어 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;국외 이전&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRM 서비스의 데이터 저장 위치는 어디인가?&lt;/li&gt;
&lt;li&gt;국외 이전이 발생하는가?&lt;/li&gt;
&lt;li&gt;발생한다면 관련 절차가 적용되어 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전송구간&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRM API 통신구간이 안전하게 암호화되어 있는가?&lt;/li&gt;
&lt;li&gt;API 인증정보와 키가 안전하게 관리되는가?&lt;/li&gt;
&lt;li&gt;스테이징 영역에 생성된 파일은 언제 삭제되는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글의 가상 시나리오만으로는 위 사항의 구체적인 사실관계를 확인할 수 없으므로 &lt;b&gt;별도의 검토 항목으로 분리하는 것이 적절하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. 기술적으로는 &amp;ldquo;암호화 위치&amp;rdquo;를 설계해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화를 적용한다고 해서 모든 데이터를 동일한 방식으로 암호화하면 되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 분석용 데이터에 다음과 같은 구조가 있을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;user_hash_id
email_ciphertext
phone_ciphertext
age_group
gender
preferred_genre
last_read_date
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석팀은 대부분의 작업에서 email_ciphertext, phone_ciphertext를 직접 사용할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Athena에서는 다음과 같이 분석용 View를 제공하는 방식도 검토할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;CREATE VIEW analytics_user_summary AS
SELECT
    user_hash_id,
    age_group,
    gender,
    preferred_genre,
    last_read_date
FROM user_profile;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 일반 분석업무에서 원본 이메일이나 전화번호에 직접 접근할 필요가 줄어든다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. CRM 발송 시에는 필요한 시점에만 식별정보를 사용한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRM 발송 때문에 이메일과 전화번호가 반드시 필요한 경우에도 전체 분석환경에 원본 개인정보를 노출할 필요는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 영역을 분리할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;[Analytics]

user_hash_id
     │
     │ target_user 선정
     ▼
[Restricted CRM Mapping]
     │
     │ 필요한 사용자만 매핑
     ▼
email / phone
     │
     │ 암호화된 API 통신
     ▼
[External CRM]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조의 핵심은 &lt;b&gt;분석 목적과 발송 목적의 데이터 요구사항을 분리하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석팀 전체가 이메일과 전화번호를 볼 필요가 없다면 해당 권한을 제공하지 않는 것이 바람직하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. 암호키는 데이터와 분리해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화를 적용하면서도 다음과 같은 구조라면 문제가 된다.&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;aes_encrypt(
    email,
    &quot;MY_AES_KEY_123456&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 실제 운영환경에서 키가 다음과 같이 저장되는 것은 피해야 한다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;소스코드
설정파일
Git Repository
배치 스크립트
Docker Image
로그 파일
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 환경이라면 KMS 등 적절한 키 관리수단을 활용하고, 애플리케이션이나 ETL 작업에는 필요한 권한만 부여하는 구조를 검토할 수 있다.&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;PySpark ETL
     │
     │ IAM Role
     ▼
AWS KMS
     │
     ▼
암호키 사용
     │
     ▼
S3 암호화 데이터
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 중요한 것은 단순히 &amp;ldquo;KMS를 사용한다&amp;rdquo;가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;누가 어떤 키를 어떤 목적으로 사용할 수 있는지까지 통제하는 것&lt;/b&gt;이 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. 심사에서는 어떤 증적을 확인할까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같은 환경이라면 다음 자료를 확인할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정책&amp;middot;관리 측면&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;암호화 대상 정의&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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS 환경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S3 Bucket Policy&lt;/li&gt;
&lt;li&gt;IAM Policy&lt;/li&gt;
&lt;li&gt;IAM Role&lt;/li&gt;
&lt;li&gt;KMS Key Policy&lt;/li&gt;
&lt;li&gt;S3 기본 암호화 설정&lt;/li&gt;
&lt;li&gt;CloudTrail&lt;/li&gt;
&lt;li&gt;S3 접근 로그&lt;/li&gt;
&lt;li&gt;Athena Workgroup 및 접근권한&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ETL&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PySpark 소스코드&lt;/li&gt;
&lt;li&gt;ETL 배치 설정&lt;/li&gt;
&lt;li&gt;실행계정&lt;/li&gt;
&lt;li&gt;Secrets 관리방식&lt;/li&gt;
&lt;li&gt;암호화 적용 여부&lt;/li&gt;
&lt;li&gt;임시파일 생성 위치&lt;/li&gt;
&lt;li&gt;스크립트 내 개인정보 및 암호키 노출 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;외부 CRM&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;개인정보 처리위탁 관련 자료&lt;/li&gt;
&lt;li&gt;API 연계 명세&lt;/li&gt;
&lt;li&gt;전송구간 암호화 설정&lt;/li&gt;
&lt;li&gt;API 인증정보 관리&lt;/li&gt;
&lt;li&gt;데이터 보관 및 삭제정책&lt;/li&gt;
&lt;li&gt;국외 이전 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 인터뷰에서 확인하면 좋은 질문&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 심사나 내부 점검이라면 다음 질문이 유용하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;질문 1&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서는 암호화되어 있는데 Data Lake에서는 평문으로 저장하는 이유는 무엇인가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;CRM API가 필요해서&amp;rdquo;라는 답변에서 끝내지 않고 &lt;b&gt;정책상 예외인지, 위험분석을 했는지&lt;/b&gt;를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;질문 2&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이메일과 전화번호에 대해 암호화 대상 여부를 어떤 기준으로 판단했는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화 정책과 실제 운영환경이 일치하는지 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;질문 3&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3에서 원본 이메일과 전화번호를 조회할 수 있는 사람은 누구인가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IAM 권한과 실제 업무상 필요성을 비교한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;질문 4&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Athena 분석 담당자가 원본 이메일을 조회해야 하는 업무가 있는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무상 필요성과 최소권한 원칙을 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;질문 5&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CRM 발송용으로 생성된 임시 파일은 언제 삭제되는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평문 데이터가 별도의 스테이징 영역으로 복제되는지를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;질문 6&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호키는 어디에서 관리하고 누가 접근할 수 있는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호키 관리 기준과 실제 운영환경이 일치하는지 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 자주 발생하는 판단 오류&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 1. &amp;ldquo;S3는 Private이니까 괜찮다&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S3 접근통제는 중요한 보호조치지만 암호화 정책 적용 여부와 동일한 개념은 아니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 2. &amp;ldquo;마스킹했으니까 암호화했다&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마스킹과 암호화는 서로 다른 보호조치다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 3. &amp;ldquo;SHA-256이면 개인정보가 아니다&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 결과가 개인과 연결될 가능성이 있는지 별도로 검토해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 4. &amp;ldquo;KMS를 사용하니까 암호화 통제는 끝났다&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키 관리수단을 사용하더라도 실제 데이터가 암호화되어 있는지, 어떤 데이터가 암호화 대상인지, 접근권한이 적절한지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 5. &amp;ldquo;CRM 때문에 평문이 필요하므로 예외다&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무상 필요성이 있다는 것과 암호화 정책상 적절한 예외라는 것은 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외를 허용한다면 최소한 다음 사항을 확인할 필요가 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;업무상 필요성
      &amp;darr;
위험분석
      &amp;darr;
대체 보호조치 검토
      &amp;darr;
예외 승인
      &amp;darr;
접근권한 최소화
      &amp;darr;
기간&amp;middot;범위 제한
      &amp;darr;
정기 재검토
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 이 사례에서 개선된 데이터 구조&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 구조가 다음과 같았다면,&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;Aurora
  &amp;darr;
PySpark
  &amp;darr;
S3
  ├─ email 평문
  ├─ phone 평문
  └─ 분석 데이터
       &amp;darr;
    Athena
       &amp;darr;
    CRM
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개선 구조는 다음과 같이 설계할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Aurora
  │
  ▼
PySpark ETL
  │
  ├───────────────┐
  │               │
  ▼               ▼
Restricted      Analytics
Zone            Zone
  │               │
  │             가명식별자
  │               │
  │               ▼
  │             Athena
  │               │
  └───────┬───────┘
          │
     필요한 사용자만
          │
          ▼
    CRM Mapping
          │
      암호화 전송
          │
          ▼
     External CRM
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서 중요한 것은 &lt;b&gt;원본 개인정보를 무조건 없애는 것만이 목표가 아니라, 원본 개인정보에 접근해야 하는 범위 자체를 줄이는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. 사후 검증은 &amp;ldquo;암호화 설정이 켜져 있는가&amp;rdquo;에서 끝나면 안 된다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 점검에서는 다음을 함께 확인하는 것이 좋다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;S3&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;□ 저장 데이터 암호화 설정
□ Bucket Policy
□ IAM Role
□ Object 접근권한
□ Public Access 차단
□ KMS Key Policy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Athena&lt;/h2&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;□ 테이블/뷰 접근권한
□ 원본 개인정보 컬럼 노출 여부
□ 쿼리 권한
□ Query Result 저장 위치
□ Query Result에 개인정보 포함 여부
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ETL&lt;/h2&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;□ 원본 데이터 접근권한
□ 임시파일
□ 로그 내 개인정보 포함 여부
□ 스크립트 내 암호키 존재 여부
□ Secrets 관리방식
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CRM&lt;/h2&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;□ 전송 데이터 최소화
□ API 인증정보 관리
□ 전송구간 보호
□ 스테이징 데이터 삭제
□ 외부 서비스 보관기간
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;19. &amp;ldquo;암호화 적용&amp;rdquo;과 &amp;ldquo;데이터 최소화&amp;rdquo;를 함께 봐야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 사례에서 가장 중요한 실무 포인트는 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;암호화만 적용한다고 개인정보 보호 문제가 모두 해결되는 것은 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 분석팀이 실제로 이메일 주소를 필요로 하지 않는다면,&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;이메일 평문
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;암호화된 이메일
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 바꾸는 것보다 더 근본적인 방법은&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;이메일 자체를 분석 영역에서 제거
&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;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;원본 개인정보
     &amp;darr;
필요성 검토
     &amp;darr;
불필요한 정보 제거
     &amp;darr;
필요한 데이터만 가명화/암호화
     &amp;darr;
접근권한 최소화
     &amp;darr;
전송구간 보호
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같은 순서로 설계하는 것이 효과적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 최종 점검 체크리스트&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점검항목확인&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개인정보 처리현황 파악&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개인정보 유형별 암호화 대상 정의&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;암호화 정책 수립&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장 시 암호화 적용&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전송&amp;middot;전달 구간 암호화&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;안전한 암호 알고리즘 사용&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;암호키 관리절차 수립&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KMS 등 키 관리수단 적용&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;키 접근권한 최소화&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Lake 접근권한 최소화&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;분석영역 원본 개인정보 최소화&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Athena 조회권한 제한&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRM 연계 데이터 최소화&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스테이징 데이터 관리&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;로그 내 개인정보 노출 여부 확인&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;외부 CRM 위탁&amp;middot;제공 여부 검토&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;국외 이전 여부 검토&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;정기적인 통제 검증&lt;/td&gt;
&lt;td&gt;□&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;21. 이번 사례에서 얻을 수 있는 실무적인 교훈&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake 환경에서는 개인정보가 한 번만 저장되는 것이 아니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;운영 DB
 &amp;darr;
ETL
 &amp;darr;
Raw Data
 &amp;darr;
Cleansed Data
 &amp;darr;
Analytics Data
 &amp;darr;
Athena 결과
 &amp;darr;
Staging
 &amp;darr;
CRM
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 여러 단계로 복제되면서 &lt;b&gt;원래 DB에서는 존재하지 않던 새로운 개인정보 저장소가 만들어질 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개인정보 보호 담당자는 운영 DB만 확인해서는 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 질문을 함께 확인해야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이 개인정보가 실제로 어디까지 복제되고 있는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 다음 질문은 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;각 구간에서 이 개인정보를 정말 원본 형태로 가지고 있어야 하는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;원본이 필요한 구간에서는 어떤 암호화&amp;middot;접근통제&amp;middot;키 관리가 적용되어 있는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;22. 마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 Data Lake 환경에서 개인정보 보호의 핵심은 단순히 &lt;b&gt;&amp;ldquo;S3 암호화를 켜는 것&amp;rdquo;&lt;/b&gt;이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 운영환경에서는 다음 네 가지를 함께 봐야 한다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;① 어떤 개인정보를 보유하는가?
        &amp;darr;
② 어디까지 복제되는가?
        &amp;darr;
③ 누가 원본을 볼 수 있는가?
        &amp;darr;
④ 저장&amp;middot;전송&amp;middot;키 관리 보호조치가 적절한가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 ISMS-P 관점에서는 &lt;b&gt;2.7 암호화 적용&lt;/b&gt;을 중심으로 법적 요구사항, 암호화 대상, 암호강도, 저장&amp;middot;전송&amp;middot;전달 구간의 보호조치가 실제 운영환경에 적용되어 있는지 확인하는 것이 중요하다. 현재 ISMS-P 공식 인증기준에서도 2.7은 &amp;lsquo;암호화 적용&amp;rsquo;으로 분류되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제29조 역시 개인정보의 유출 등을 방지하기 위해 필요한 안전성 확보조치를 요구하고 있으며, 시행령 제30조에서 접근권한 제한 등 구체적인 안전조치 사항을 규정하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 암호화만으로 끝내지 않고 &lt;b&gt;데이터 최소화 &amp;rarr; 접근권한 최소화 &amp;rarr; 가명화/암호화 &amp;rarr; 안전한 전송 &amp;rarr; 암호키 관리 &amp;rarr; 지속적인 검증&lt;/b&gt;까지 하나의 통제로 연결해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 Data Lake의 개인정보 보호는 특정 AWS 설정 하나의 문제가 아니라,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터가 생성되는 순간부터 분석&amp;middot;연계&amp;middot;삭제되는 순간까지 개인정보의 전체 흐름을 통제하는 문제&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 보는 것이 실무적으로 더 적절하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개인정보 보호법 제29조(안전조치의무) &amp;mdash; 국가법령정보센터&lt;/li&gt;
&lt;li&gt;개인정보 보호법 시행령 제30조(개인정보의 안전성 확보 조치) &amp;mdash; 국가법령정보센터&lt;/li&gt;
&lt;li&gt;ISMS-P 인증기준 &amp;mdash; 2.7 암호화 적용&lt;/li&gt;
&lt;li&gt;개인정보의 안전성 확보조치 기준 안내서 &amp;mdash; 개인정보보호위원회&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>#ISMS_P #인증심사 #KISA #개인정보의암호화 #2.7 암호화 #보안결함 #AWS_S3 #PySpark #보안담당자 #보안설정</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/101</guid>
      <comments>https://ismsp-case.tistory.com/101#entry101comment</comments>
      <pubDate>Tue, 8 Sep 2026 09:56:26 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안취약점 점검] 파일 및 디렉터리 관리 U-14~U-18 자동화 스크립트 분석</title>
      <link>https://ismsp-case.tistory.com/100</link>
      <description>&lt;blockquote style=&quot;color: #101828; text-align: start;&quot; data-streamdown=&quot;blockquote&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aaa.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPsLhO/dJMcaf2c5Hd/fJWbjkl1rzDrJBfuRyb8F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPsLhO/dJMcaf2c5Hd/fJWbjkl1rzDrJBfuRyb8F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPsLhO/dJMcaf2c5Hd/fJWbjkl1rzDrJBfuRyb8F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPsLhO%2FdJMcaf2c5Hd%2FfJWbjkl1rzDrJBfuRyb8F0%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;1376&quot; height=&quot;768&quot; data-filename=&quot;aaa.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 서버의 파일과 디렉터리는 단순히 데이터를 저장하는 공간이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd, /etc/shadow와 같은 계정&amp;middot;인증 파일부터 시스템 시작 과정에서 실행되는 스크립트, 관리자 환경변수, 애플리케이션이 생성한 파일까지 운영체제의 주요 기능이 파일 시스템을 통해 연결되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 파일 하나의 소유자나 권한이 잘못 설정되거나, 관리자의 PATH에 안전하지 않은 경로가 포함되어 있는 경우 단순한 설정 오류를 넘어 &lt;b&gt;권한 상승이나 인증정보 노출, 시스템 기동 과정의 악성 코드 실행&lt;/b&gt;으로 이어질 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 파일 및 디렉터리 관리 영역의 &lt;b&gt;U-14~U-18&lt;/b&gt;을 대상으로 현재 사용 중인 자동 진단 스크립트가 실제로 어떤 범위를 검사하는지 분석한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 자동화 점검 결과만 보고 파일을 삭제하거나 권한을 일괄 변경하면 정상적인 서비스까지 영향을 받을 수 있으므로, &lt;b&gt;점검 결과의 의미와 조치 시 주의해야 할 부분을 함께 확인하는 것&lt;/b&gt;을 목적으로 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. U-14~U-18에서 무엇을 확인하는가&lt;/h2&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;&lt;b&gt;실행 경로의 안전성&lt;/b&gt; &amp;rarr; U-14&lt;/li&gt;
&lt;li&gt;&lt;b&gt;소유자가 사라진 파일의 존재 여부&lt;/b&gt; &amp;rarr; U-15&lt;/li&gt;
&lt;li&gt;&lt;b&gt;계정 및 인증 관련 핵심 파일 보호&lt;/b&gt; &amp;rarr; U-16, U-18&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 시작 과정에서 실행되는 파일 보호&lt;/b&gt; &amp;rarr; U-17&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.60465%;&quot;&gt;점검코드&lt;/td&gt;
&lt;td style=&quot;width: 23.3721%;&quot;&gt;점검 명칭&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%;&quot;&gt;주요 점검 대상&lt;/td&gt;
&lt;td style=&quot;width: 34.3023%;&quot;&gt;현재 스크립트의 핵심 검사&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;위험도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.60465%;&quot;&gt;U-14&lt;/td&gt;
&lt;td style=&quot;width: 23.3721%;&quot;&gt;root 홈, 패스 디렉터리 권한 및 패스 설정&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%;&quot;&gt;$PATH, /etc/profile, root 환경 설정&lt;/td&gt;
&lt;td style=&quot;width: 34.3023%;&quot;&gt;현재 PATH에 . 또는 빈 경로가 포함되는지 확인&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.60465%;&quot;&gt;U-15&lt;/td&gt;
&lt;td style=&quot;width: 23.3721%;&quot;&gt;소유자 없는 파일 및 디렉터리 존재 여부&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%;&quot;&gt;/, /home, /var, /tmp, /usr, /opt&lt;/td&gt;
&lt;td style=&quot;width: 34.3023%;&quot;&gt;nouser 또는 nogroup 파일을 검색&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.60465%;&quot;&gt;U-16&lt;/td&gt;
&lt;td style=&quot;width: 23.3721%;&quot;&gt;/etc/passwd 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%;&quot;&gt;/etc/passwd&lt;/td&gt;
&lt;td style=&quot;width: 34.3023%;&quot;&gt;소유자와 Group/Other의 쓰기&amp;middot;실행 권한 확인&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.60465%;&quot;&gt;U-17&lt;/td&gt;
&lt;td style=&quot;width: 23.3721%;&quot;&gt;시스템 시작 스크립트 권한 설정&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%;&quot;&gt;/etc/rc.d, /etc/init.d, /etc/systemd/system 등&lt;/td&gt;
&lt;td style=&quot;width: 34.3023%;&quot;&gt;Other 쓰기 권한이 있는 파일 검색&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.60465%;&quot;&gt;U-18&lt;/td&gt;
&lt;td style=&quot;width: 23.3721%;&quot;&gt;/etc/shadow 파일 소유자 및 권한 설정&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%;&quot;&gt;/etc/shadow&lt;/td&gt;
&lt;td style=&quot;width: 34.3023%;&quot;&gt;root 소유 여부와 400/000, 600/640 권한을 구분하여 확인&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의:&lt;/b&gt; 위 표는 일반적인 보안 가이드의 모든 판단 요소가 아니라 &lt;b&gt;현재 사용 중인 자동화 스크립트가 실제로 검사하는 범위&lt;/b&gt;를 기준으로 작성했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. U-14 &amp;mdash; PATH가 공격 경로가 될 수 있는 이유&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1 점검 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자가 Linux에서 명령어를 입력하면 Shell은 PATH에 등록된 디렉터리를 순서대로 검색하여 실행할 프로그램을 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 PATH가 있다고 가정한다.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;PATH=.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 디렉터리인 .이 PATH의 가장 앞에 있기 때문에 관리자가 단순히 다음 명령을 실행했을 때,&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 디렉터리에 공격자가 만들어 놓은 ls라는 실행 파일이 있다면 시스템의 정상적인 /usr/bin/ls보다 먼저 실행될 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 root 계정의 PATH에는 현재 디렉터리나 빈 경로가 포함되지 않도록 구성하는 것이 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.2 현재 자동화 스크립트가 검사하는 것&lt;/h2&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# [상세 해설] U-14 점검 항목 시작 알림
CODE &quot;[ U-14 ] root 홈, 패스 디렉터리 권한 및 패스 설정&quot;

# [상세 해설] echo &quot;$PATH&quot; 출력을 확장 정규식으로 검사
# 정규식 패턴 분석:
#   - \. : 현재 디렉터리를 나타내는 점(dot) 포함 여부
#   - \:\: : 디렉터리 경로 누락으로 빈 경로(현재 디렉터리로 간주됨)가 발생하는 이중 콜론
#   - \:$ : PATH 문자열 끝에 콜론이 위치하여 현재 디렉터리가 마지막 검색 경로로 잡히는 형태
#   - ^\: : PATH 문자열 시작에 콜론이 위치하여 현재 디렉터리가 최우선 검색 경로로 잡히는 형태
if echo &quot;$PATH&quot; | grep -E -q &quot;\.|\:\:|\:$|^\:&quot;; then
    WARN &quot;root 계정의 PATH 환경변수에 '.' 또는 빈 경로가 포함되어 있습니다.&quot; &quot;현재 PATH=$PATH&quot;
else
    OK &quot;root 계정의 PATH 환경변수에 '.' 또는 빈 경로가 안전하게 제거되어 있습니다.&quot; &quot;현재 PATH=$PATH&quot;
fi

FINISH &quot;[ U-14 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.3 이 스크립트의 판정 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-14는 현재 Shell에 로드되어 있는 $PATH 문자열을 대상으로 다음 패턴을 검색한다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;.
::
:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확히는 다음과 같은 형태를 위험 요소로 검색한다.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;PATH=.:/usr/bin
PATH=/usr/bin:.
PATH=/usr/bin::/bin
PATH=:/usr/bin
PATH=/usr/bin:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 현재 스크립트에서는 위험한 패턴이 발견되면 WARN, 발견되지 않으면 OK가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 부분은 &lt;b&gt;현재 스크립트가 /etc/profile, /root/.bashrc, /etc/profile.d/*.sh 등을 직접 하나씩 분석하는 것이 아니라 현재 $PATH 값을 검사한다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 어떤 설정 파일에서 PATH가 만들어졌는지를 추적하는 기능은 별도로 포함되어 있지 않다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.4 운영 환경에서 확인할 사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 PATH를 먼저 확인한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;echo &quot;$PATH&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위험한 패턴을 별도로 확인할 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;echo &quot;$PATH&quot; | grep -E &quot;(^\:|\:\:|\:$|\.\/|\:\.\:|\:\.$)&quot;
&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;또한 PATH를 변경하기 전에 다음 설정 파일들을 함께 확인하는 것이 안전하다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/etc/profile
/root/.bash_profile
/root/.bashrc
/etc/profile.d/*.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.5 실무에서 자주 놓치는 부분&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 애플리케이션 설치 스크립트나 개발 환경에서는 편의를 위해 다음과 같은 설정을 추가하는 경우가 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export PATH=.:$PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 CI/CD Agent나 개발자가 사용하는 환경에서는 이런 설정이 의도적으로 들어갈 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 .을 발견했다고 바로 삭제하기보다 &lt;b&gt;어떤 설정 파일에서 추가되었는지와 해당 환경에서 왜 필요한지를 먼저 확인하는 것이 필요하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안점검에서는 위험한 설정을 제거하는 것만큼 &lt;b&gt;기존 운영 환경의 의존성을 확인하는 과정&lt;/b&gt;도 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.6 안전한 조치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 전에 관련 파일을 백업한다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/profile /etc/profile.bak_$(date +%Y%m%d)
cp -p /root/.bash_profile /root/.bash_profile.bak_$(date +%Y%m%d) 2&amp;gt;/dev/null
cp -p /root/.bashrc /root/.bashrc.bak_$(date +%Y%m%d) 2&amp;gt;/dev/null
&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;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export PATH=.:$PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 환경에 맞는 절대 경로 기반 PATH로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 후에는 새 Shell에서 실제 적용값을 확인한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;source /etc/profile
echo &quot;$PATH&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. U-15 &amp;mdash; 소유자가 사라진 파일을 발견했을 때&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-15는 다른 항목과 접근 방식이 조금 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd나 /etc/shadow처럼 특정 파일의 권한을 확인하는 것이 아니라 &lt;b&gt;시스템 안에서 정상적인 소유자 또는 그룹과 연결되지 않는 파일을 찾는 항목&lt;/b&gt;이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.1 왜 고아 파일이 생기는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 계정이 삭제되거나 패키지가 비정상적으로 제거된 이후에도 해당 계정이 생성했던 파일은 남아 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 파일의 UID/GID는 그대로 존재하지만 현재 시스템의 /etc/passwd, /etc/group에서 해당 ID를 사용하는 계정을 찾지 못할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 파일을 흔히 고아 파일(Orphan File)이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 &lt;b&gt;고아 파일 = 즉시 삭제해야 하는 파일&lt;/b&gt;은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션 데이터, 로그, 컨테이너 환경의 파일 등 정상적인 운영 과정에서도 이러한 상황이 발생할 수 있기 때문이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.2 자동 진단 스크립트&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# [상세 해설] U-15 점검 항목 시작 알림
CODE &quot;[ U-15 ] 소유자 없는 파일 및 디렉터리 존재 여부&quot;

# [상세 해설] 대용량 스토리지 및 네트워크 마운트로 인한 부하를 방지하기 위해 로컬 핵심 디렉터리 지정
TARGET_DIRS=&quot;/ /home /var /tmp /usr /opt&quot;

# [상세 해설] find 명령어로 -nouser 또는 -nogroup 조건을 검색하되,
# -xdev 옵션을 통해 다른 파일시스템(NFS 등)으로 탐색이 넘어가는 것을 차단함
# EXEC_TIMEOUT 함수를 통해 60초 초과 시 탐색을 중단하여 I/O 병목 방지
ORPHAN_FILES=$(EXEC_TIMEOUT 60 &quot;find $TARGET_DIRS -xdev -type f \( -nouser -o -nogroup \) 2&amp;gt;/dev/null | head -n 5 | xargs&quot;)
EXIT_CODE=$?

# [상세 해설] Exit Code 124(타임아웃 발생) 여부 및 파일 존재 여부 조건 분기
if [ &quot;$EXIT_CODE&quot; -eq 124 ]; then
    INFO &quot;소유자 없는 파일 검색 중 응답 지연(60초 초과)이 발생하여 점검을 중단했습니다.&quot; &quot;수동 점검 요망&quot;
elif [ -n &quot;$ORPHAN_FILES&quot; ]; then
    WARN &quot;소유자나 그룹이 존재하지 않는 고아 파일이 발견되었습니다.&quot; &quot;발견된 파일(최대 5개): [ $ORPHAN_FILES ]&quot;
else
    OK &quot;시스템 내에 소유자나 그룹이 존재하지 않는 파일이 발견되지 않았습니다.&quot; &quot;정상 확인&quot;
fi

FINISH &quot;[ U-15 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.3 이 스크립트가 실제로 보는 범위&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트는 다음 경로를 대상으로 한다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/
/home
/var
/tmp
/usr
/opt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 find에 -xdev 옵션을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;find $TARGET_DIRS -xdev
&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;또한 결과를 최대 5개까지만 가져온다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;head -n 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;U-15에서 WARN이 발생했다고 해서 고아 파일이 정확히 5개만 존재한다는 의미는 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트 출력은 발견된 파일의 일부를 보여주는 용도이며, 실제 조치 전에는 전체 목록을 별도로 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.4 60초 타임아웃도 점검 결과의 일부다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-15는 대용량 서버에서 find 자체가 상당한 부하를 발생시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트는 EXEC_TIMEOUT 60을 사용하기 때문에 60초를 초과하면 점검을 중단하고 INFO를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음 결과를 단순히 양호로 해석해서는 안 된다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;소유자 없는 파일 검색 중 응답 지연(60초 초과)이 발생하여 점검을 중단했습니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우는 &lt;b&gt;정상 확인이 아니라 자동점검 범위 내에서 확인을 완료하지 못한 상태&lt;/b&gt;로 보고 수동 점검이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.5 수동 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 파일을 확인하려면 다음과 같이 실행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;find / -xdev \( -nouser -o -nogroup \) -ls 2&amp;gt;/dev/null
&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;ls -l &amp;lt;파일경로&amp;gt;
stat &amp;lt;파일경로&amp;gt;
&lt;/code&gt;&lt;/pre&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;애플리케이션 데이터&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;li&gt;삭제된 사용자 계정의 잔여 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.6 특히 컨테이너 환경은 별도 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker나 Podman 환경에서는 컨테이너 내부 UID/GID와 호스트 OS의 계정 정보가 일치하지 않을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 /var/lib/docker, /var/lib/containers 등의 저장 영역에서 발견된 파일을 일반적인 로컬 파일과 동일하게 판단하면 오탐 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 관련 경로는 별도의 컨테이너 보안점검 기준으로 관리하는 방법도 고려할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.7 안전한 조치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 발견 목록을 저장한다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;find / -xdev \( -nouser -o -nogroup \) 2&amp;gt;/dev/null &amp;gt; /root/orphan_files_list.txt
&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;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;chown root:root &amp;lt;파일_또는_디렉터리_경로&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 명백하게 불필요한 임시 파일인 경우에도 즉시 rm -rf를 실행하기보다 백업 후 삭제하는 방법이 안전하다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;tar -czf /root/orphan_backup_$(date +%Y%m%d).tar.gz \
    -T /root/orphan_files_list.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제가 필요한 파일만 선별하여 처리한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. U-16 &amp;mdash; /etc/passwd는 왜 권한을 함부로 줄이면 안 되는가&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd는 이름만 보면 비밀번호가 저장되는 파일처럼 보이지만 실제로는 계정명, UID, GID, 홈 디렉터리, 로그인 Shell 등의 계정 정보를 담고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일에 일반 사용자의 쓰기 권한이 있다면 계정정보 변조를 통한 권한 상승으로 이어질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 보안성을 높이겠다는 이유로 읽기 권한까지 과도하게 제한하면 일반 사용자와 시스템 서비스가 정상적으로 계정 정보를 조회하지 못하는 문제가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 U-16은 &lt;b&gt;&amp;ldquo;권한을 최대한 낮추는 것&amp;rdquo;이 목적이 아니라 적절한 권한을 유지하면서 비인가자의 변경을 막는 것&lt;/b&gt;이 핵심이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.1 현재 자동 진단 스크립트&lt;/h2&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;# [상세 해설] U-16 점검 항목 시작 알림
CODE &quot;[ U-16 ] /etc/passwd 파일 소유자 및 권한 설정&quot;

# [상세 해설] 파일 존재 여부 확인 후 소유자 및 권한 마스크 파싱
if [ -f /etc/passwd ]; then
    OWNER=$(ls -l /etc/passwd | awk '{print $3}')
    PERMS=$(ls -l /etc/passwd | awk '{print $1}')

    # [상세 해설] 그룹(5~7번째 글자) 및 타사용자(8~10번째 글자) 권한 필드 추출
    PERM_G=$(echo &quot;$PERMS&quot; | cut -c 5-7)
    PERM_O=$(echo &quot;$PERMS&quot; | cut -c 8-10)

    # [상세 해설] 소유자가 root이고 그룹 및 Other에 쓰기(w) 또는 실행(x) 권한이 없는지 판정
    if [ &quot;$OWNER&quot; == &quot;root&quot; ] &amp;amp;&amp;amp; ! echo &quot;$PERM_G&quot; | grep -q &quot;[wx]&quot; &amp;amp;&amp;amp; ! echo &quot;$PERM_O&quot; | grep -q &quot;[wx]&quot;; then
        OK &quot;/etc/passwd 파일의 소유자가 root이고, 권한이 644 이하로 안전합니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    else
        WARN &quot;/etc/passwd 파일의 소유자가 root가 아니거나, 권한이 644를 초과합니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    fi
else
    WARN &quot;/etc/passwd 파일이 존재하지 않습니다.&quot; &quot;파일 누락 또는 경로 다름&quot;
fi

FINISH &quot;[ U-16 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.2 코드에서 실제로 확인하는 부분&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;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;OWNER == root
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Group 및 Other 권한&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Group과 Other에 다음 권한이 있는지를 검사한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;w
x
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 현재 스크립트는 Group과 Other에 &lt;b&gt;쓰기 또는 실행 권한이 존재하는지&lt;/b&gt;를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 단순히 파일 권한 숫자가 644인지 문자열로 비교하는 방식은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 640, 600, 400 등도 현재 조건에서는 Group과 Other에 쓰기&amp;middot;실행 권한이 없으면 조건을 만족할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.3 수동 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 파일 상태는 다음과 같이 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;stat -c &quot;%a %U:%G %n&quot; /etc/passwd
&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;su - nobody -s /bin/bash -c &quot;id&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 환경에 따라 nobody 계정의 Shell이나 로그인 정책이 다를 수 있으므로, 테스트 명령 자체가 실패했다고 해서 /etc/passwd 권한 문제로 단정해서는 안 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.4 권한을 600 또는 400으로 줄이는 것이 항상 좋은가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd는 시스템의 여러 프로그램이 계정 정보를 조회하는 데 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 단순히&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;chmod 400 /etc/passwd
&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;U-16에서 중요한 것은 &lt;b&gt;비인가 사용자의 쓰기를 막는 것과 시스템이 필요한 계정 정보를 읽을 수 있도록 하는 것 사이의 균형&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.5 안전한 조치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 원본을 백업한다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/passwd /etc/passwd.bak_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트의 조치 방법은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;chown root:root /etc/passwd
chmod 644 /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 후 확인한다.&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;stat -c &quot;%a %U:%G %n&quot; /etc/passwd
id nobody
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. U-17 &amp;mdash; 시스템 시작 파일은 왜 별도로 봐야 하는가&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-17은 파일 권한 자체보다 &lt;b&gt;&amp;ldquo;그 파일이 언제 실행되는가&amp;rdquo;&lt;/b&gt;가 중요한 항목이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 부팅 과정에서 자동으로 실행되는 파일에 일반 사용자가 내용을 변경할 수 있다면, 공격자는 해당 파일에 명령을 삽입한 후 시스템 재부팅을 기다리는 방식으로 권한 상승을 시도할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 과거 SysV init 기반 시스템뿐 아니라 현재의 systemd 환경까지 고려해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.1 현재 스크립트의 검사 범위&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# [상세 해설] U-17 점검 항목 시작 알림
CODE &quot;[ U-17 ] 시스템 시작 스크립트 권한 설정&quot;

# [상세 해설] SysV init 및 systemd 서비스 유닛 경로를 점검 대상 리스트에 등록
START_SCRIPTS=&quot;/etc/rc.d /etc/rc*.d /etc/init.d /etc/rc.local /etc/rc.sysinit /etc/systemd/system&quot;
VULN_SCRIPTS=&quot;&quot;

# [상세 해설] 각 디렉터리를 순회하며 Other 사용자에게 쓰기 권한(-perm -002)이 부여된 파일 탐색
for dir in $START_SCRIPTS; do
    if [ -d &quot;$dir&quot; ] || [ -f &quot;$dir&quot; ]; then
        RES=$(find &quot;$dir&quot; -type f -perm -002 2&amp;gt;/dev/null | head -n 3 | xargs)
        if [ -n &quot;$RES&quot; ]; then
            VULN_SCRIPTS=&quot;$VULN_SCRIPTS $RES&quot;
        fi
    fi
done

# [상세 해설] 취약 파일 검출 결과에 따른 출력
if [ -n &quot;$VULN_SCRIPTS&quot; ]; then
    WARN &quot;타사용자 쓰기 권한이 부여된 시작 스크립트가 존재합니다.&quot; &quot;취약 스크립트(일부): [ $VULN_SCRIPTS ]&quot;
else
    OK &quot;주요 시스템 시작 스크립트에 비인가자 쓰기 권한이 부여되지 않았습니다.&quot; &quot;점검 경로 내 취약 파일 없음&quot;
fi

FINISH &quot;[ U-17 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.2 여기서 중요한 스크립트의 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-17의 원래 요약표에는 시작 스크립트의 &lt;b&gt;소유자가 root이고 Other 쓰기 권한이 없는 경우&lt;/b&gt;를 양호 기준으로 설명하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 현재 자동화 코드는 실제로 다음 조건을 검색한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;find &quot;$dir&quot; -type f -perm -002
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-perm -002는 &lt;b&gt;Other 사용자에게 쓰기 권한이 있는 파일&lt;/b&gt;을 찾는 조건이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 현재 스크립트는 &lt;b&gt;파일 소유자가 root인지까지 직접 확인하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 포스팅에서도 명확히 구분해 두는 것이 좋다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 자동화 스크립트는 시작 파일의 Other 쓰기 권한을 검사한다. 파일 소유자까지 자동 판정하는 로직은 포함되어 있지 않으므로 소유권은 별도의 수동 확인이 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 작성하면 실제 스크립트보다 넓은 범위를 검사한다고 오해시키지 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.3 수동 점검&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령으로 현재 검사 대상에서 Other 쓰기 권한이 있는 파일을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;find /etc/rc.d /etc/rc*.d /etc/init.d /etc/rc.local /etc/systemd/system \
    -type f -perm -002 -ls 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 소유권은 별도로 확인한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;find /etc/rc.d /etc/init.d /etc/systemd/system \
    -type f -ls 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemd 환경에서는 서비스 파일이 실제로 어디에서 제공되는지도 함께 확인할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트는 /usr/lib/systemd/system을 검사하지 않으므로 이 경로의 서비스 파일까지 확인하려면 별도의 수동 점검이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.4 안전한 조치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 관련 파일을 백업한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;tar -czf /root/init_scripts_backup_$(date +%Y%m%d).tar.gz \
    /etc/rc.d /etc/init.d /etc/systemd/system 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Other 쓰기 권한을 제거한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;find /etc/rc.d /etc/rc*.d /etc/init.d /etc/rc.local /etc/systemd/system \
    -type f -exec chmod o-w {} + 2&amp;gt;/dev/null
&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;현재 조치 스크립트에서는 다음과 같이 root 소유로 변경한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;find /etc/rc.d /etc/rc*.d /etc/init.d /etc/rc.local /etc/systemd/system \
    -type f -exec chown root:root {} + 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemd 설정을 변경한 경우에는 다음 명령으로 데몬 설정을 다시 읽도록 한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, &lt;b&gt;모든 서비스 파일의 소유권을 일괄적으로 변경하는 작업은 운영환경에서 반드시 대상 파일을 확인한 후 적용해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. U-18 &amp;mdash; /etc/shadow는 권한 숫자만 보면 안 되는 이유&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/shadow는 비밀번호 해시와 계정의 비밀번호 관련 정보를 포함하는 핵심 인증 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 일반 사용자가 내용을 읽거나 변경할 수 있는 상태라면 심각한 보안 문제가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 /etc/shadow는 Linux 배포판에 따라 &lt;b&gt;소유 그룹과 권한 구성이 다를 수 있기 때문에&lt;/b&gt;, 단순히 400이 아니면 모두 취약하다고 판단하는 것은 위험하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 U-18 스크립트도 이 차이를 고려하여 400/000과 600/640을 서로 다르게 처리한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.1 자동 진단 스크립트&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# [상세 해설] U-18 점검 항목 시작 알림
CODE &quot;[ U-18 ] /etc/shadow 파일 소유자 및 권한 설정&quot;

# [상세 해설] shadow 파일의 소유자와 10자리 권한 마스크 파싱
if [ -f /etc/shadow ]; then
    OWNER=$(ls -l /etc/shadow | awk '{print $3}')
    PERMS=$(ls -l /etc/shadow | awk '{print $1}' | cut -c 1-10)

    # [상세 해설] KISA 기준 400(r--------) 및 최신 OS 기본값 000(----------)인 경우 양호 판정
    if [ &quot;$OWNER&quot; == &quot;root&quot; ] &amp;amp;&amp;amp; [[ &quot;$PERMS&quot; == &quot;-r--------&quot; || &quot;$PERMS&quot; == &quot;----------&quot; ]]; then
        OK &quot;/etc/shadow 파일 소유자가 root이고, 권한이 400 이하로 안전합니다.&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;

    # [상세 해설] 일부 OS의 기본값인 640/600에 대한 정보성 처리
    elif [ &quot;$OWNER&quot; == &quot;root&quot; ] &amp;amp;&amp;amp; [[ &quot;$PERMS&quot; == &quot;-rw-------&quot; || &quot;$PERMS&quot; == &quot;-rw-r-----&quot; ]]; then
        INFO &quot;/etc/shadow 파일 권한이 600 또는 640입니다.&quot; &quot;Linux 환경 등 일부 OS에서는 600/640이 기본값이나 가이드 기준(400) 초과&quot;

    else
        WARN &quot;/etc/shadow 파일의 권한 또는 소유자가 취약합니다. (권고: root, 400 이하)&quot; &quot;소유자: $OWNER, 권한: $PERMS&quot;
    fi
else
    INFO &quot;/etc/shadow 파일이 존재하지 않습니다.&quot; &quot;AIX의 /etc/security/passwd 등 다른 인증 체계 확인 요망&quot;
fi

FINISH &quot;[ U-18 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.2 스크립트 결과를 어떻게 해석할 것인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트에서는 다음과 같이 구분한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소유자권한스크립트 결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;root&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;root&lt;/td&gt;
&lt;td&gt;000&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;root&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;root&lt;/td&gt;
&lt;td&gt;640&lt;/td&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;root가 아님&lt;/td&gt;
&lt;td&gt;기타&lt;/td&gt;
&lt;td&gt;WARN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파일 없음&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 INFO가 출력됐다고 해서 즉시 권한을 400으로 변경해야 하는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 root:shadow 640과 같은 배포판별 기본 구성은 현재 시스템의 인증 구조와 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.3 실제 파일 상태 확인&lt;/h2&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;stat -c &quot;%a %U:%G %n&quot; /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 결과라면,&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;640 root:shadow /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 400으로 변경하기 전에 해당 시스템에서 shadow 그룹이 어떻게 사용되는지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.4 인증 기능 정상 여부 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 권한 변경 후에는 인증 기능까지 확인하는 것이 중요하다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;pwck -r /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 테스트 가능한 환경에서는 실제 사용자 비밀번호 변경 및 로그인 동작까지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.5 안전한 조치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 전 백업한다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/shadow /etc/shadow.bak_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RHEL/CentOS/Rocky 계열 등 현재 운영환경의 정책이 root:root, 400을 사용하는 경우 다음과 같이 조치할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;chown root:root /etc/shadow
chmod 400 /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 Ubuntu/Debian 환경에서 기존 인증 구조가 root:shadow, 640을 사용하는 경우에는 해당 구성을 무조건 400으로 변경하기보다 현재 시스템의 인증 구성과 패키지 기본 정책을 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문에서 제시한 환경별 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;rsl&quot;&gt;&lt;code&gt;# Ubuntu/Debian 환경에서 필요한 경우
chown root:shadow /etc/shadow
chmod 640 /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 후에는 다음과 같이 무결성을 확인한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;pwck -r
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 다섯 항목을 점검할 때 특히 주의할 부분&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-14~U-18은 단순히 취약 &amp;rarr; 명령어 실행으로 끝내면 안 되는 항목이 많다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-14&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PATH에서 .을 발견했다면 &lt;b&gt;어떤 설정 파일에서 추가됐는지&lt;/b&gt;부터 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-15&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고아 파일을 발견했다고 &lt;b&gt;바로 삭제하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션, 컨테이너, 로그 등의 정상적인 운영 파일일 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-16&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd의 권한을 보안 강화 목적으로 과도하게 제한하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템에서 필요한 읽기 기능까지 차단될 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-17&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Other 쓰기 권한뿐 아니라 &lt;b&gt;실제 소유자와 서비스 파일의 역할&lt;/b&gt;을 함께 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 자동화 스크립트는 소유자를 자동 판정하지 않는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;U-18&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/shadow는 &lt;b&gt;배포판별 기본 권한과 인증 구조를 확인한 후 조치&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 640을 발견했다고 무조건 400으로 변경하는 방식은 피하는 것이 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. 자동화 스크립트의 검사 범위와 한계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 스크립트는 많은 서버를 동일한 기준으로 빠르게 검사할 수 있다는 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 U-14~U-18에서는 &lt;b&gt;스크립트가 검사하는 범위와 실제 시스템의 전체 보안 상태가 동일하지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-14&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 $PATH만 검사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/profile.d/*.sh, /etc/environment 등 PATH가 구성되는 모든 파일을 직접 추적하지 않는다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-15&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/, /home, /var, /tmp, /usr, /opt를 대상으로 -xdev 방식으로 검색하며, 60초 초과 시 중단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대용량 저장소나 컨테이너 저장소가 있는 서버에서는 점검 결과가 제한될 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-16&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd의 소유자와 Group/Other 권한을 검사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 코드에서는 파일 권한 숫자를 직접 644와 비교하는 방식이 아니라 Group과 Other에 w/x 권한이 있는지를 확인한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-17&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 코드에서는 시작 관련 경로의 &lt;b&gt;Other 쓰기 권한&lt;/b&gt;을 검사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 소유자가 root인지 여부까지 자동으로 검사하지 않는다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-18&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;400/000은 OK, 600/640은 INFO로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 실제 운영환경에서는 배포판과 인증 구성까지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 정밀 점검이 필요한 경우의 개선 예시&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 자동화 스크립트의 검사 범위를 확대하려면 다음과 같은 방법을 사용할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9.1 U-14 &amp;mdash; 설정 파일까지 PATH 검색 범위 확대&lt;/h2&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;VULN_PATH_CONF=$(grep -E -H &quot;PATH=.*(\.:|::|:\.|\:\$)&quot; \
    /etc/profile /etc/profile.d/*.sh /etc/environment 2&amp;gt;/dev/null |
    grep -v &quot;^#&quot;)

if [ -n &quot;$VULN_PATH_CONF&quot; ]; then
    WARN &quot;설정 파일 내 안전하지 않은 PATH 선언이 발견되었습니다.&quot; \
        &quot;내역: $VULN_PATH_CONF&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 $PATH만 보는 방식에서 &lt;b&gt;PATH를 구성하는 설정 파일까지 확인하는 방식&lt;/b&gt;으로 범위를 확대하는 예시다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9.2 U-18 &amp;mdash; OS별 /etc/shadow 권한 확인&lt;/h2&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;SHADOW_OWNER=$(stat -c &quot;%U&quot; /etc/shadow)
SHADOW_GROUP=$(stat -c &quot;%G&quot; /etc/shadow)
SHADOW_PERM=$(stat -c &quot;%a&quot; /etc/shadow)

if [[ &quot;$SHADOW_OWNER&quot; == &quot;root&quot; ]] &amp;amp;&amp;amp; \
   [[ &quot;$SHADOW_PERM&quot; =~ ^(000|400)$ ]]; then

    OK &quot;/etc/shadow 권한이 매우 안전합니다.&quot; \
       &quot;권한: $SHADOW_PERM ($SHADOW_OWNER:$SHADOW_GROUP)&quot;

elif [[ &quot;$SHADOW_OWNER&quot; == &quot;root&quot; &amp;amp;&amp;amp; \
        &quot;$SHADOW_GROUP&quot; == &quot;shadow&quot; &amp;amp;&amp;amp; \
        &quot;$SHADOW_PERM&quot; == &quot;640&quot; ]]; then

    OK &quot;/etc/shadow가 데비안/우분투 표준 권한(640, root:shadow)에 부합합니다.&quot; \
       &quot;권한: $SHADOW_PERM&quot;

else
    WARN &quot;/etc/shadow 권한 및 소유자가 가이드라인에 미달합니다.&quot; \
         &quot;권한: $SHADOW_PERM ($SHADOW_OWNER:$SHADOW_GROUP)&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 단순히 400만을 양호 기준으로 보는 것이 아니라 &lt;b&gt;소유자&amp;middot;그룹&amp;middot;권한을 함께 판단하는 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. U-14~U-18 자동화 점검을 실제 서버에 적용하는 방법&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 영역은 다음 순서로 점검하면 효율적이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1단계 &amp;mdash; 자동 진단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 전체 스크립트를 실행하여 U-14~U-18의 결과를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계 &amp;mdash; 결과가 나온 파일을 직접 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 결과만 보고 바로 조치하지 않고 해당 파일의 실제 상태를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;ls -l &amp;lt;파일&amp;gt;
stat &amp;lt;파일&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계 &amp;mdash; 운영 영향 확인&lt;/h3&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;Docker/Podman&lt;/li&gt;
&lt;li&gt;NFS 및 별도 파일시스템&lt;/li&gt;
&lt;li&gt;systemd&lt;/li&gt;
&lt;li&gt;LDAP/SSSD&lt;/li&gt;
&lt;li&gt;CI/CD Agent&lt;/li&gt;
&lt;li&gt;애플리케이션 서비스 계정&lt;/li&gt;
&lt;li&gt;Ubuntu/Debian의 shadow 그룹 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4단계 &amp;mdash; 원본 백업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한이나 소유권을 변경하기 전에 원본 파일을 백업한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5단계 &amp;mdash; 필요한 항목만 조치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 결과에 포함된 모든 파일을 일괄 변경하지 않고, 실제 취약성이 확인된 대상만 조치한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6단계 &amp;mdash; 변경 후 재점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 스크립트를 다시 실행하여 변경 결과를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7단계 &amp;mdash; 서비스 정상 여부 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 권한 변경 이후에는 단순히 [양호]가 출력되는 것만 확인하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 로그인, 애플리케이션 서비스, systemd 서비스, 인증 기능 등 &lt;b&gt;해당 파일과 연관된 실제 기능이 정상적으로 동작하는지 확인하는 과정까지 점검의 일부로 보는 것이 안전하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅의 스크립트 및 조치 방법은 Linux 시스템의 &lt;b&gt;파일 및 디렉터리 관리 보안점검과 보안 강화를 목적&lt;/b&gt;으로 작성되었다. Linux 배포판, 버전, 파일시스템 구성, 설치된 서비스 및 인증 구성에 따라 점검 대상과 적용 방식이 다를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 /etc/passwd, /etc/shadow, 시스템 시작 스크립트의 권한 및 소유권을 변경하거나 root 계정의 PATH를 수정할 경우 사용자 인증, 서비스 실행 및 시스템 부팅에 영향을 줄 수 있으므로 &lt;b&gt;운영 서버에 적용하기 전에 반드시 테스트 환경에서 검증한 후 적용해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소유자가 없는 파일이나 디렉터리를 발견하더라도 즉시 삭제하지 말고 해당 파일의 업무상 용도와 애플리케이션&amp;middot;컨테이너 환경에서의 사용 여부를 먼저 확인해야 한다. 또한 /etc/shadow는 Linux 배포판에 따라 기본 소유 그룹과 권한이 다를 수 있으므로 현재 시스템의 인증 구성과 함께 확인한 후 조치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트 실행 및 설정 변경으로 인해 발생하는 시스템 장애에 대해서는 사용 환경에 맞는 사전 검증이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함께 보면 좋은 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linux 보안취약점 점검 자동화 스크립트 공통 함수 및 환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 보안취약점 점검 스크립트를 여러 항목에서 공통으로 사용하기 위한 함수와 환경 설정에 대한 내용은 별도의 글에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot;&gt;자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#리눅스보안점검 #주요정보통신기반시설 #파일권한점검 #환경변수보안 #고아파일제거 #패스워드파일보호 #섀도우파일보안 #시작스크립트권한 #서버보안가이드 #보안엔지니어실무 #서버인프라관리</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/100</guid>
      <comments>https://ismsp-case.tistory.com/100#entry100comment</comments>
      <pubDate>Tue, 8 Sep 2026 09:48:32 +0900</pubDate>
    </item>
    <item>
      <title>Data Lake에 개인정보를 원본으로 저장하면 생기는 문제</title>
      <link>https://ismsp-case.tistory.com/99</link>
      <description>&lt;h1&gt;Data Lake에 개인정보를 원본으로 저장하면 생기는 문제&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;mdash; AI 추천 시스템 환경에서 개인정보 파기 통제를 설계하는 방법&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 글은 클라우드 기반 데이터 플랫폼의 개인정보 파기 통제를 이해하기 위한 가상의 기술 시나리오를 바탕으로 작성했습니다. 특정 기업의 실제 심사 사례나 실제 결함 사례가 아니며, 시스템 구성과 데이터는 설명을 위해 단순화한 예시입니다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 문제의 시작 &amp;mdash; 운영 DB만 삭제하면 끝일까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기업의 데이터 환경이 복잡해지면서 개인정보는 더 이상 하나의 운영 DB에만 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 AI 추천, 데이터 분석, BI, 머신러닝 등의 목적으로 다음과 같은 데이터 파이프라인을 구성하는 경우가 많다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;서비스
   │
   ▼
운영 DB
   │
   ▼
CDC
   │
   ▼
Kafka
   │
   ▼
Data Lake
   │
   ├── ETL
   ├── 분석
   └── Feature 생성
          │
          ▼
       Data Warehouse
          │
          ▼
       AI / ML
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 회원 탈퇴나 보유기간 만료와 같은 이벤트가 발생했을 때다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서는 개인정보를 정상적으로 삭제했는데,아래와 같은 상태가 발생할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;운영 DB       &amp;rarr; 삭제
Data Lake     &amp;rarr; 잔존
Data Warehouse &amp;rarr; 잔존
Feature Store &amp;rarr; 잔존
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 단순히 DB 담당자의 파기 배치가 정상적으로 동작했는지만 확인해서는 개인정보 파기 통제를 충분히 설명하기 어렵다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 가상의 시스템 환경&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 환경을 가정해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;영역&lt;/td&gt;
&lt;td&gt;구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;서비스 DB&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;변경 데이터 수집&lt;/td&gt;
&lt;td&gt;Debezium CDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메시지 브로커&lt;/td&gt;
&lt;td&gt;Kafka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Lake&lt;/td&gt;
&lt;td&gt;Amazon S3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETL&lt;/td&gt;
&lt;td&gt;AWS Glue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;분석 쿼리&lt;/td&gt;
&lt;td&gt;Amazon Athena&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;분석 DW&lt;/td&gt;
&lt;td&gt;Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;활용&lt;/td&gt;
&lt;td&gt;구매 분석 및 AI 추천&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 흐름은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;PostgreSQL
    │
    │ INSERT / UPDATE / DELETE
    ▼
Debezium
    │
    ▼
Kafka
    │
    ▼
S3 Data Lake
    │
    ▼
AWS Glue
    │
    ├─────────────┐
    ▼             ▼
Athena        Snowflake
                  │
                  ▼
             AI 추천 모델
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 &lt;b&gt;운영 DB의 데이터 변경 이벤트가 모든 downstream 시스템에서 동일한 의미로 처리되는 것은 아니라는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. 가장 중요한 문제 &amp;mdash; DELETE 이벤트를 어떻게 처리할 것인가?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDC 환경에서는 일반적으로 다음과 같은 데이터 변경 이벤트가 발생한다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;INSERT
UPDATE
DELETE
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT와 UPDATE는 비교적 쉽게 처리할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;INSERT
   &amp;darr;
새로운 데이터 적재

UPDATE
   &amp;darr;
기존 데이터 갱신
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 DELETE는 조금 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서는 다음과 같이 실행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DELETE FROM customer
WHERE user_id = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이미 S3에 다음과 같은 파일이 생성되어 있다면 상황이 달라진다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;s3://example-datalake/customer/
    └── year=2026/
        └── month=09/
            └── day=01/
                └── customer.parquet
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB에서 한 행을 삭제했다고 해서 과거에 생성된 Parquet 파일의 해당 레코드가 자동으로 사라지는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원천 데이터의 삭제와 파생 데이터의 삭제는 별도의 문제다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. Data Lake에서는 왜 파기가 어려울까?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDBMS에서는 특정 조건의 데이터를 쉽게 삭제할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DELETE FROM customer
WHERE user_id = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 파일 기반 Data Lake에서는 상황이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 하나의 Parquet 파일에 수십만 건의 레코드가 들어 있다고 가정하자.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;customer-20260901.parquet

USER-000001
USER-000002
USER-000003
...
USER-000123
...
USER-500000
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 USER-000123 한 건만 삭제하려면 기존 파일을 그대로 유지하면서 RDBMS처럼 단순한 DELETE를 수행하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 플랫폼에서는 일반적으로 다음과 같은 방법을 검토할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 1. 데이터셋 재작성&lt;/h3&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;기존 Parquet
      &amp;darr;
삭제 대상 필터링
      &amp;darr;
새 Parquet 생성
      &amp;darr;
기존 파일 교체
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 2. 테이블 포맷 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경에 따라 Apache Iceberg, Delta Lake, Apache Hudi 등의 테이블 포맷을 활용하여 행 단위 변경 및 삭제를 관리할 수도 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 3. 개인정보 원천 저장 최소화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 근본적인 방법은 분석에 필요하지 않은 원본 개인정보 자체를 Data Lake에 저장하지 않는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 가장 중요한 설계 원칙 &amp;mdash; &amp;ldquo;나중에 지우는 것&amp;rdquo;보다 &amp;ldquo;처음부터 적게 저장하기&amp;rdquo;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake에서 개인정보 파기가 어려운 이유는 데이터가 이미 여러 저장소에 복제된 이후 삭제하려고 하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 구조를 생각해 보자.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;운영 DB
 &amp;darr;
원본 개인정보 포함
 &amp;darr;
Data Lake
 &amp;darr;
ETL
 &amp;darr;
Snowflake
 &amp;darr;
Feature Store
 &amp;darr;
AI 모델
&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;반대로 처음부터 분석에 필요한 정보만 Data Lake로 보내는 구조를 만들 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;운영 DB
 &amp;darr;
개인정보 최소화 / 변환
 &amp;darr;
Data Lake
 &amp;darr;
분석
 &amp;darr;
AI 모델
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 추천 모델이 실제 이름이나 전화번호를 필요로 하지 않는다면, 원본 개인정보를 Data Lake에 저장할 이유가 줄어든다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;홍길동
010-1234-5678
서울특별시 ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 분석에 필요한 식별자를 별도로 설계할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;anonymous_id
A7F2C91...
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 &lt;b&gt;가명처리 또는 해시가 곧 개인정보의 완전한 제거를 의미하는 것은 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 정보와 결합하여 특정 개인을 알아볼 수 있는 구조라면 개인정보로서의 관리가 필요할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 단순히 &amp;ldquo;SHA-256으로 변경했으니 개인정보가 아니다&amp;rdquo;라고 판단해서는 안 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 파기 통제는 데이터 흐름 전체를 대상으로 설계해야 한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 파기 프로세스를 다음처럼 단순하게 구성하면 문제가 발생할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
운영 DB DELETE
   &amp;darr;
완료
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake 환경에서는 다음과 같이 설계하는 것이 보다 명확하다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
파기 대상 식별
   &amp;darr;
보존 필요성 확인
   &amp;darr;
파기 대상 확정
   &amp;darr;
┌───────────────┐
│                │
▼                ▼
운영 DB        Data Lake
                 │
                 ▼
              DW / 분석계
                 │
                 ▼
             Feature 데이터
                 │
                 ▼
              결과 검증
                 │
                 ▼
             파기 이력 기록
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;파기 이벤트가 발생했을 때 어디까지 전달되어야 하는지&lt;/b&gt;를 데이터 흐름도에 명확하게 정의해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. ISMS-P 3.4 관점에서 보면&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 ISMS-P 인증기준에서는 개인정보 파기 시 보호조치를 3.4로 구분하고 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;3.4.1 개인정보 파기&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3.4.2 처리목적 달성 후 보유 시 조치&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.4.1은 개인정보의 보유기간 경과나 처리목적 달성 등 파기 시점이 도달했을 때 안전성과 완전성이 보장되는 방법으로 지체 없이 파기하는 것을 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.4.2는 파기하지 않고 보존하는 경우에도 관련 목적에 필요한 최소한의 항목으로 제한하고 다른 개인정보와 분리하여 저장&amp;middot;관리하는 것을 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Data Lake 설계 단계에서부터 다음 질문을 해야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 데이터는 왜 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;얼마 동안 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분석환경에 원본 개인정보가 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파기 대상이 되었을 때 어느 시스템까지 삭제해야 하는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;계속 보존해야 한다면 무엇을 어떻게 분리할 것인가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. 기술적 통제 ① &amp;mdash; DELETE 이벤트 연계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적인 방법은 운영 DB의 개인정보 삭제 이벤트를 downstream 시스템과 연결하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 구조를 만들 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
PostgreSQL DELETE
   &amp;darr;
CDC DELETE EVENT
   &amp;darr;
Kafka
   &amp;darr;
Data Lake 처리
   &amp;darr;
Snowflake 처리
   &amp;darr;
결과 검증
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 단순히 DELETE 이벤트가 Kafka까지 전달되는지가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제로 downstream 시스템에서 그 이벤트가 개인정보 파기 조치로 연결되는지&lt;/b&gt;를 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 기술적 통제 ② &amp;mdash; 파기 대상 목록 관리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탈퇴 회원의 user_id를 별도로 관리하고 Data Lake와 비교하는 방식도 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;deleted_users

USER-000123
USER-000456
USER-000789
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Data Lake에서 해당 목록과 비교한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념적으로는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;capnproto&quot;&gt;&lt;code&gt;deleted_users
      │
      ▼
Data Lake 데이터와 비교
      │
      ├── 존재하지 않음 &amp;rarr; 정상
      │
      └── 존재함 &amp;rarr; 파기 대상
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 기존 데이터의 소급 파기뿐 아니라 &lt;b&gt;정기적인 누락 탐지&lt;/b&gt;에도 활용할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 기술적 통제 ③ &amp;mdash; 원본 데이터와 분석 데이터 분리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake에 원본 개인정보를 그대로 저장하는 대신 데이터 영역을 구분할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Raw Zone
  │
  │ 개인정보 포함 가능
  ▼
Cleansed Zone
  │
  │ 최소화 / 변환
  ▼
Analytics Zone
  │
  │ 분석 목적 데이터
  ▼
Feature Store
&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;영역&lt;/td&gt;
&lt;td&gt;개인정보&lt;/td&gt;
&lt;td&gt;관리 방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw&lt;/td&gt;
&lt;td&gt;포함 가능&lt;/td&gt;
&lt;td&gt;접근 최소화 및 보존기간 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cleansed&lt;/td&gt;
&lt;td&gt;최소화&lt;/td&gt;
&lt;td&gt;분석에 필요한 데이터 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics&lt;/td&gt;
&lt;td&gt;원본 식별정보 최소화&lt;/td&gt;
&lt;td&gt;분석 목적 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature&lt;/td&gt;
&lt;td&gt;필요한 정보만&lt;/td&gt;
&lt;td&gt;목적별 보존기간 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 모든 분석 시스템에 원본 개인정보를 전달하는 구조를 줄일 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. 기술적 통제 ④ &amp;mdash; 파기와 마스킹을 구분&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 실무적으로 매우 중요한 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 데이터를 변경했다고 하자.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;홍길동
010-1234-5678
서울특별시 ○○구
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[DELETED]
[DELETED]
[PURGED]
&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조는 파기할 때 복구 또는 재생되지 않도록 조치하도록 규정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 기술 문서에서도 다음을 구분하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 147px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style11&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;기술&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;DELETE&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;데이터 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;Hard Delete&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;데이터 자체를 제거하는 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;Masking&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;표시&amp;middot;활용 과정에서 식별정보를 가림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;Pseudonymization&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;별도 추가정보와 결합하여 특정인을 알아볼 수 있도록 관리되는 정보를 가명정보로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;Data Minimization&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;애초에 필요한 데이터만 수집&amp;middot;저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;Separation&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;계속 보존해야 하는 데이터를 다른 데이터와 분리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;&amp;ldquo;마스킹 처리했으므로 파기 완료&amp;rdquo;라는 표현은 피하는 것이 좋다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. 기술적 통제 ⑤ &amp;mdash; 파기 결과 검증&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 프로세스를 구현했다면 마지막으로 반드시 검증해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 USER-000123이 파기 대상이라고 가정하자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영 DB&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT COUNT(*)
FROM customer
WHERE user_id = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Data Lake&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT COUNT(*)
FROM customer
WHERE user_id = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Snowflake&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT COUNT(*)
FROM CUSTOMER
WHERE USER_ID = 'USER-000123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 파기 결과를 다음과 같이 기록할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;대상 식별자 : USER-000123

운영 DB       : 정상
Data Lake     : 정상
DW            : 정상
분석 데이터   : 정상
검증 결과     : 이상 없음
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 &lt;b&gt;파기 명령의 성공 여부만 확인하지 않는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 데이터가 더 이상 존재하지 않는지를 별도로 검증해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. &amp;ldquo;파기 성공&amp;rdquo;과 &amp;ldquo;파기 통제 성공&amp;rdquo;은 다르다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 Data Lake 환경에서 특히 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 로그가 있다고 하자.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;Glue Job
Status = SUCCEEDED
&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;Glue 작업 자체는 성공했지만, 삭제 대상은 그대로 존재할 수도 있기 때문이다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;S3 원본 파일
        &amp;darr;
파기 대상 데이터 존재
        &amp;darr;
Glue 작업 성공
        &amp;darr;
삭제 대상은 그대로 존재
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 검증 단계를 분리하는 것이 좋다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;① 파기 작업 실행
        &amp;darr;
② 작업 성공 여부 확인
        &amp;darr;
③ 대상 데이터 존재 여부 확인
        &amp;darr;
④ downstream 시스템 확인
        &amp;darr;
⑤ 재생성 여부 확인
        &amp;darr;
⑥ 결과 기록
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ETL Job 성공 &amp;ne; 개인정보 파기 성공&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. 파기 통제를 자동화한다면&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정기 점검도 자동화할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 매일 다음과 같은 검증을 수행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[1] 탈퇴 회원 목록 조회
        &amp;darr;
[2] Data Lake 조회
        &amp;darr;
[3] Snowflake 조회
        &amp;darr;
[4] 잔존 데이터 비교
        &amp;darr;
[5] 결과 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적인 경우:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;탈퇴 대상 : 1,000명
Data Lake 잔존 : 0명
Snowflake 잔존 : 0명
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상 상황:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;탈퇴 대상 : 1,000명
Data Lake 잔존 : 3명
Snowflake 잔존 : 2명
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 자동으로 예외를 생성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;[ALERT]

개인정보 파기 검증 이상

Data Lake : 3건
Snowflake  : 2건

&amp;rarr; 담당자 확인 필요
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 방식으로 개인정보 파기를 &lt;b&gt;일회성 수동 작업이 아니라 지속적인 통제 프로세스&lt;/b&gt;로 만들 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. 파기 대상과 법적 보존 대상을 구분한다&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 데이터가 동일하게 삭제되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호법 제21조는 불필요하게 된 개인정보를 지체 없이 파기하도록 하면서, 다른 법령에 따라 보존해야 하는 경우에는 예외를 두고 있다. 이 경우 해당 개인정보 또는 개인정보파일은 다른 개인정보와 분리하여 저장&amp;middot;관리해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Data Lake에도 다음과 같은 구분이 필요할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;개인정보
   │
   ├── 파기 대상
   │      &amp;darr;
   │     삭제
   │
   └── 법적 보존 대상
          &amp;darr;
       별도 영역
          &amp;darr;
       보존기간 관리
          &amp;darr;
       기간 종료
          &amp;darr;
         파기
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 법적 보존 대상이라는 이유만으로 &lt;b&gt;모든 개인정보를 계속 보존하는 것이 아니라는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보존해야 하는 항목과 기간을 구체적으로 확인하고 필요한 범위에서 관리해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. 실무에서 확인할 증적&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake 개인정보 파기 통제를 점검한다면 다음 자료를 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정책 및 관리자료&lt;/h3&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;개인정보 파기 절차&lt;/li&gt;
&lt;li&gt;법적 보존 대상 목록&lt;/li&gt;
&lt;li&gt;시스템별 개인정보 보유 현황&lt;/li&gt;
&lt;li&gt;개인정보 처리 흐름도&lt;/li&gt;
&lt;li&gt;Data Lake 데이터 분류 기준&lt;/li&gt;
&lt;li&gt;데이터 보존 정책&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CDC 설정&lt;/li&gt;
&lt;li&gt;DELETE 이벤트 처리 로그&lt;/li&gt;
&lt;li&gt;Kafka 이벤트 처리 로그&lt;/li&gt;
&lt;li&gt;AWS Glue 실행 로그&lt;/li&gt;
&lt;li&gt;S3 데이터 조회 결과&lt;/li&gt;
&lt;li&gt;Snowflake 데이터 조회 결과&lt;/li&gt;
&lt;li&gt;파기 배치 실행 로그&lt;/li&gt;
&lt;li&gt;파기 검증 결과&lt;/li&gt;
&lt;li&gt;예외 처리 및 재처리 로그&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인터뷰 질문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무 점검에서는 다음 질문이 유용하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;회원 탈퇴가 발생하면 Data Lake의 데이터는 어떻게 처리됩니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이미 생성된 Parquet 파일의 개인정보는 어떻게 삭제합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;DELETE 이벤트가 Kafka까지 전달되는 것은 확인했습니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;Kafka DELETE 이벤트가 실제 S3 삭제 작업으로 연결됩니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;Snowflake에 이미 적재된 데이터는 어떻게 처리합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;파기 후 데이터가 다시 생성되는 경우는 없습니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;법적 보존 데이터와 일반 데이터를 어떻게 구분합니까?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. 자체점검 체크리스트&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;운영 DB에서 Data Lake까지 데이터 흐름을 관리하는가?&lt;/li&gt;
&lt;li&gt;Data Warehouse 및 Feature Store까지 데이터 흐름을 파악하고 있는가?&lt;/li&gt;
&lt;li&gt;원본 개인정보가 꼭 필요한 영역에만 저장되는가?&lt;/li&gt;
&lt;li&gt;분석환경에 불필요한 식별정보가 저장되지 않는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;파기 시점이 정의되어 있는가?&lt;/li&gt;
&lt;li&gt;회원 탈퇴와 파기 프로세스가 연계되어 있는가?&lt;/li&gt;
&lt;li&gt;CDC DELETE 이벤트를 처리하는가?&lt;/li&gt;
&lt;li&gt;과거 Data Lake 데이터도 파기 대상에 포함되는가?&lt;/li&gt;
&lt;li&gt;Snowflake 등 downstream 데이터도 처리하는가?&lt;/li&gt;
&lt;li&gt;백업&amp;middot;복제 데이터에 대한 관리기준이 있는가?&lt;/li&gt;
&lt;li&gt;파기 결과를 검증하는가?&lt;/li&gt;
&lt;li&gt;파기 이력을 기록하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;보존 대상 항목이 최소화되어 있는가?&lt;/li&gt;
&lt;li&gt;보존기간이 관리되는가?&lt;/li&gt;
&lt;li&gt;다른 개인정보와 분리하여 관리하는가?&lt;/li&gt;
&lt;li&gt;보존기간 종료 후 파기하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;데이터 파이프라인 변경 시 개인정보 영향 여부를 검토하는가?&lt;/li&gt;
&lt;li&gt;파기 검증을 정기적으로 수행하는가?&lt;/li&gt;
&lt;li&gt;잔존 데이터 발생 시 자동으로 탐지할 수 있는가?&lt;/li&gt;
&lt;li&gt;파기 실패 시 재처리 절차가 있는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. 이 사례에서 얻을 수 있는 핵심 교훈&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사례의 핵심은 특정 AWS 서비스나 Spark 코드가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;데이터의 복제 구조를 개인정보 생명주기와 함께 설계해야 한다는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB만 생각하면 다음과 같이 보인다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
DB DELETE
   &amp;darr;
완료
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제 데이터 플랫폼에서는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;회원 탈퇴
   &amp;darr;
운영 DB
   &amp;darr;
CDC
   &amp;darr;
Kafka
   &amp;darr;
Data Lake
   &amp;darr;
ETL
   ├── Athena
   ├── Snowflake
   └── Feature Store
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개인정보 파기 정책 역시 이 데이터 흐름을 따라가야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;19. 가장 효과적인 개선은 &amp;ldquo;소급 파기&amp;rdquo;를 줄이는 것&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake에 개인정보를 원본으로 계속 적재한 뒤 탈퇴할 때마다 찾아서 삭제하는 구조는 기술적으로도 관리적으로도 부담이 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능하다면 다음과 같은 방향을 고려할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;capnproto&quot;&gt;&lt;code&gt;기존 구조

원본 개인정보
     &amp;darr;
Data Lake
     &amp;darr;
분석
     &amp;darr;
AI


개선 구조

원본 개인정보
     &amp;darr;
목적에 필요한 데이터만 선별
     &amp;darr;
최소화 / 변환
     &amp;darr;
Data Lake
     &amp;darr;
분석
     &amp;darr;
AI
&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;특히 AI 분석환경에서는 모델이 정말 개인 식별정보를 필요로 하는지부터 검토할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;분석할 수 있으니까 저장한다&amp;rdquo;가 아니라 &amp;ldquo;분석 목적에 필요한가?&amp;rdquo;를 먼저 확인하는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 기반 Data Lake와 AI 분석환경에서는 개인정보가 운영 DB 하나에만 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDC, Kafka, ETL, Data Lake, Data Warehouse, Feature Store 등 여러 시스템을 거치면서 데이터가 복제될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 개인정보 파기를 설계할 때는 단순히 DB의 DELETE 명령만 구현하는 것으로 충분하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 네 가지를 함께 고려해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 어디에 개인정보가 존재하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 DB뿐만 아니라 Data Lake, DW, 분석계, 백업 등 전체 데이터 흐름을 파악해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 왜 필요한가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석이나 AI 학습에 실제 개인정보가 필요한지 검토하고, 필요하지 않은 정보는 처음부터 저장하지 않는 것이 좋다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 언제 파기해야 하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보유기간과 처리 목적을 기준으로 파기 시점을 관리하고, 법령에 따라 보존해야 하는 데이터는 별도로 관리해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 실제로 파기되었는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파기 Job의 성공 여부만 확인하는 것이 아니라 실제 데이터가 존재하지 않는지 downstream 시스템까지 검증해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 Data Lake의 개인정보 보호에서 중요한 것은&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;개인정보를 어떻게 삭제할 것인가?&amp;rdquo;보다 &amp;ldquo;개인정보가 불필요하게 여러 시스템으로 복제되지 않도록 어떻게 설계할 것인가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 질문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이미 여러 시스템에 개인정보가 존재한다면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;운영 DB에서 삭제했다&amp;rdquo;가 아니라 &amp;ldquo;파기 대상 데이터가 실제 처리환경 전체에서 제거되었음을 어떻게 검증할 것인가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 고민해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 관점에서 개인정보 파기는 DB 운영 업무가 아니라 &lt;b&gt;데이터 아키텍처와 개인정보 생명주기를 연결하는 통제 영역&lt;/b&gt;으로 볼 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 줄 정리&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data Lake의 개인정보 파기는 삭제 기능 하나를 구현하는 문제가 아니라, 데이터의 생성&amp;middot;복제&amp;middot;활용&amp;middot;보존&amp;middot;파기를 전체 생명주기 관점에서 설계하는 문제다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;b&gt;ISMS-P 인증기준&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3.4 개인정보 파기 시 보호조치&lt;/li&gt;
&lt;li&gt;3.4.1 개인정보 파기&lt;/li&gt;
&lt;li&gt;3.4.2 처리목적 달성 후 보유 시 조치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개인정보 보호법 제21조 &amp;mdash; 개인정보의 파기&lt;/b&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;복구&amp;middot;재생 방지&lt;/li&gt;
&lt;li&gt;법령상 보존 시 분리 저장&amp;middot;관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;국가법령정보센터 &amp;mdash; 개인정보 보호법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현행 법령 기준 확인&lt;br /&gt;&lt;a href=&quot;https://www.law.go.kr/lsInfoP.do?lsiSeq=283839&amp;amp;utm_source=chatgpt.com&quot;&gt;국가법령정보센터 개인정보 보호법&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ISMS-P 공식 사이트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISMS-P 인증기준 및 관련 자료 확인&lt;br /&gt;&lt;a href=&quot;https://isms-p.or.kr/sysm/intro/selectSysmCertDetail.do?utm_source=chatgpt.com&quot;&gt;ISMS-P 인증기준&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>ISMS-P 결함 가상시나리오</category>
      <category>AWS Glue</category>
      <category>aws s3</category>
      <category>CDC</category>
      <category>ISMS-P</category>
      <category>snowflake</category>
      <category>개인정보보호</category>
      <category>개인정보보호법</category>
      <category>개인정보파기</category>
      <category>데이터레이크</category>
      <category>정보보안</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/99</guid>
      <comments>https://ismsp-case.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 8 Sep 2026 09:32:39 +0900</pubDate>
    </item>
    <item>
      <title>Linux 서버 계정 관리 보안점검 U-11~U-13 | Bash 자동화 스크립트 포함</title>
      <link>https://ismsp-case.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 계정 관리 영역의 핵심 보안점검 항목인 &lt;b&gt;U-11~U-13&lt;/b&gt;은 사용자 로그인 쉘, 세션 자동 종료 시간, 비밀번호 암호화 알고리즘을 점검하는 항목이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 각 항목의 &lt;b&gt;자동 진단 스크립트가 실제로 어떤 설정을 확인하고 어떤 조건에서 결과를 출력하는지&lt;/b&gt;를 중심으로 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 계정의 로그인 쉘이나 PAM 설정, 비밀번호 암호화 방식을 변경하는 작업은 정상적인 사용자 로그인과 서비스 동작에 직접적인 영향을 줄 수 있으므로, 자동 진단 결과만으로 설정을 변경하지 않고 대상 시스템의 운영 목적과 실제 사용 여부를 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 계정 관리 점검 항목 종합 요약&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 136px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;점검코드&lt;/td&gt;
&lt;td&gt;점검 명칭&lt;/td&gt;
&lt;td&gt;주요 점검 대상 파일&lt;/td&gt;
&lt;td&gt;스크립트 기준 판단 방식&lt;/td&gt;
&lt;td&gt;위험도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;U-11&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;사용자 Shell 점검&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;/etc/passwd&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;UID 1000 이상 일반 계정 중 nologin, false, sync가 아닌 로그인 쉘을 사용하는 계정을 출력하고 수동 확인&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;U-12&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;세션 종료 시간 설정&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;/etc/profile&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;/etc/profile의 TMOUT 값을 확인하고 600초 이하이면 양호, 초과 또는 미설정이면 취약&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;U-13&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;안전한 비밀번호 암호화 알고리즘 사용&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;/etc/login.defs, /etc/pam.d/system-auth, /etc/pam.d/common-password&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;SHA512 또는 YESCRYPT 설정이 확인되면 양호, 그렇지 않으면 취약&lt;/td&gt;
&lt;td style=&quot;height: 42px;&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요:&lt;/b&gt; 위 표의 판단 방식은 일반적인 보안 가이드 전체를 설명한 것이 아니라, 현재 사용 중인 자동 진단 스크립트가 실제로 수행하는 검사 로직을 기준으로 작성했다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1 [U-11] 사용자 Shell 점검&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 점검 목적 및 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 계정에는 로그인 시 사용할 기본 Shell이 지정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 사용자 계정에 /bin/bash, /bin/sh와 같은 대화형 Shell이 설정되어 있으면 해당 계정을 이용한 직접 로그인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 시스템 서비스나 애플리케이션 실행에만 사용하는 계정은 일반적인 대화형 로그인이 필요하지 않은 경우가 많기 때문에 /sbin/nologin 또는 /bin/false 등을 지정하여 로그인 기능을 제한할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-11 스크립트에서는 모든 계정을 일괄적으로 취약 처리하지 않고 다음 조건에 해당하는 계정을 추출한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/etc/passwd의 UID가 1000 이상&lt;/li&gt;
&lt;li&gt;계정명이 nobody가 아님&lt;/li&gt;
&lt;li&gt;로그인 Shell이 nologin, false, sync가 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 해당 계정 목록을 확인한 후 실제 업무상 필요한 계정인지 수동으로 판단해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 자동 진단 스크립트&lt;/h3&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# [상세 해설] U-11 진단 코드 시작 식별자 선언
CODE &quot;[ U-11 ] 사용자 Shell 점검&quot;

# [상세 해설] /etc/passwd 파일에서 7번째 필드(로그인 쉘)가 nologin, false, sync가 아니며,
# [상세 해설] UID(3번째 필드)가 1000 이상인 대화형 일반 계정 목록을 필터링하여 변수에 저장
INTERACTIVE_USERS=$(awk -F: '$7 !~ /(nologin|false|sync)/ &amp;amp;&amp;amp; $3 &amp;gt;= 1000 &amp;amp;&amp;amp; $1 != &quot;nobody&quot; {print $1}' /etc/passwd | xargs)

# [상세 해설] 추출된 계정 목록을 관리자에게 출력하여 불필요한 계정이 포함되어 있는지 수동 검토 유도
INFO &quot;대화형 쉘이 부여된 일반 계정 중 불필요한 계정이 있는지 수동 확인 바랍니다.&quot; &quot;로그인 가능한 일반 계정 목록: [ ${INTERACTIVE_USERS:-없음} ]&quot;

# [상세 해설] U-11 진단 종료
FINISH &quot;[ U-11 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 스크립트는 어떻게 동작하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 다음 awk 조건이다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;$7 !~ /(nologin|false|sync)/ &amp;amp;&amp;amp; $3 &amp;gt;= 1000 &amp;amp;&amp;amp; $1 != &quot;nobody&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd는 일반적으로 다음과 같은 7개 필드 구조를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;계정명:x:UID:GID:설명:홈디렉터리:로그인쉘
&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;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;조건&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$7 !~ /(nologin|false|sync)/&lt;/td&gt;
&lt;td&gt;로그인 Shell이 제한된 Shell이 아닌 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$3 &amp;gt;= 1000&lt;/td&gt;
&lt;td&gt;UID 1000 이상인 일반 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$1 != &quot;nobody&quot;&lt;/td&gt;
&lt;td&gt;nobody 계정 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 조건에 맞는 계정명을 INTERACTIVE_USERS 변수에 저장하고 INFO 메시지로 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;U-11은 자동으로 [양호] 또는 [취약]을 판정하는 방식이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트가 출력한 계정 목록을 확인하고 해당 계정의 실제 사용 목적을 판단해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 수동 점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화형 Shell을 사용하는 일반 계정을 확인하려면 다음과 같이 점검할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;awk -F: '$7 !~ /(nologin|false|sync)/ &amp;amp;&amp;amp; $3 &amp;gt;= 1000 &amp;amp;&amp;amp; $1 != &quot;nobody&quot; {print $1, $7}' /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 계정의 Shell만 확인하려면 다음 명령을 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;grep &quot;^사용자계정명:&quot; /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인된 계정이 실제 사용자 계정인지, 배치&amp;middot;배포&amp;middot;애플리케이션 운영에 필요한 계정인지 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 보안실무 적용 시 주의사항&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서비스 계정의 Shell을 임의로 변경하지 않는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nginx, Tomcat, MySQL 등 애플리케이션 실행에 사용하는 계정이라고 해서 무조건 Shell을 차단하면 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 환경에서는 다음과 같이 계정으로 전환하여 명령을 실행하는 방식이 사용될 수 있다.&lt;/p&gt;
&lt;pre class=&quot;llvm&quot;&gt;&lt;code&gt;su - 계정명 -c &quot;command&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 구성에서 해당 계정의 Shell을 변경하면 기존 기동 또는 배치 작업에 영향을 줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 변경 전에 해당 계정이 어떤 프로세스와 서비스에서 사용되는지 확인해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배포&amp;middot;CI/CD 계정은 별도 검토한다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins, GitLab Runner, Ansible 등의 배포 계정은 자동화 작업을 위해 Shell 접근이 필요한 환경이 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 단순히 /sbin/nologin으로 변경하기보다는 실제 접속 목적과 인증 방식을 확인하고 접근통제 정책을 별도로 적용해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑥ 안전한 조치 절차&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 /etc/passwd를 백업한다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/passwd /etc/passwd_backup_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요한 대화형 로그인이 확인된 계정의 Shell을 변경한다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;usermod -s /sbin/nologin 사용자계정명
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 결과를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;grep &quot;^사용자계정명:&quot; /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 변경되었다면 해당 계정의 기본 로그인 Shell이 제한된 상태다.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;user01:x:1001:1001::/home/user01:/sbin/nologin
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2.2 [U-12] 세션 종료 시간 설정&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;① 점검 목적 및 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 로그인한 터미널을 장시간 방치하면 다른 사람이 해당 세션을 이용할 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TMOUT 환경변수는 일정 시간 동안 입력이 없는 Shell 세션을 자동으로 종료하기 위한 설정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 자동 진단 스크립트에서는 /etc/profile에 설정된 TMOUT 값을 확인하고 &lt;b&gt;600초 이하인지 여부&lt;/b&gt;를 기준으로 판정한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;② 자동 진단 스크립트&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# [상세 해설] U-12 진단 코드 시작 식별자 선언
CODE &quot;[ U-12 ] 세션 종료 시간 설정&quot;

# [상세 해설] /etc/profile 파일에서 주석을 제외한 TMOUT 설정 라인을 추출하고,
# [상세 해설] 공백과 따옴표를 제거하여 순수 초(second) 단위 값만 획득
TMOUT_VAL=$(grep -E &quot;^[[:space:]]*(export[[:space:]]+)?TMOUT=&quot; /etc/profile | tail -n 1 | cut -d= -f2 | tr -d '&quot;; ')

# [상세 해설] TMOUT 변수 값이 존재하는지 검증
if [ -n &quot;$TMOUT_VAL&quot; ]; then

    # [상세 해설] TMOUT 설정값이 600초(10분) 이하인지 수치 비교 수행
    if [ &quot;$TMOUT_VAL&quot; -le 600 ]; then
        OK &quot;세션 타임아웃(TMOUT)이 기준에 맞게 설정되어 있습니다.&quot; &quot;/etc/profile 내 TMOUT 값이 ${TMOUT_VAL}초로 설정됨.&quot;
    else
        WARN &quot;세션 타임아웃이 가이드 기준(600초)을 초과합니다.&quot; &quot;/etc/profile 내 TMOUT 값이 ${TMOUT_VAL}초로 초과 설정됨.&quot;
    fi

else
    # [상세 해설] TMOUT 설정이 없거나 주석 처리된 경우 취약으로 판정
    WARN &quot;세션 타임아웃(TMOUT) 설정이 적용되지 않았습니다.&quot; &quot;/etc/profile에 TMOUT 지시어가 없거나 주석 처리됨.&quot;
fi

# [상세 해설] U-12 진단 종료
FINISH &quot;[ U-12 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;③ 스크립트는 어떻게 동작하는가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 /etc/profile에서 다음과 같은 형식의 설정을 찾는다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;TMOUT=600
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export TMOUT=600
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tail -n 1을 사용하기 때문에 여러 개의 TMOUT 설정이 존재하면 &lt;b&gt;마지막으로 검색된 설정값&lt;/b&gt;을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 다음 조건으로 판정한다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[ &quot;$TMOUT_VAL&quot; -le 600 ]
&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;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6511%; text-align: center;&quot;&gt;/etc/profile TMOUT 상태&lt;/td&gt;
&lt;td style=&quot;width: 55.2326%; text-align: center;&quot;&gt;스크립트 결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6511%; text-align: center;&quot;&gt;TMOUT=600&lt;/td&gt;
&lt;td style=&quot;width: 55.2326%; text-align: center;&quot;&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6511%; text-align: center;&quot;&gt;TMOUT=300&lt;/td&gt;
&lt;td style=&quot;width: 55.2326%; text-align: center;&quot;&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6511%; text-align: center;&quot;&gt;TMOUT=601&lt;/td&gt;
&lt;td style=&quot;width: 55.2326%; text-align: center;&quot;&gt;WARN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6511%; text-align: center;&quot;&gt;TMOUT=900&lt;/td&gt;
&lt;td style=&quot;width: 55.2326%; text-align: center;&quot;&gt;WARN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6511%; text-align: center;&quot;&gt;설정 없음&lt;/td&gt;
&lt;td style=&quot;width: 55.2326%; text-align: center;&quot;&gt;WARN&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 현재 스크립트가 &lt;b&gt;/etc/profile만 검사한다는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 /etc/profile.d/*.sh 등에 실제 TMOUT 설정이 존재하더라도 현재 스크립트에서는 이를 확인하지 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;④ 수동 점검&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트와 동일한 범위에서 확인하려면 다음과 같이 점검한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;grep -E &quot;^[[:space:]]*(export[[:space:]]+)?TMOUT=&quot; /etc/profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 로그인 세션에 실제 적용된 값은 다음과 같이 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;echo $TMOUT
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⑤ 보안실무 적용 시 주의사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장시간 작업 중 세션 종료에 주의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 서버에서 다음과 같은 작업을 대화형 SSH 세션에서 직접 실행하는 경우 TMOUT 설정에 의해 세션이 종료될 수 있다.&lt;/p&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;데이터베이스 마이그레이션&lt;/li&gt;
&lt;li&gt;장시간 백업&lt;/li&gt;
&lt;li&gt;대규모 로그 처리&lt;/li&gt;
&lt;li&gt;장시간 컴파일 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장시간 실행되는 작업은 운영 환경에 맞게 nohup, screen, tmux 또는 서비스&amp;middot;배치 형태로 실행하는 것이 안전하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SSH 연결 유지 설정과 구분&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TMOUT은 Shell 레벨의 유휴 세션 제어이고 SSH의 ClientAliveInterval, ClientAliveCountMax와는 목적과 동작 방식이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 SSH 연결 유지 정책을 함께 사용하는 환경에서는 두 설정을 별도로 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⑥ 안전한 조치 절차&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 /etc/profile을 백업한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;cp -p /etc/profile /etc/profile_backup_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 세션 타임아웃을 설정한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt; 'EOF' &amp;gt;&amp;gt; /etc/profile

# 세션 자동 종료 설정 (600초 = 10분)
export TMOUT=600
readonly TMOUT
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 Shell 세션에서 적용 여부를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;echo $TMOUT
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 적용되었다면 다음과 같이 확인된다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;600
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 로그인 세션은 이미 로드된 환경변수를 사용하고 있을 수 있으므로 새 세션에서 결과를 확인하는 것이 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2.3 [U-13] 안전한 비밀번호 암호화 알고리즘 사용&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;① 점검 목적 및 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호는 평문으로 저장하지 않고 단방향 암호화 방식으로 변환하여 저장해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 U-13 스크립트에서는 비밀번호 암호화 알고리즘으로 &lt;b&gt;SHA-512 또는 YESCRYPT&lt;/b&gt;가 설정되어 있는지를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 진단은 다음 순서로 진행된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/etc/login.defs의 ENCRYPT_METHOD 확인&lt;/li&gt;
&lt;li&gt;SHA512 또는 YESCRYPT이면 양호&lt;/li&gt;
&lt;li&gt;해당 설정을 찾지 못하면 PAM 설정 파일 확인&lt;/li&gt;
&lt;li&gt;sha512 또는 yescrypt 문자열이 확인되면 양호&lt;/li&gt;
&lt;li&gt;둘 모두 확인되지 않으면 취약&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;② 자동 진단 스크립트&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# [상세 해설] U-13 진단 코드 시작 식별자 선언
CODE &quot;[ U-13 ] 안전한 비밀번호 암호화 알고리즘 사용 (2026 신규/강화)&quot;

# [상세 해설] 알고리즘 안전성 판별을 위한 플래그 및 사유 변수 초기화
IS_SECURE_ALGO=&quot;FALSE&quot;
REASON_ALGO=&quot;&quot;

# [상세 해설] /etc/login.defs 파일 내 기본 암호화 지시어(ENCRYPT_METHOD) 확인
if [ -f /etc/login.defs ]; then
    ALGO=$(grep -i -E &quot;^[[:space:]]*ENCRYPT_METHOD&quot; /etc/login.defs | awk '{print $2}')

    # [상세 해설] 추출된 알고리즘이 SHA512 또는 YESCRYPT인지 비교
    if [[ &quot;$ALGO&quot; == &quot;SHA512&quot; || &quot;$ALGO&quot; == &quot;YESCRYPT&quot; ]]; then
        IS_SECURE_ALGO=&quot;TRUE&quot;
        REASON_ALGO=&quot;/etc/login.defs 에 안전한 알고리즘($ALGO)이 설정됨.&quot;
    fi
fi

# [상세 해설] login.defs에서 미확인 시 PAM 인증 모듈 설정 파일 점검
if [[ &quot;$IS_SECURE_ALGO&quot; == &quot;FALSE&quot; ]]; then
    if grep -E -q &quot;sha512|yescrypt&quot; /etc/pam.d/system-auth /etc/pam.d/common-password 2&amp;gt;/dev/null; then
        IS_SECURE_ALGO=&quot;TRUE&quot;
        REASON_ALGO=&quot;PAM 인증 파일(system-auth 등)에 sha512 또는 yescrypt 모듈이 적용됨.&quot;
    else
        REASON_ALGO=&quot;/etc/login.defs 및 PAM 파일에 안전한 암호화 지시어가 없음.&quot;
    fi
fi

# [상세 해설] 판정 결과 출력
if [[ &quot;$IS_SECURE_ALGO&quot; == &quot;TRUE&quot; ]]; then
    OK &quot;안전한 패스워드 암호화 알고리즘이 시스템에 적용되어 있습니다.&quot; &quot;$REASON_ALGO&quot;
else
    WARN &quot;안전하지 않은 패스워드 알고리즘(MD5 등)을 사용 중이거나 설정 누락 상태입니다.&quot; &quot;$REASON_ALGO&quot;
fi

# [상세 해설] U-13 진단 종료
FINISH &quot;[ U-13 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;③ 스크립트는 어떻게 동작하는가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 /etc/login.defs에서 다음 설정을 찾는다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;ENCRYPT_METHOD SHA512
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;ENCRYPT_METHOD YESCRYPT
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 중 하나가 확인되면 IS_SECURE_ALGO를 TRUE로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 login.defs에서 확인되지 않으면 다음 PAM 파일을 검색한다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;/etc/pam.d/system-auth
/etc/pam.d/common-password
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다음 문자열이 포함되어 있는지 검사한다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;sha512
yescrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 현재 스크립트의 판정 구조는 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;검사 위치&lt;/td&gt;
&lt;td&gt;확인 내용&lt;/td&gt;
&lt;td&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/etc/login.defs&lt;/td&gt;
&lt;td&gt;ENCRYPT_METHOD SHA512&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/etc/login.defs&lt;/td&gt;
&lt;td&gt;ENCRYPT_METHOD YESCRYPT&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PAM 설정&lt;/td&gt;
&lt;td&gt;sha512 문자열 존재&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PAM 설정&lt;/td&gt;
&lt;td&gt;yescrypt 문자열 존재&lt;/td&gt;
&lt;td&gt;TRUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;어느 곳에서도 확인되지 않음&lt;/td&gt;
&lt;td&gt;안전한 알고리즘 설정 미확인&lt;/td&gt;
&lt;td&gt;WARN&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은 &lt;b&gt;U-13 스크립트가 실제 /etc/shadow의 모든 비밀번호 해시를 직접 분석하는 것은 아니라는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 설정 파일에 안전한 알고리즘이 지정되어 있는지를 우선 확인하는 방식이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;④ 수동 점검&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login.defs 설정을 확인한다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;grep -i -E &quot;^[[:space:]]*ENCRYPT_METHOD&quot; /etc/login.defs
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAM 설정을 확인한다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;grep -E &quot;sha512|yescrypt&quot; /etc/pam.d/system-auth /etc/pam.d/common-password 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 /etc/shadow에 저장된 해시의 식별자를 확인할 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;nsis&quot;&gt;&lt;code&gt;awk -F: '$2 ~ /^\$6\$/ || $2 ~ /^\$y\$/ {print $1}' /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 $6$와 $y$는 현재 개선 스니펫에서 실제 저장된 해시를 확인하기 위해 사용하는 식별자다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⑤ 보안실무 적용 시 주의사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존 비밀번호가 자동으로 변경되는 것은 아니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/login.defs 또는 PAM 설정을 변경하더라도 이미 /etc/shadow에 저장되어 있는 기존 비밀번호 해시가 즉시 새로운 알고리즘으로 변환되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 설정 변경 이후 실제 비밀번호 변경이 필요한 환경에서는 대상 계정의 비밀번호 변경 정책과 적용 시점을 별도로 관리해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PAM 설정 변경은 특히 주의한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAM 설정 파일의 문법이나 모듈 순서를 잘못 변경하면 사용자 인증이나 sudo 등에 영향을 줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 운영 서버에서는 작업 전에 현재 설정을 백업하고, 별도의 root 세션을 유지한 상태에서 변경하는 것이 안전하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RHEL 계열에서 authselect를 사용하는 환경이라면 현재 시스템의 인증 프로파일과 관리 방식을 먼저 확인한 후 적용해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⑥ 안전한 조치 절차&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 설정 파일을 백업한다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/login.defs /etc/login.defs_backup_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ENCRYPT_METHOD 설정이 존재하는 경우 SHA512로 변경한다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;if grep -q &quot;^ENCRYPT_METHOD&quot; /etc/login.defs; then
    sed -i 's/^ENCRYPT_METHOD.*/ENCRYPT_METHOD SHA512/' /etc/login.defs
else
    echo &quot;ENCRYPT_METHOD SHA512&quot; &amp;gt;&amp;gt; /etc/login.defs
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 결과를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;grep -i -E &quot;^[[:space:]]*ENCRYPT_METHOD&quot; /etc/login.defs
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 PAM 설정은 배포판과 인증 구성에 따라 관리 방식이 다르므로, 해당 환경의 표준 관리 도구와 현재 인증 구성을 확인한 후 적용해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. 자동 진단 스크립트의 한계 및 예외 처리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트는 실무 환경에서 빠르게 점검할 수 있도록 구성되어 있지만, 최신 Linux의 모듈형 설정 구조를 모두 추적하는 것은 아니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.1 U-11의 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-11은 /etc/passwd의 로컬 계정 정보를 기준으로 검사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 LDAP, AD, NIS 등 외부 인증 시스템에서 제공하는 계정은 현재 스크립트의 검사 대상에 포함되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 대화형 Shell을 사용하는 계정이라고 해서 반드시 불필요한 계정인 것은 아니므로, 출력된 계정 목록에 대한 업무상 필요성 확인이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.2 U-12의 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 U-12 스크립트는 다음 파일만 검사한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;/etc/profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 위치에 실제 TMOUT 설정이 존재하는 경우 현재 스크립트에서는 확인하지 못할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/etc/profile.d/*.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 /etc/profile.d/session.sh에 다음 설정이 존재하더라도 현재 U-12 스크립트는 이를 직접 검사하지 않는다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export TMOUT=600
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 최신 시스템에서는 /etc/profile뿐 아니라 실제 Shell 초기화 과정에서 적용되는 설정까지 확인할 필요가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.3 U-13의 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-13 역시 모든 PAM Include 구조를 재귀적으로 분석하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 PAM 설정에서 다른 파일을 include 또는 substack 방식으로 호출하는 경우 현재 스크립트가 직접 검색하는 파일에 sha512 또는 yescrypt 문자열이 없으면 실제 적용 상태와 스크립트 결과가 다를 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 /etc/login.defs의 설정만 확인하는 것과 실제 /etc/shadow에 저장된 각 계정의 해시 알고리즘을 확인하는 것은 서로 다른 검사다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 U-13 결과를 보다 정확하게 검증하려면 &lt;b&gt;설정값 확인과 실제 저장 해시 확인을 구분하여 수행하는 것이 필요하다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. 최신 Linux 환경을 고려한 개선 검사 예시&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.1 U-12 TMOUT 설정 범위 확대&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 /etc/profile만 검사하는 방식에서 /etc/profile.d/*.sh까지 검사 범위를 확대할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# /etc/profile 및 /etc/profile.d/ 내 TMOUT 설정 확인
TMOUT_VAL=$(grep -h -E &quot;^[[:space:]]*(export[[:space:]]+)?TMOUT=[0-9]+&quot; \
    /etc/profile /etc/profile.d/*.sh 2&amp;gt;/dev/null |
    tail -n 1 |
    cut -d= -f2 |
    tr -d '&quot;; ')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 현재 U-12 기본 스크립트와 달리 profile.d에 분리된 설정까지 검색한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.2 U-13 실제 저장 해시 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 파일의 알고리즘 지정 여부와 별도로 /etc/shadow에 저장된 해시 식별자를 직접 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;nsis&quot;&gt;&lt;code&gt;SHADOW_HASH_CHECK=$(awk -F: \
    '$2 ~ /^\$6\$/ || $2 ~ /^\$y\$/ {print $1}' \
    /etc/shadow | wc -l)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정별 실제 해시 식별자를 확인하려면 다음과 같이 점검할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;awk -F: '
$2 ~ /^\$6\$/ {print $1 &quot; : SHA-512&quot;}
$2 ~ /^\$y\$/ {print $1 &quot; : YESCRYPT&quot;}
' /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 검사는 &lt;b&gt;설정 파일에 지정된 기본 알고리즘&lt;/b&gt;과 &lt;b&gt;현재 계정에 실제 저장된 해시 알고리즘&lt;/b&gt;을 구분하여 확인할 수 있다는 점에서 의미가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. U-11~U-13 자동화 스크립트 판정 기준 정리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;자동화 스크립트의 핵심 검사&lt;/td&gt;
&lt;td&gt;자동 판정&lt;/td&gt;
&lt;td&gt;추가 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-11&lt;/td&gt;
&lt;td&gt;UID 1000 이상 계정의 대화형 Shell 추출&lt;/td&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;td&gt;계정 사용 목적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-12&lt;/td&gt;
&lt;td&gt;/etc/profile의 TMOUT &amp;le; 600&lt;/td&gt;
&lt;td&gt;OK/WARN&lt;/td&gt;
&lt;td&gt;profile.d 및 실제 세션 적용 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-13&lt;/td&gt;
&lt;td&gt;SHA512/YESCRYPT 설정 확인&lt;/td&gt;
&lt;td&gt;OK/WARN&lt;/td&gt;
&lt;td&gt;PAM Include 구조 및 실제 /etc/shadow 해시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 U-11~U-13에서 특히 중요한 부분은 &lt;b&gt;자동화 스크립트가 모든 보안 상태를 완전히 판정하는 것이 아니라는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-11은 계정 목록을 출력하고 관리자가 필요성을 판단하는 구조이며, U-12와 U-13은 특정 설정 파일과 문자열을 기준으로 자동 판정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 자동화 점검 결과는 &lt;b&gt;1차 진단 자료&lt;/b&gt;로 활용하고, 실제 운영 환경에서는 설정 적용 경로와 계정 사용 목적까지 함께 확인하는 것이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 자동화 스크립트를 활용한 점검 순서&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-11~U-13의 결과를 먼저 확인한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[ U-11 ] 사용자 Shell 점검
[ U-12 ] 세션 종료 시간 설정
[ U-13 ] 안전한 비밀번호 암호화 알고리즘 사용
&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;U-11은 /etc/passwd, U-12는 /etc/profile, U-13은 /etc/login.defs와 PAM 설정을 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 운영 영향도 확인&lt;/h3&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;서비스 계정&lt;/li&gt;
&lt;li&gt;배치 계정&lt;/li&gt;
&lt;li&gt;배포 계정&lt;/li&gt;
&lt;li&gt;장시간 실행 작업&lt;/li&gt;
&lt;li&gt;PAM 인증 구성&lt;/li&gt;
&lt;li&gt;기존 사용자 비밀번호&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 설정 파일 백업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 변경 전 원본 파일을 별도로 백업한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 변경 후 재점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 변경이 완료되면 동일한 자동 진단 스크립트를 다시 실행하여 변경 결과를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑥ 서비스 및 로그인 정상 여부 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 설정이 정상적으로 변경되었더라도 실제 사용자 로그인, sudo, 애플리케이션 서비스 및 배치 작업이 정상적으로 동작하는지 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;본 포스팅의 스크립트 및 조치 방법은 Linux 시스템의 &lt;b&gt;계정 관리 및 인증 보안점검과 보안 강화를 목적&lt;/b&gt;으로 작성되었다. Linux 배포판, 버전, 설치된 서비스 및 인증 구성에 따라 설정 파일과 적용 방식이 다를 수 있다.&lt;br /&gt;특히 사용자 로그인 Shell, TMOUT, PAM 및 비밀번호 암호화 관련 설정을 변경하면 정상적인 로그인이나 장시간 실행 작업, 서비스 인증에 영향을 줄 수 있으므로 &lt;b&gt;운영 서버에 적용하기 전에 반드시 테스트 환경에서 검증한 후 적용해야 한다.&lt;br /&gt;&lt;/b&gt;계정의 Shell을 변경하기 전에는 해당 계정이 서비스, 배치 또는 배포 작업에서 사용되고 있는지 확인해야 한다. 또한 PAM 및 비밀번호 인증 설정을 변경할 경우 현재 인증 구성과 백업 상태를 확인한 후 적용하는 것이 필요하다.&lt;br /&gt;스크립트 실행 및 설정 변경으로 인해 발생하는 시스템 장애에 대해서는 사용 환경에 맞는 사전 검증이 필요하다.&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함께 보면 좋은 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linux 보안취약점 점검 자동화 스크립트 공통 함수 및 환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 보안취약점 점검 스크립트를 여러 항목에서 공통으로 사용하기 위한 함수와 환경 설정에 대한 내용은 별도의 글에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot;&gt;자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#U11 #U12 #U13 #주요정보통신기반시설 #리눅스보안점검 #계정관리보안 #사용자쉘점검 #세션타임아웃설정 #비밀번호암호화 #보안취약점진단 #서버보안가이드</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/98</guid>
      <comments>https://ismsp-case.tistory.com/98#entry98comment</comments>
      <pubDate>Fri, 4 Sep 2026 15:30:23 +0900</pubDate>
    </item>
    <item>
      <title>Linux 서버 계정 관리 보안점검 U-06~U-10 | Bash 자동화 스크립트 포함</title>
      <link>https://ismsp-case.tistory.com/97</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 서버의 계정 및 권한 관리 보안과 관련된 핵심 취약점 항목(U-06 ~ U-10)을 대상으로 자동 진단 스크립트의 동작 원리와 판정 기준, 수동 검증 방법 및 안전한 조치 절차를 정리한다. 사용자 계정의 su 기능 제한부터 불필요한 시스템 계정, 관리자 그룹, 고아 GID, 중복 UID까지 실제 서버에서 확인해야 하는 항목을 자동화 스크립트와 함께 설명한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 계정 및 권한 관리 보안 점검 항목 종합 요약&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;점검코드&lt;/td&gt;
&lt;td style=&quot;width: 18.6046%;&quot;&gt;점검 명칭&lt;/td&gt;
&lt;td style=&quot;width: 16.9767%;&quot;&gt;주요 점검 대상 파일&lt;/td&gt;
&lt;td style=&quot;width: 48.9535%;&quot;&gt;스크립트 기준 양호 판단&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;위험도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;U-06&lt;/td&gt;
&lt;td style=&quot;width: 18.6046%;&quot;&gt;사용자 계정 su 기능 제한&lt;/td&gt;
&lt;td style=&quot;width: 16.9767%;&quot;&gt;/etc/pam.d/su, /etc/group&lt;/td&gt;
&lt;td style=&quot;width: 48.9535%;&quot;&gt;/etc/pam.d/su에 주석 처리되지 않은 pam_wheel.so 설정이 존재하는 경우&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;U-07&lt;/td&gt;
&lt;td style=&quot;width: 18.6046%;&quot;&gt;불필요한 계정 제거&lt;/td&gt;
&lt;td style=&quot;width: 16.9767%;&quot;&gt;/etc/passwd&lt;/td&gt;
&lt;td style=&quot;width: 48.9535%;&quot;&gt;스크립트에 지정된 주요 시스템 계정에 로그인 가능한 쉘이 존재하지 않는 경우&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;U-08&lt;/td&gt;
&lt;td style=&quot;width: 18.6046%;&quot;&gt;관리자 그룹에 최소한의 계정 포함&lt;/td&gt;
&lt;td style=&quot;width: 16.9767%;&quot;&gt;/etc/group&lt;/td&gt;
&lt;td style=&quot;width: 48.9535%;&quot;&gt;관리자 그룹 구성원을 자동 판정하지 않고 목록을 출력하여 업무상 필요성을 수동 검토&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;U-09&lt;/td&gt;
&lt;td style=&quot;width: 18.6046%;&quot;&gt;계정이 존재하지 않는 GID 금지&lt;/td&gt;
&lt;td style=&quot;width: 16.9767%;&quot;&gt;/etc/passwd, /etc/group&lt;/td&gt;
&lt;td style=&quot;width: 48.9535%;&quot;&gt;/etc/passwd의 모든 계정 GID가 /etc/group에 존재하는 경우&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.4186%;&quot;&gt;U-10&lt;/td&gt;
&lt;td style=&quot;width: 18.6046%;&quot;&gt;동일한 UID 금지&lt;/td&gt;
&lt;td style=&quot;width: 16.9767%;&quot;&gt;/etc/passwd&lt;/td&gt;
&lt;td style=&quot;width: 48.9535%;&quot;&gt;/etc/passwd에 동일한 UID를 사용하는 계정이 없는 경우&lt;/td&gt;
&lt;td style=&quot;width: 6.04651%;&quot;&gt;중&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요:&lt;/b&gt; 위 표의 &quot;판단 기준&quot;은 일반적인 보안 설명을 그대로 옮긴 것이 아니라, 본문에 포함된 자동화 스크립트가 실제로 수행하는 조건을 기준으로 정리한 것이다. 특히 U-08은 스크립트에서 자동으로 [양호] 또는 [취약]을 판정하지 않고 관리자 그룹 구성원 목록을 출력하는 방식으로 동작한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 세부 항목별 진단 및 조치 가이드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1. [U-06] 사용자 계정 su 기능 제한&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 점검 목적 및 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;su 명령은 일반 사용자가 다른 계정으로 전환할 수 있도록 하는 기능이다. 특히 root 계정으로의 전환을 제한하지 않을 경우 인증정보 탈취나 비인가 계정 전환을 통한 관리자 권한 획득 가능성이 증가할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-06 자동 점검에서는 /etc/pam.d/su 파일에 pam_wheel.so PAM 모듈이 활성화되어 있는지를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트는 pam_wheel.so 설정의 존재 여부를 기준으로 자동 판정하며, 실제로 해당 설정이 적용되는 그룹 구성원까지 자동으로 검증하지는 않는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 자동 진단 스크립트 분석&lt;/h3&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;# U-06 점검 시작 코드 정의
CODE &quot;[ U-06 ] 사용자 계정 su 기능 제한&quot;

# /etc/pam.d/su 설정 파일의 존재 유무 확인
if [ -f /etc/pam.d/su ]; then
    # pam_wheel.so 모듈 활성화 여부를 정규표현식으로 검사 (주석 제외)
    if grep -E -q &quot;^[[:space:]]*auth[[:space:]]+required[[:space:]]+pam_wheel\.so&quot; /etc/pam.d/su; then
        OK &quot;su 명령어 사용이 특정 그룹으로 안전하게 제한되어 있습니다.&quot; &quot;/etc/pam.d/su 파일 내에 pam_wheel.so 모듈이 활성화되어 있음.&quot;
    else
        WARN &quot;su 명령어 사용 제한이 적용되지 않았습니다.&quot; &quot;/etc/pam.d/su 파일 내에 pam_wheel.so 설정이 없거나 주석(#) 처리됨.&quot;
    fi
else
    INFO &quot;su PAM 설정 파일이 존재하지 않습니다. 수동 점검 바랍니다.&quot; &quot;/etc/pam.d/su 파일 없음.&quot;
fi

# U-06 점검 종료 처리
FINISH &quot;[ U-06 ] 점검완료&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;U-06은 비교적 단순한 구조로 구성되어 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;/etc/pam.d/su 파일 존재 여부를 확인한다.&lt;/li&gt;
&lt;li&gt;파일이 존재하면 pam_wheel.so 설정을 검색한다.&lt;/li&gt;
&lt;li&gt;다음 조건을 만족하면 [양호]로 처리한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;auth required pam_wheel.so
&lt;/code&gt;&lt;/pre&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;li&gt;/etc/pam.d/su 자체가 존재하지 않으면 [정보]를 출력하고 수동점검 대상으로 남긴다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 스크립트에서 U-06의 핵심 판정값은 &lt;b&gt;pam_wheel.so 활성화 여부&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 수동 진단 및 설정 검증 절차&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 진단 결과와 실제 관리자 그룹 구성을 함께 확인한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# PAM 모듈 설정 내 pam_wheel.so 적용 여부 확인
grep -E &quot;pam_wheel\.so&quot; /etc/pam.d/su

# wheel 그룹에 소속된 사용자 확인
grep &quot;^wheel:&quot; /etc/group
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 스크립트는 pam_wheel.so의 존재 여부를 확인하지만, wheel 그룹에 어떤 계정이 들어가 있는지까지 자동으로 판단하지 않는다.&lt;/p&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;pam_wheel.so가 활성화되어 있는가?&lt;/li&gt;
&lt;li&gt;wheel 그룹에 등록된 계정이 실제 업무상 필요한 계정인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 안전한 조치 및 원복 절차&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 1. 설정 파일 원본 백업
cp -p /etc/pam.d/su /etc/pam.d/su.bak_$(date +%Y%m%d)

# 2. pam_wheel.so 주석 해제 또는 추가 (wheel 그룹 제한)
sed -i 's/^#\s*\(auth\s*required\s*pam_wheel\.so\s*use_uid\)/\1/' /etc/pam.d/su

# 3. 신뢰할 수 있는 관리자 계정만 wheel 그룹에 추가
usermod -aG wheel [관리자계정]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAM 설정은 로그인 및 권한 전환 동작에 직접 영향을 줄 수 있으므로 운영 서버에서는 변경 전 백업과 테스트가 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.2. [U-07] 불필요한 계정 제거&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 점검 목적 및 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 시스템에는 운영체제 및 서비스 동작을 위해 다양한 시스템 계정이 기본적으로 생성될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 계정에 대화형 로그인 쉘이 설정되어 있으면 실제 사용하지 않는 계정이 외부 접근이나 내부 권한 상승의 진입점으로 악용될 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 업무상 사용하지 않는 시스템 계정은 로그인 자체를 제한하는 것이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 U-07 스크립트는 /etc/passwd 전체 계정을 무조건 검사하는 방식이 아니라, 스크립트에 지정된 주요 시스템 계정 목록을 대상으로 로그인 쉘을 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 자동 진단 스크립트 분석&lt;/h3&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# U-07 점검 시작 코드 정의
CODE &quot;[ U-07 ] 불필요한 계정 제거&quot;

# 주요 기본 시스템 계정 중 대화형 쉘(/bin/bash 등)을 사용하는 계정 필터링
WEAK_SYS_ACCOUNTS=$(grep -E &quot;^(daemon|bin|sys|adm|listen|nobody|nobody4|noaccess|diag|operator|gopher|games|ftp|apache|httpd|rfc822|uucp|nuucp):&quot; /etc/passwd | grep -v -E &quot;(nologin|false|sync)$&quot; | awk -F: '{print $1}' | xargs)

# 취약 계정 목록 유무에 따른 판정
if [ -z &quot;$WEAK_SYS_ACCOUNTS&quot; ]; then
    OK &quot;기본 시스템 계정들의 로그인 쉘이 안전하게 제한되어 있습니다.&quot; &quot;시스템 계정들에 nologin, false 쉘이 부여되어 직접 로그인 불가.&quot;
else
    WARN &quot;로그인이 가능한 상태의 불필요한 시스템 계정이 존재합니다.&quot; &quot;로그인 가능한 쉘이 부여된 시스템 계정 발견: [ $WEAK_SYS_ACCOUNTS ]&quot;
fi

# U-07 점검 종료 처리
FINISH &quot;[ U-07 ] 점검완료&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;U-07은 /etc/passwd의 계정명과 마지막 필드인 로그인 쉘을 조합하여 판단한다.&lt;/p&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;/bin/bash&lt;/li&gt;
&lt;li&gt;/bin/sh&lt;/li&gt;
&lt;li&gt;기타 로그인 가능한 쉘&lt;/li&gt;
&lt;/ul&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;nologin&lt;/li&gt;
&lt;li&gt;false&lt;/li&gt;
&lt;li&gt;sync&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 현재 스크립트 기준으로 해당 시스템 계정에 로그인 가능한 쉘이 발견되면 [취약], 발견되지 않으면 [양호]로 처리한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 수동 진단 및 설정 검증 절차&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# 시스템 계정들의 로그인 쉘 상태 확인
grep -E &quot;^(daemon|bin|sys|adm|listen|nobody|games|ftp):&quot; /etc/passwd
&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;특히 apache, httpd, ftp 등 서비스와 연결된 계정은 단순히 계정명만 보고 삭제하기보다 해당 서비스의 실행 계정인지 먼저 확인해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 안전한 조치 및 원복 절차&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# 1. 계정 정보 원본 백업
cp -p /etc/passwd /etc/passwd.bak_$(date +%Y%m%d)

# 2. 불필요한 시스템 계정의 쉘을 nologin으로 변경
usermod -s /sbin/nologin daemon
usermod -s /sbin/nologin bin
usermod -s /sbin/nologin sys
usermod -s /sbin/nologin adm
usermod -s /sbin/nologin games
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정 자체를 삭제하는 것보다 서비스 영향도를 낮추기 위해 로그인 쉘을 /sbin/nologin 또는 /bin/false로 변경하는 방식을 우선적으로 검토할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.3. [U-08] 관리자 그룹에 최소한의 계정 포함&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 점검 목적 및 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root, wheel과 같은 관리자 권한 그룹에 불필요한 계정이 포함되어 있으면 해당 계정이 필요 이상의 권한을 획득할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 관리자 그룹에는 실제 업무 수행에 필요한 계정만 포함되도록 관리해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 U-08의 현재 자동화 스크립트는 &lt;b&gt;관리자 그룹 구성원이 적절한지 자동으로 판단하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 그룹의 구성원을 추출하여 INFO로 출력하고, 해당 계정의 업무상 필요성을 관리자가 직접 검토하도록 구성되어 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 자동 진단 스크립트 분석&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# U-08 점검 시작 코드 정의
CODE &quot;[ U-08 ] 관리자 그룹에 최소한의 계정 포함&quot;

# /etc/group 파일에서 root 및 wheel 그룹의 구성원 계정 리스트 추출
ADMIN_GROUP=$(grep -E &quot;^(root|wheel):&quot; /etc/group | awk -F: '{print $4}')

# 관리자 수동 검토를 유도하는 정보 출력
INFO &quot;관리자 그룹 소속 계정의 업무상 필요성 여부를 수동으로 확인해야 합니다.&quot; &quot;관리자 그룹(root, wheel)에 포함된 계정 목록: [ ${ADMIN_GROUP:-없음} ]&quot;

# U-08 점검 종료 처리
FINISH &quot;[ U-08 ] 점검완료&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;U-08의 핵심은 ADMIN_GROUP 변수이다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ADMIN_GROUP=$(grep -E &quot;^(root|wheel):&quot; /etc/group | awk -F: '{print $4}')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/group에서 root와 wheel 그룹의 구성원 정보를 추출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 INFO를 통해 구성원 목록을 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 U-08은 U-06, U-07, U-09, U-10과 달리 자동으로 [양호] 또는 [취약]을 결정하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 출력될 수 있다.&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;[정보] 관리자 그룹 소속 계정의 업무상 필요성 여부를 수동으로 확인해야 합니다.
관리자 그룹(root, wheel)에 포함된 계정 목록: [ admin01 admin02 ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 결과를 기준으로 실제 관리자 권한이 필요한 계정인지 확인해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 수동 진단 및 설정 검증 절차&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 관리자 그룹 구성원 조회
grep -E &quot;^(root|wheel):&quot; /etc/group
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인된 계정에 대해 다음을 검토한다.&lt;/p&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;li&gt;해당 계정에 관리자 그룹 권한이 반드시 필요한가?&lt;/li&gt;
&lt;li&gt;퇴직자&amp;middot;부서이동자&amp;middot;미사용 계정이 포함되어 있지 않은가?&lt;/li&gt;
&lt;li&gt;공용 계정을 사용하고 있지 않은가?&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 안전한 조치 및 원복 절차&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 1. 그룹 설정 파일 백업
cp -p /etc/group /etc/group.bak_$(date +%Y%m%d)

# 2. 관리자 그룹에서 불필요한 계정 제거 (gpasswd 활용)
gpasswd -d [불필요계정] wheel
gpasswd -d [불필요계정] root
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의:&lt;/b&gt; root 그룹에서 계정을 제거하는 작업은 시스템 및 애플리케이션 구성에 따라 영향도가 발생할 수 있으므로 실제 운영 환경에서는 대상 계정과 그룹 구성을 먼저 확인해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.4. [U-09] 계정이 존재하지 않는 GID 금지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 점검 목적 및 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 계정은 /etc/passwd에 기본 그룹의 GID를 가지고 있으며, 해당 GID는 /etc/group에 정의된 그룹과 연결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd에 존재하는 GID가 /etc/group에 존재하지 않는 경우 계정과 그룹 간의 관리 관계가 불명확해질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-09 스크립트는 /etc/passwd의 각 계정 GID를 /etc/group과 비교하여 존재하지 않는 GID를 사용하는 계정을 탐지한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 자동 진단 스크립트 분석&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# U-09 점검 시작 코드 정의
CODE &quot;[ U-09 ] 계정이 존재하지 않는 GID 금지&quot;

# 고아 GID 보유 계정 목록 변수 초기화
ORPHAN_GID_ACCOUNTS=&quot;&quot;

# /etc/passwd를 한 줄씩 읽어 사용자명과 GID 파싱
while IFS=: read -r user _ _ gid _; do
    # /etc/group 내 3번째 필드(GID)와 일치하는 그룹이 존재하는지 검증
    if ! grep -q -E &quot;^[^:]*:[^:]*:$gid:&quot; /etc/group; then
        ORPHAN_GID_ACCOUNTS=&quot;$ORPHAN_GID_ACCOUNTS $user($gid)&quot;
    fi
done &amp;lt; /etc/passwd

# 고아 GID 발견 여부에 따른 결과 판정
if [ -z &quot;$ORPHAN_GID_ACCOUNTS&quot; ]; then
    OK &quot;모든 계정이 유효한 GID를 사용하고 있습니다.&quot; &quot;/etc/passwd에 등록된 모든 사용자의 GID가 /etc/group에 존재함.&quot;
else
    WARN &quot;그룹 파일(/etc/group)에 존재하지 않는 GID를 사용하는 계정이 있습니다.&quot; &quot;고아(Orphan) GID 사용 계정: [ $ORPHAN_GID_ACCOUNTS ]&quot;
fi

# U-09 점검 종료 처리
FINISH &quot;[ U-09 ] 점검완료&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;스크립트는 /etc/passwd를 한 줄씩 읽으면서 다음 정보를 추출한다.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;사용자명 : GID
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 해당 GID가 /etc/group의 세 번째 필드에 존재하는지 검색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 /etc/passwd에 다음과 같은 계정이 있다고 가정한다.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;testuser:x:1001:1550:/home/testuser:/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 /etc/group에 GID 1550을 사용하는 그룹이 존재하지 않으면 해당 계정을 고아 GID 계정으로 분류한다.&lt;/p&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;고아 GID 계정 없음 &amp;rarr; [양호]&lt;/li&gt;
&lt;li&gt;고아 GID 계정 존재 &amp;rarr; [취약]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 수동 진단 및 설정 검증 절차&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 시스템 내 모든 계정의 GID 유효성 수동 대조
awk -F: '{print $1, $4}' /etc/passwd | while read -r user gid; do
    grep -q -E &quot;^[^:]*:[^:]*:$gid:&quot; /etc/group || echo &quot;고아 GID 발견: $user (GID: $gid)&quot;
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 결과에서 특정 계정이 발견되면 해당 계정의 실제 업무 목적과 기존 그룹 구성을 함께 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 안전한 조치 및 원복 절차&lt;/h3&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;# 1. 패스워드 및 그룹 파일 백업
cp -p /etc/passwd /etc/passwd.bak_$(date +%Y%m%d)
cp -p /etc/group /etc/group.bak_$(date +%Y%m%d)

# 2. 계정의 기본 GID를 정상 그룹으로 재할당
usermod -g [유효한그룹명또는GID] [해당계정]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 GID를 변경하기 전에 해당 계정이 소유하고 있는 파일과 디렉터리의 그룹 소유권도 함께 검토해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.5. [U-10] 동일한 UID 금지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 점검 목적 및 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 시스템에서 실제 권한 판단은 계정명보다 UID를 기준으로 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 서로 다른 계정이 동일한 UID를 사용하는 경우 파일 소유권이 동일한 사용자로 인식될 수 있으며, 감사 로그에서도 실제 계정을 명확하게 구분하기 어려워질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-10 스크립트는 /etc/passwd의 UID를 추출하여 중복되는 값을 탐지한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 자동 진단 스크립트 분석&lt;/h3&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# U-10 점검 시작 코드 정의
CODE &quot;[ U-10 ] 동일한 UID 금지&quot;

# /etc/passwd의 3번째 필드(UID)만 추출하여 정렬 후 중복 값 탐지
DUP_UID=$(awk -F: '{print $3}' /etc/passwd | sort | uniq -d | xargs)

# 중복 UID 존재 여부에 따른 결과 판정
if [ -z &quot;$DUP_UID&quot; ]; then
    OK &quot;중복된 UID를 사용하는 계정이 없습니다.&quot; &quot;모든 사용자가 고유한 UID를 할당받음.&quot;
else
    WARN &quot;중복된 UID가 존재하여 권한 충돌 위험이 있습니다.&quot; &quot;중복 발견된 UID: [ $DUP_UID ]&quot;
fi

# U-10 점검 종료 처리
FINISH &quot;[ U-10 ] 점검완료&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;U-10은 /etc/passwd의 세 번째 필드인 UID만 추출한다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;awk -F: '{print $3}' /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 sort와 uniq -d를 이용하여 중복된 UID를 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 계정이 존재한다고 가정한다.&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;user01:x:1500:1500:/home/user01:/bin/bash
user02:x:1500:1501:/home/user02:/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 계정 모두 UID 1500을 사용하므로 1500이 중복 UID로 탐지된다.&lt;/p&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;중복 UID 없음 &amp;rarr; [양호]&lt;/li&gt;
&lt;li&gt;중복 UID 존재 &amp;rarr; [취약]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 수동 진단 및 설정 검증 절차&lt;/h3&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;# 중복된 UID 번호 추출
awk -F: '{print $3}' /etc/passwd | sort | uniq -d | while read -r uid; do
    grep -E &quot;^[^:]*:[^:]*:$uid:&quot; /etc/passwd
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복 UID가 발견되면 해당 UID를 사용하는 계정을 모두 확인하고, 업무상 동일 UID가 필요한 구성인지 여부를 먼저 확인해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⑤ 안전한 조치 및 원복 절차&lt;/h3&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;# 1. 파일 백업
cp -p /etc/passwd /etc/passwd.bak_$(date +%Y%m%d)

# 2. 중복 계정의 UID를 미사용 번호(예: 1500)로 수정
usermod -u 1500 [수정대상계정]

# 3. 기존 소유 파일들의 소유권 동기화
find / -user [기존UID] -exec chown -h [수정대상계정] {} + 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UID 변경은 기존 파일의 소유권과 직접 연결되므로 계정의 홈 디렉터리뿐 아니라 해당 UID가 소유하고 있는 파일의 위치를 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. 스크립트 한계점 및 예외 처리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 U-06~U-10 자동화 스크립트는 주로 다음과 같은 로컬 설정 파일을 기준으로 정적 검사를 수행한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/etc/pam.d/su&lt;/li&gt;
&lt;li&gt;/etc/passwd&lt;/li&gt;
&lt;li&gt;/etc/group&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 실제 운영환경에서는 다음과 같은 예외가 발생할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. PAM 설정 구조 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-06은 /etc/pam.d/su에 직접 존재하는 pam_wheel.so 설정을 검사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포판 또는 시스템 구성에 따라 PAM 설정이 다른 파일이나 Include 구조로 구성되어 있다면 현재 스크립트가 실제 적용 정책을 완전히 반영하지 못할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 자동 진단 결과가 [양호]이더라도 실제 PAM 적용 구조를 함께 확인하는 것이 필요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 시스템 계정 목록의 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-07은 모든 시스템 계정을 자동으로 식별하는 방식이 아니라 스크립트에 지정된 계정 목록을 대상으로 검사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 운영환경에서 별도의 애플리케이션 계정이나 배포판별 시스템 계정이 추가되어 있는 경우 해당 계정은 현재 스크립트 검사 대상에서 제외될 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 관리자 그룹의 업무상 필요성은 자동 판단할 수 없음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-08은 자동으로 양호/취약을 결정하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 그룹에 계정이 있다는 사실만으로 취약하다고 판단할 수 없으며, 해당 계정이 실제 관리자 업무를 수행하기 위해 필요한 계정인지 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 U-08은 자동 수집과 수동 검토를 결합하는 방식으로 운영하는 것이 현재 스크립트의 목적에 맞다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.4. 중앙 인증 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDAP, SSSD, Winbind 등 중앙 인증 시스템을 사용하는 환경에서는 로컬 /etc/passwd, /etc/group만으로 모든 계정과 그룹 정보를 확인하기 어려울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 환경에서는 getent을 활용하여 시스템에서 실제 조회되는 계정 및 그룹 정보를 확인하는 방법을 추가로 검토할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 계정 정보 조회
getent passwd

# 그룹 정보 조회
getent group

# 관리자 그룹 구성원 확인
getent group wheel
getent group root
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.5. UID/GID 변경 시 파일 소유권 영향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-09와 U-10은 단순히 /etc/passwd 또는 /etc/group의 값을 변경하는 것으로 끝나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GID 또는 UID를 변경하면 기존 파일의 소유권과 실제 계정의 식별자가 달라질 수 있으므로 변경 전에 대상 계정이 소유한 파일과 디렉터리를 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 운영 서버의 시스템 계정이나 애플리케이션 계정은 서비스 실행에 사용될 수 있으므로 변경 전에 서비스 영향도를 검토해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. U-06~U-10 자동화 스크립트 판정 기준 정리&lt;/h1&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;점검코드&lt;/td&gt;
&lt;td style=&quot;width: 25.814%;&quot;&gt;스크립트가 확인하는 핵심 값&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;[양호] 조건&lt;/td&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;[취약] 조건&lt;/td&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;[정보] 조건&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;U-06&lt;/td&gt;
&lt;td style=&quot;width: 25.814%;&quot;&gt;/etc/pam.d/su의 pam_wheel.so&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;pam_wheel.so 활성화&lt;/td&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;설정 없음 또는 주석 처리&lt;/td&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;/etc/pam.d/su 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;U-07&lt;/td&gt;
&lt;td style=&quot;width: 25.814%;&quot;&gt;지정된 시스템 계정의 로그인 쉘&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;로그인 가능한 쉘 없음&lt;/td&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;로그인 가능한 쉘 발견&lt;/td&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;해당 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;U-08&lt;/td&gt;
&lt;td style=&quot;width: 25.814%;&quot;&gt;root, wheel 그룹 구성원&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;자동 판정하지 않음&lt;/td&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;자동 판정하지 않음&lt;/td&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;관리자 그룹 목록 출력 후 수동 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;U-09&lt;/td&gt;
&lt;td style=&quot;width: 25.814%;&quot;&gt;/etc/passwd GID &amp;harr; /etc/group GID&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;모든 GID가 그룹에 존재&lt;/td&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;존재하지 않는 GID 발견&lt;/td&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;해당 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;U-10&lt;/td&gt;
&lt;td style=&quot;width: 25.814%;&quot;&gt;/etc/passwd UID 중복&lt;/td&gt;
&lt;td style=&quot;width: 18.7209%;&quot;&gt;중복 UID 없음&lt;/td&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;중복 UID 발견&lt;/td&gt;
&lt;td style=&quot;width: 26.1628%;&quot;&gt;해당 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 표는 실제 스크립트를 사용하면서 결과를 빠르게 해석하기 위한 요약표로 활용할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 자동화 스크립트를 활용한 점검 순서&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-06~U-10을 실제 서버에서 점검할 때는 다음 순서로 확인하는 것을 권장한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 1. 자동 진단 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 스크립트를 실행하여 각 항목의 [양호], [취약], [정보] 결과를 먼저 수집한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 2. [취약] 항목 원인 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 취약 결과만 확인하지 않고 스크립트가 출력한 계정명, UID, GID, 설정 파일 및 그룹 구성원을 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 3. [정보] 항목 수동 점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 U-06의 PAM 파일 미존재, U-08의 관리자 그룹 구성원 등 자동화 스크립트가 최종 판단하지 않는 항목을 별도로 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 4. 설정 파일 백업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 전에 /etc/passwd, /etc/group, /etc/pam.d/su 등 대상 파일을 백업한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 5. 조치 후 재진단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 변경한 후 동일한 자동화 스크립트를 다시 실행하여 조치 결과를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Step 6. 서비스 영향 여부 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UID/GID 변경 또는 PAM 설정 변경과 같이 시스템 동작에 직접 영향을 줄 수 있는 작업은 관련 서비스와 로그인 기능을 별도로 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;주의사항&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본 포스팅의 스크립트 및 조치 방법은 Linux 시스템의 계정 및 권한 관리 보안점검과 보안 강화를 목적으로 작성되었다. Linux 배포판, 버전, 설치된 서비스 및 인증 구성에 따라 설정 파일과 적용 방식이 다를 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;특히 PAM 설정, 관리자 그룹, 사용자 계정의 로그인 쉘 및 UID/GID를 변경하면 정상적인 로그인이나 서비스 실행, 파일 접근 권한에 영향을 줄 수 있으므로 &lt;b&gt;운영 서버에 적용하기 전에 반드시 테스트 환경에서 검증한 후 적용해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;계정 또는 그룹 정보를 변경하기 전에는 관련 설정 파일을 백업하고, 해당 계정이 시스템 서비스나 애플리케이션에서 사용되고 있는지 확인해야 한다. 변경 후에는 자동 진단 스크립트를 다시 실행하여 조치 결과와 서비스 정상 동작 여부를 함께 확인하는 것이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함께 보면 좋은 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linux 보안취약점 점검 자동화 스크립트 공통 함수 및 환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 보안취약점 점검 스크립트에서 공통으로 사용하는 함수와 환경 설정에 대한 내용은 별도의 글에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot;&gt;자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#U06 #U07 #U08 #U09 #U10 #계정관리보안 #권한통제 #리눅스보안점검 #주요정보통신기반시설 #기술적취약점평가 #서버보안가이드 #시스템계정보안 #고아그룹점검 #중복식별자제거</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/97</guid>
      <comments>https://ismsp-case.tistory.com/97#entry97comment</comments>
      <pubDate>Fri, 4 Sep 2026 15:30:16 +0900</pubDate>
    </item>
    <item>
      <title>Linux 서버 계정 관리 보안점검 U-01~U-05 | Bash 자동화 스크립트 포함</title>
      <link>https://ismsp-case.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 서버 보안점검에서 계정 관리는 가장 기본적이면서도 중요한 영역이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root 원격 접속 제한, 비밀번호 정책, 로그인 실패 시 계정 잠금, /etc/passwd와 /etc/shadow 보호, UID 0 계정 관리가 제대로 적용되어 있지 않으면 관리자 권한 탈취나 계정 공격으로 이어질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 Linux 서버의 계정 관리 관련 보안점검 항목 &lt;b&gt;U-01 ~ U-05&lt;/b&gt;를 대상으로 실제 서버에서 바로 실행할 수 있는 &lt;b&gt;Bash 자동화 점검 스크립트&lt;/b&gt;를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 스크립트는 단순히 설정 파일의 존재 여부만 확인하는 것이 아니라 주요 설정값을 읽어 기준과 비교하고, 점검 결과를 [양호], [취약], [정보] 형태로 확인할 수 있도록 구성했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 글의 핵심은 자동화 스크립트다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 스크립트는 필요한 경우 그대로 복사하여 테스트 환경에서 실행할 수 있다.&lt;br /&gt;각 스크립트에는 동작을 이해할 수 있도록 주요 라인에 주석을 작성했으며, 스크립트 아래에는 전체적인 동작 과정도 별도로 설명한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. U-01 ~ U-05 점검 항목&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;점검코드&lt;/td&gt;
&lt;td&gt;점검 항목&lt;/td&gt;
&lt;td&gt;주요 점검 대상&lt;/td&gt;
&lt;td&gt;주요 확인 내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-01&lt;/td&gt;
&lt;td&gt;root 계정 원격 접속 제한&lt;/td&gt;
&lt;td&gt;/etc/ssh/sshd_config, /etc/securetty&lt;/td&gt;
&lt;td&gt;SSH/Telnet을 통한 root 직접 접속 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-02&lt;/td&gt;
&lt;td&gt;비밀번호 관리정책 설정&lt;/td&gt;
&lt;td&gt;/etc/login.defs, /etc/security/pwquality.conf&lt;/td&gt;
&lt;td&gt;비밀번호 기간, 최소 길이, 복잡도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-03&lt;/td&gt;
&lt;td&gt;계정 잠금 임계값 설정&lt;/td&gt;
&lt;td&gt;/etc/pam.d/system-auth, /etc/pam.d/common-auth&lt;/td&gt;
&lt;td&gt;로그인 실패 횟수에 따른 계정 잠금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-04&lt;/td&gt;
&lt;td&gt;비밀번호 파일 보호&lt;/td&gt;
&lt;td&gt;/etc/passwd, /etc/shadow&lt;/td&gt;
&lt;td&gt;비밀번호 정보의 shadow 분리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U-05&lt;/td&gt;
&lt;td&gt;root 이외의 UID 0 금지&lt;/td&gt;
&lt;td&gt;/etc/passwd&lt;/td&gt;
&lt;td&gt;UID 0 계정 존재 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. U-01 root 계정 원격 접속 제한&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1 점검 목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root 계정은 Linux 시스템에서 최고 권한을 가지므로 원격에서 root 계정으로 직접 로그인할 수 있도록 허용하면 비밀번호 공격의 직접적인 대상이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 일반적으로 원격에서는 일반 계정으로 접속한 후 필요한 경우 sudo 등의 방법으로 관리자 권한을 획득하도록 구성하는 것이 목적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-01 스크립트에서는 크게 다음 세 가지를 확인한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Telnet 서비스가 실행되고 있는지&lt;/li&gt;
&lt;li&gt;/etc/securetty에서 Telnet을 통한 root 접근이 허용되는지&lt;/li&gt;
&lt;li&gt;SSH의 PermitRootLogin 설정이 어떻게 되어 있는지&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.2 자동화 점검 스크립트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 스크립트는 U-01 점검에 사용하는 전체 코드다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# U-01 점검 대상 식별 및 변수 초기화
CODE &quot;[ U-01 ] root 계정 원격 접속 제한&quot;

TELNET_SAFE=&quot;FALSE&quot;; SSH_SAFE=&quot;FALSE&quot;; REASON_TELNET=&quot;&quot;; REASON_SSH=&quot;&quot;

# systemctl 명령어를 통해 Telnet 서비스 활성화 여부 확인
if command -v systemctl &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    if systemctl is-active --quiet telnet.socket 2&amp;gt;/dev/null || systemctl is-active --quiet telnet 2&amp;gt;/dev/null; then
        IS_TELNET_RUNNING=&quot;TRUE&quot;
    fi
fi

# Telnet 데몬 구동 여부에 따른 /etc/securetty pts 가상 터미널 허용 여부 판정
if [[ &quot;$IS_TELNET_RUNNING&quot; == &quot;TRUE&quot; ]]; then
    # securetty 파일 내 가상 터미널(pts/n) 설정이 활성화되어 있는지 점검
    if [ -f /etc/securetty ] &amp;amp;&amp;amp; grep -E -q &quot;^[[:space:]]*pts/[0-9]+&quot; /etc/securetty; then
        REASON_TELNET=&quot;Telnet 서비스가 동작 중이며, /etc/securetty에 pts(가상 터미널) 접근이 허용되어 있음.&quot;
    else
        TELNET_SAFE=&quot;TRUE&quot;
        REASON_TELNET=&quot;Telnet 서비스가 동작 중이나, /etc/securetty에서 pts 접근을 차단함.&quot;
    fi
else
    TELNET_SAFE=&quot;TRUE&quot;
    REASON_TELNET=&quot;Telnet 서비스가 비활성화되어 있거나 설치되지 않음.&quot;
fi

# SSH 설정 파일 내 PermitRootLogin 파라미터 점검
if [ -f /etc/ssh/sshd_config ]; then
    # 주석 처리되지 않은 최종 PermitRootLogin 값 추출
    STATUSSSH=$(grep -i -E &quot;^[[:space:]]*PermitRootLogin&quot; /etc/ssh/sshd_config | tail -n 1 | awk '{print $2}')
    if [[ -z &quot;$STATUSSSH&quot; ]]; then
        REASON_SSH=&quot;PermitRootLogin 설정이 없거나 주석 처리됨 (기본값 허용 위험).&quot;
    elif [[ &quot;$STATUSSSH&quot; == &quot;yes&quot; ]]; then
        REASON_SSH=&quot;PermitRootLogin 값이 'yes'로 설정되어 직접 접속이 허용됨.&quot;
    elif [[ &quot;$STATUSSSH&quot; == &quot;no&quot; || &quot;$STATUSSSH&quot; == &quot;prohibit-password&quot; || &quot;$STATUSSSH&quot; == &quot;without-password&quot; ]]; then
        SSH_SAFE=&quot;TRUE&quot;
        REASON_SSH=&quot;PermitRootLogin 값이 '$STATUSSSH'로 설정되어 직접 접속 차단됨.&quot;
    else
        REASON_SSH=&quot;PermitRootLogin 값이 '$STATUSSSH'로 알 수 없는 설정값임.&quot;
    fi
else
    REASON_SSH=&quot;/etc/ssh/sshd_config 파일을 찾을 수 없음.&quot;
fi

# Telnet과 SSH의 보안 안전성 결합 판정
if [[ &quot;$TELNET_SAFE&quot; == &quot;TRUE&quot; &amp;amp;&amp;amp; &quot;$SSH_SAFE&quot; == &quot;TRUE&quot; ]]; then
    OK &quot;원격 서비스(Telnet, SSH)를 통한 root 직접 접속이 차단되어 있습니다.&quot; &quot;- Telnet: $REASON_TELNET\n  =&amp;gt; 판단 사유: - SSH: $REASON_SSH&quot;
else
    WARN &quot;root 계정 원격 접속이 허용될 수 있는 설정이 존재합니다.&quot; &quot;- Telnet: $REASON_TELNET\n  =&amp;gt; 판단 사유: - SSH: $REASON_SSH&quot;
fi
FINISH &quot;[ U-01 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.3 스크립트는 어떻게 동작하는가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① Telnet 서비스 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemctl is-active를 사용하여 telnet.socket 또는 telnet 서비스가 실행 중인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Telnet 서비스가 실행되지 않는 경우 Telnet을 통한 root 원격 접속 위험은 없는 것으로 판단한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② /etc/securetty 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Telnet이 실행 중인 경우 /etc/securetty 파일에서 pts/0, pts/1과 같은 가상 터미널 설정을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pts 접근이 허용되어 있으면 root의 Telnet 접속이 가능할 수 있으므로 주의가 필요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ SSH PermitRootLogin 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령으로 설정값을 추출한다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;grep -i -E &quot;^[[:space:]]*PermitRootLogin&quot; /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 마지막 설정값을 가져와 yes, no 등의 값에 따라 판단한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;④ 최종 결과 결정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Telnet과 SSH가 모두 안전한 상태일 경우 [양호]로 판단하고, 둘 중 하나라도 위험한 설정이 발견되면 [취약] 결과를 출력한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.4 취약 시 조치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 파일 백업&lt;/h3&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%Y%m%d)
[ -f /etc/securetty ] &amp;amp;&amp;amp; cp -p /etc/securetty /etc/securetty.bak_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SSH root 직접 접속 제한&lt;/h3&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;sed -i -E 's/^[#[:space:]]*PermitRootLogin[[:space:]]+.*/PermitRootLogin no/' /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Telnet pts 접근 제한&lt;/h3&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;[ -f /etc/securetty ] &amp;amp;&amp;amp; sed -i -E 's/^[[:space:]]*(pts\/[0-9]+)/#\1/' /etc/securetty
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 문법 확인 및 서비스 reload&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 변경한 경우 바로 서비스를 재시작하기보다는 먼저 문법을 확인하는 것이 안전하다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;sshd -t
systemctl reload sshd || systemctl reload ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. U-02 비밀번호 관리정책 설정&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.1 점검 목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호를 장기간 변경하지 않거나 지나치게 단순하게 설정할 경우 계정 공격에 취약해질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-02에서는 다음 정책을 확인한다.&lt;/p&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;비밀번호 최소 사용 기간&lt;/li&gt;
&lt;li&gt;최소 비밀번호 길이&lt;/li&gt;
&lt;li&gt;비밀번호 복잡도 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 스크립트에서는 다음 기준을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;스크립트 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 사용 기간&lt;/td&gt;
&lt;td&gt;90일 이하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최소 사용 기간&lt;/td&gt;
&lt;td&gt;1일 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최소 길이&lt;/td&gt;
&lt;td&gt;8자리 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복잡도&lt;/td&gt;
&lt;td&gt;pwquality.conf 설정 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.2 자동화 점검 스크립트&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# U-02 점검 대상 식별 및 정책 변수 초기화
CODE &quot;[ U-02 ] 비밀번호 관리정책 설정 (2026년 통합 항목)&quot;

MAX_DAYS_SAFE=&quot;FALSE&quot;; MIN_DAYS_SAFE=&quot;FALSE&quot;; MIN_LEN_SAFE=&quot;FALSE&quot;; COMPLEXITY_SAFE=&quot;FALSE&quot;
REASON_POLICY=&quot;&quot;

# /etc/login.defs 파일 내 기본 패스워드 정책 파라미터 확인
if [ -f /etc/login.defs ]; then
    VAL_MAX=$(grep -i -E &quot;^[[:space:]]*PASS_MAX_DAYS&quot; /etc/login.defs | awk '{print $2}')
    VAL_MIN=$(grep -i -E &quot;^[[:space:]]*PASS_MIN_DAYS&quot; /etc/login.defs | awk '{print $2}')
    VAL_LEN=$(grep -i -E &quot;^[[:space:]]*PASS_MIN_LEN&quot; /etc/login.defs | awk '{print $2}')

    # 가이드라인 기준 비교 (최대 90일 이하, 최소 1일 이상, 길이 8자 이상)
    [[ -n &quot;$VAL_MAX&quot; &amp;amp;&amp;amp; &quot;$VAL_MAX&quot; -le 90 ]] &amp;amp;&amp;amp; MAX_DAYS_SAFE=&quot;TRUE&quot;
    [[ -n &quot;$VAL_MIN&quot; &amp;amp;&amp;amp; &quot;$VAL_MIN&quot; -ge 1 ]] &amp;amp;&amp;amp; MIN_DAYS_SAFE=&quot;TRUE&quot;
    [[ -n &quot;$VAL_LEN&quot; &amp;amp;&amp;amp; &quot;$VAL_LEN&quot; -ge 8 ]] &amp;amp;&amp;amp; MIN_LEN_SAFE=&quot;TRUE&quot;
    
    REASON_POLICY=&quot;최대기간=${VAL_MAX:-없음}일(90이하 양호), 최소기간=${VAL_MIN:-없음}일(1이상 양호), 최소길이=${VAL_LEN:-없음}자리(8이상 양호)&quot;
fi

# /etc/security/pwquality.conf 복잡도 모듈 설정 점검
PWQUAL_CONF=&quot;/etc/security/pwquality.conf&quot;
if [ -f &quot;$PWQUAL_CONF&quot; ]; then
    # 문자 종류 수(minclass) 또는 각 문자군 가중치(credit) 파라미터 점검
    if grep -E -q &quot;^[[:space:]]*minclass[[:space:]]*=[[:space:]]*[3-4]&quot; &quot;$PWQUAL_CONF&quot; || grep -E -q &quot;^[[:space:]]*[a-z]*credit&quot; &quot;$PWQUAL_CONF&quot;; then
        COMPLEXITY_SAFE=&quot;TRUE&quot;
        REASON_POLICY=&quot;$REASON_POLICY, 복잡도=pwquality.conf에 설정됨&quot;
    fi
fi

if [[ &quot;$COMPLEXITY_SAFE&quot; == &quot;FALSE&quot; ]]; then
    REASON_POLICY=&quot;$REASON_POLICY, 복잡도=설정확인불가(취약)&quot;
fi

# 모든 기준 충족 여부 최종 판정
if [[ &quot;$MAX_DAYS_SAFE&quot; == &quot;TRUE&quot; &amp;amp;&amp;amp; &quot;$MIN_DAYS_SAFE&quot; == &quot;TRUE&quot; &amp;amp;&amp;amp; &quot;$MIN_LEN_SAFE&quot; == &quot;TRUE&quot; &amp;amp;&amp;amp; &quot;$COMPLEXITY_SAFE&quot; == &quot;TRUE&quot; ]]; then
    OK &quot;비밀번호 정책(기간, 길이, 복잡도)이 모두 기준에 맞게 설정되었습니다.&quot; &quot;$REASON_POLICY&quot;
else
    WARN &quot;비밀번호 정책 중 기준에 미달하는 항목이 존재합니다.&quot; &quot;$REASON_POLICY&quot;
fi
FINISH &quot;[ U-02 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.3 스크립트는 어떻게 동작하는가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① /etc/login.defs 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 세 가지 값을 추출한다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;PASS_MAX_DAYS
PASS_MIN_DAYS
PASS_MIN_LEN
&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;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;PASS_MAX_DAYS &amp;lt;= 90
PASS_MIN_DAYS &amp;gt;= 1
PASS_MIN_LEN  &amp;gt;= 8
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건을 만족하면 각각의 안전 상태 변수를 TRUE로 변경한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② pwquality.conf 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호 복잡도는 /etc/security/pwquality.conf에서 minclass 또는 credit 관련 설정을 검색한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;③ 전체 정책 종합 판정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기간, 최소 길이, 복잡도 조건이 모두 만족되어야 최종 [양호]가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나라도 기준을 충족하지 못하면 [취약]으로 출력한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.4 취약 시 조치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 파일 백업&lt;/h3&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/login.defs /etc/login.defs.bak_$(date +%Y%m%d)
[ -f /etc/security/pwquality.conf ] &amp;amp;&amp;amp; cp -p /etc/security/pwquality.conf /etc/security/pwquality.conf.bak_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/etc/login.defs 설정&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_MIN_LEN    8
PASS_WARN_AGE   7
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/etc/security/pwquality.conf 설정&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;minlen = 8
minclass = 3
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
&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;/etc/login.defs는 신규 계정의 기본 정책에 영향을 줄 수 있으므로 기존 계정에 즉시 적용하려면 별도의 계정 정책 변경이 필요하다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;chage -M 90 -m 1 -W 7 [사용자계정명]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. U-03 계정 잠금 임계값 설정&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.1 점검 목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복적인 로그인 실패를 허용하면 비밀번호 무차별 대입 공격이 계속될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 일정 횟수 이상 인증에 실패하면 계정을 잠그는 정책을 적용하여 반복적인 인증 시도를 제한할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-03 스크립트에서는 PAM 설정 파일을 찾아 pam_tally2 또는 pam_faillock 모듈의 deny 값을 확인한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.2 자동화 점검 스크립트&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# U-03 점검 대상 식별 및 PAM 설정 파일 탐색
CODE &quot;[ U-03 ] 계정 잠금 임계값 설정&quot;

PAM_AUTH=&quot;&quot;
[ -f /etc/pam.d/system-auth ] &amp;amp;&amp;amp; PAM_AUTH=&quot;/etc/pam.d/system-auth&quot;
[ -f /etc/pam.d/common-auth ] &amp;amp;&amp;amp; PAM_AUTH=&quot;/etc/pam.d/common-auth&quot;

if [ -n &quot;$PAM_AUTH&quot; ]; then
    # pam_tally2 또는 pam_faillock 모듈의 deny 파라미터 값 추출
    DENY_VAL=$(grep -E &quot;^[[:space:]]*auth&quot; &quot;$PAM_AUTH&quot; | grep -E &quot;pam_tally2\.so|pam_faillock\.so&quot; | grep -o -E &quot;deny=[0-9]+&quot; | head -1 | cut -d= -f2)
    
    # 5회 이하 잠금 설정 여부 검증
    if [ -n &quot;$DENY_VAL&quot; ]; then
        if [ &quot;$DENY_VAL&quot; -le 5 ]; then
            OK &quot;계정 잠금 임계값이 안전하게 설정되어 있습니다.&quot; &quot;인증 파일($PAM_AUTH)에서 임계값(deny)이 ${DENY_VAL}회로 설정됨 (5회 이하 양호).&quot;
        else
            WARN &quot;계정 잠금 임계값이 가이드 기준을 초과했습니다.&quot; &quot;인증 파일($PAM_AUTH)에서 임계값(deny)이 ${DENY_VAL}회로 설정됨 (5회 이하 권장).&quot;
        fi
    else
        WARN &quot;계정 잠금 모듈은 존재하나 임계값(deny) 설정이 없습니다.&quot; &quot;$PAM_AUTH 파일 내 모듈에 'deny=값' 옵션 누락.&quot;
    fi
else
    INFO &quot;PAM 인증 파일을 찾을 수 없어 수동 점검이 필요합니다.&quot; &quot;OS 표준 인증 설정 파일 경로 확인 불가.&quot;
fi
FINISH &quot;[ U-03 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.3 스크립트는 어떻게 동작하는가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① PAM 인증 설정 파일 탐색&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 다음 파일의 존재 여부를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;/etc/pam.d/system-auth
/etc/pam.d/common-auth
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이 존재하면 해당 파일을 점검 대상으로 지정한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 인증 모듈 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 PAM 모듈을 검색한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;pam_tally2.so
pam_faillock.so
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 설정에서 다음과 같은 값을 찾는다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;deny=5
&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;deny 값이 5 이하라면 [양호], 5보다 크면 [취약]으로 판단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deny 설정을 찾지 못하면 계정 잠금 정책이 제대로 설정되어 있는지 확인할 수 없으므로 [취약]으로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAM 인증 파일 자체를 찾지 못하면 [정보]를 출력하여 별도 수동 점검이 필요함을 알린다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.4 취약 시 조치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 파일 백업&lt;/h3&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/pam.d/system-auth /etc/pam.d/system-auth.bak_$(date +%Y%m%d) 2&amp;gt;/dev/null
cp -p /etc/pam.d/password-auth /etc/pam.d/password-auth.bak_$(date +%Y%m%d) 2&amp;gt;/dev/null
cp -p /etc/pam.d/common-auth /etc/pam.d/common-auth.bak_$(date +%Y%m%d) 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RHEL 8/9 및 Rocky Linux&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pam_faillock을 사용하는 환경에서는 다음과 같이 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# /etc/security/faillock.conf

deny = 5
unlock_time = 1200
fail_interval = 900
even_deny_root
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RHEL 7 / CentOS 7&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;auth        required      pam_faillock.so preauth silent audit deny=5 unlock_time=1200
auth        [default=die] pam_faillock.so authfail audit deny=5 unlock_time=1200
account     required      pam_faillock.so
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Ubuntu / Debian&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;auth    required    pam_faillock.so preauth silent deny=5 unlock_time=1200
auth    [default=die] pam_faillock.so authfail deny=5 unlock_time=1200
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;계정 잠금 상태 확인 및 해제&lt;/h3&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;faillock --user [사용자계정]
faillock --user [사용자계정] --reset
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAM 설정은 잘못 수정하면 정상적인 계정도 로그인할 수 없게 될 수 있다. 특히 운영 서버에서는 현재 적용 중인 PAM 구성과 배포판별 설정 방식을 먼저 확인한 후 변경해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. U-04 비밀번호 파일 보호&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.1 점검 목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux에서는 사용자 계정 정보가 /etc/passwd에 저장되고, 비밀번호 해시 정보는 일반적으로 /etc/shadow에서 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-04에서는 /etc/shadow가 존재하는지 확인하고 /etc/passwd의 두 번째 필드가 적절하게 분리되어 있는지 확인한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.2 자동화 점검 스크립트&lt;/h2&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# U-04 점검 대상 식별 및 shadow 파일 존재 유무 검증
CODE &quot;[ U-04 ] 비밀번호 파일 보호&quot;

if [ -f /etc/shadow ]; then
    # /etc/passwd 파일의 두 번째 필드가 'x' 또는 '*'가 아닌 비인가 계정 식별
    WEAK_PASSWD=$(awk -F: '$2!=&quot;x&quot; &amp;amp;&amp;amp; $2!=&quot;*&quot; {print $1}' /etc/passwd | xargs)
    if [ -z &quot;$WEAK_PASSWD&quot; ]; then
        OK &quot;비밀번호가 shadow 파일로 안전하게 분리 및 암호화되어 있습니다.&quot; &quot;/etc/passwd의 두 번째 필드가 모두 'x' 또는 '*' 임.&quot;
    else
        WARN &quot;비밀번호가 평문으로 저장된 계정이 존재합니다.&quot; &quot;/etc/passwd에 암호화되지 않은 필드를 가진 계정 발견: [ $WEAK_PASSWD ]&quot;
    fi
else
    WARN &quot;/etc/shadow 파일이 존재하지 않습니다.&quot; &quot;시스템이 섀도우 패스워드를 사용하지 않아 비밀번호 해시 노출 위험.&quot;
fi
FINISH &quot;[ U-04 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.3 스크립트는 어떻게 동작하는가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① /etc/shadow 존재 여부 확인&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[ -f /etc/shadow ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해 shadow 파일의 존재 여부를 확인한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② /etc/passwd의 두 번째 필드 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd는 다음과 같은 구조로 구성된다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;계정명:비밀번호필드:UID:GID:설명:홈디렉터리:로그인쉘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트에서는 awk -F:를 이용하여 두 번째 필드를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;awk -F: '$2!=&quot;x&quot; &amp;amp;&amp;amp; $2!=&quot;*&quot; {print $1}' /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 필드가 x 또는 *가 아닌 계정을 추출하여 확인한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.4 취약 시 조치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 파일 백업&lt;/h3&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/passwd /etc/passwd.bak_$(date +%Y%m%d)
cp -p /etc/shadow /etc/shadow.bak_$(date +%Y%m%d)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Shadow 패스워드 시스템 변환&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;pwconv
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파일 권한 확인&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;chmod 644 /etc/passwd
chmod 000 /etc/shadow || chmod 400 /etc/shadow
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 권한 변경 역시 운영 환경의 배포판 및 기존 보안정책을 확인한 후 적용해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. U-05 root 이외의 UID가 0인 계정 금지&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.1 점검 목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux에서는 계정명보다 UID를 기준으로 권한을 판단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UID가 0인 계정은 root와 동일한 최고 권한을 가지므로 root 이외의 계정에 UID 0이 부여되어 있다면 관리자 권한을 가진 계정이 추가로 존재하는 상황이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 /etc/passwd에서 UID가 0이면서 계정명이 root가 아닌 계정을 찾아낸다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.2 자동화 점검 스크립트&lt;/h2&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# U-05 점검 대상 식별 및 root 이외의 UID 0 계정 탐색
CODE &quot;[ U-05 ] root 이외의 UID가 '0' 금지&quot;

# /etc/passwd 파일의 3번째 필드(UID)가 0이면서 계정명이 'root'가 아닌 항목 필터링
UID_0_ACCOUNTS=$(awk -F: '$3==0 &amp;amp;&amp;amp; $1!=&quot;root&quot; {print $1}' /etc/passwd | xargs)

if [ -z &quot;$UID_0_ACCOUNTS&quot; ]; then
    OK &quot;root 이외에 UID가 0인 계정이 없습니다.&quot; &quot;/etc/passwd에서 UID 0번은 root 계정뿐임.&quot;
else
    WARN &quot;root 이외에 UID가 0인(관리자 권한) 계정이 존재합니다.&quot; &quot;발견된 계정 목록: [ $UID_0_ACCOUNTS ]&quot;
fi
FINISH &quot;[ U-05 ] 점검완료&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.3 스크립트는 어떻게 동작하는가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 /etc/passwd의 세 번째 필드인 UID를 검색하는 것이다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;awk -F: '$3==0 &amp;amp;&amp;amp; $1!=&quot;root&quot; {print $1}' /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$3 == 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UID가 0이고,&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;$1 != &quot;root&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정명이 root가 아닌 경우를 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과가 없으면 root 외의 UID 0 계정이 없으므로 [양호]를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정이 발견되면 해당 계정명을 출력하면서 [취약]으로 판단한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6.4 취약 시 조치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/etc/passwd 백업&lt;/h3&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;cp -p /etc/passwd /etc/passwd.bak_$(date +%Y%m%d)
&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;업무상 필요하지 않은 계정이라면 삭제할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;userdel -r [취약계정명]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요한 계정이라면 UID 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무상 계정을 유지해야 한다면 일반 사용자 UID로 변경하는 방법을 검토할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;# 사용하지 않는 고유 UID 번호(예: 1005)로 재할당
usermod -u 1005 -g 1005 [취약계정명]

# 홈 디렉터리 소유권 재설정
chown -R [취약계정명]:[취약계정그룹] /home/[취약계정명]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UID 변경은 해당 계정이 소유한 파일과 프로세스, 서비스 설정 등에 영향을 줄 수 있으므로 운영 서버에서는 관련 파일의 소유권과 서비스 영향도를 함께 확인해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 스크립트 실행 후 결과 확인 방법&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-01~U-05 스크립트의 목적은 설정 파일을 하나씩 직접 열어서 확인하는 시간을 줄이는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 여러 서버를 점검할 경우 다음과 같은 흐름으로 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;Linux 서버 접속
      &amp;darr;
점검 스크립트 실행
      &amp;darr;
U-01 ~ U-05 결과 확인
      &amp;darr;
[양호] / [취약] / [정보] 구분
      &amp;darr;
취약 항목만 상세 설정 확인
      &amp;darr;
필요 시 조치
      &amp;darr;
조치 후 재점검
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 스크립트에서 [취약]이 나온다고 해서 바로 설정을 변경하기보다는 &lt;b&gt;왜 취약으로 판단되었는지 출력된 판단 사유를 먼저 확인하는 것&lt;/b&gt;이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 PAM, SSH, 비밀번호 정책처럼 잘못 변경하면 로그인 자체가 불가능해질 수 있는 설정은 반드시 변경 전 백업과 테스트가 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. 자동화 스크립트의 한계와 예외 처리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 점검은 반복적인 서버 점검 작업을 줄이는 데 효과적이지만, &lt;b&gt;설정 파일 하나를 검색하는 것만으로 실제 시스템에 적용되는 최종 정책을 100% 판단할 수 있는 것은 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 최근 Linux 배포판에서는 하나의 설정 파일에 모든 정책을 작성하지 않고 별도의 설정 파일이나 디렉터리를 사용하는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 구성이 사용될 수 있다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/etc/ssh/sshd_config.d/*.conf
/etc/security/faillock.conf
/etc/security/pwquality.conf.d/*.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 현재 스크립트는 빠른 1차 점검에 활용하고, 운영환경에서는 실제 적용되는 설정까지 확인하는 방식으로 보완하는 것이 필요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8.1 SSH 분할 설정 확인 예시&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;# [개선 스니펫] sshd 및 pam 분할 디렉터리 동시 점검 로직
STATUS_SSH=$(grep -i -h -E &quot;^[[:space:]]*PermitRootLogin&quot; /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2&amp;gt;/dev/null | grep -v &quot;^#&quot; | tail -1 | awk '{print $2}')
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8.2 PAM 계정 잠금 설정 확인 예시&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;PAM_DENY=$(grep -E -h &quot;^[[:space:]]*(auth|deny)&quot; /etc/pam.d/system-auth /etc/pam.d/common-auth /etc/security/faillock.conf 2&amp;gt;/dev/null | grep -o -E &quot;deny=[0-9]+|^[[:space:]]*deny[[:space:]]*=[[:space:]]*[0-9]+&quot; | head -1 | awk -F= '{print $2}' | tr -d ' ')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 방식으로 환경별 설정 파일을 추가로 검색하면 기존 스크립트의 탐지 범위를 넓힐 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 자동화 점검 스크립트를 사용할 때 주의할 점&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글의 스크립트는 &lt;b&gt;Linux 서버의 보안 설정을 빠르게 점검하기 위한 자동화 도구&lt;/b&gt;다.&lt;/p&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;여러 Linux 서버의 반복적인 보안점검&lt;/li&gt;
&lt;li&gt;취약점 점검 전 1차 자동 진단&lt;/li&gt;
&lt;li&gt;수동 점검 항목의 사전 확인&lt;/li&gt;
&lt;li&gt;서버 구축 후 기본 보안설정 확인&lt;/li&gt;
&lt;li&gt;보안점검 결과의 초기 수집&lt;/li&gt;
&lt;li&gt;Bash 기반 서버 보안점검 자동화 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 스크립트 결과만으로 모든 환경의 보안 상태를 최종 판단해서는 안 된다.&lt;/p&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;RHEL/Rocky/AlmaLinux/Ubuntu/Debian 등 배포판이 서로 다른 환경&lt;/li&gt;
&lt;li&gt;최신 배포판의 분할 설정 파일을 사용하는 환경&lt;/li&gt;
&lt;li&gt;PAM 설정을 별도로 변경한 환경&lt;/li&gt;
&lt;li&gt;중앙 인증서버 또는 LDAP/AD 등을 사용하는 환경&lt;/li&gt;
&lt;li&gt;운영 중인 서비스가 PAM/SSH 설정에 의존하는 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. 마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;U-01~U-05는 Linux 서버 계정 관리에서 반복적으로 확인해야 하는 대표적인 보안점검 항목이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 항목을 서버마다 직접 설정 파일을 열어 확인할 수도 있지만, Bash 스크립트를 활용하면 여러 서버의 기본적인 보안 설정을 빠르게 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서 제공한 스크립트는 다음 항목을 자동으로 확인한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;U-01  root 원격 접속 제한
U-02  비밀번호 관리정책
U-03  계정 잠금 임계값
U-04  비밀번호 파일 보호
U-05  UID 0 계정 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 자동화의 목적은 &lt;b&gt;수동점검을 완전히 대체하는 것보다 반복적인 확인 작업을 줄이고, 점검 대상 서버에서 이상 설정을 빠르게 찾아내는 것&lt;/b&gt;에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 운영환경에서는 스크립트 결과를 1차 진단 결과로 활용하고, [취약] 또는 [정보]로 표시된 항목에 대해 실제 적용 설정과 운영환경을 추가로 확인하는 방식이 적합하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅의 스크립트 및 조치 방법은 Linux 시스템의 보안점검과 보안 강화를 목적으로 작성되었다. Linux 배포판, 버전, 설치된 서비스 및 인증 구성에 따라 설정 파일과 적용 방식이 다를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 SSH, PAM, 비밀번호 정책과 관련된 설정을 변경하면 정상적인 로그인이나 서비스 동작에 영향을 줄 수 있으므로 &lt;b&gt;운영 서버에 적용하기 전에 반드시 테스트 환경에서 검증한 후 적용해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트 실행 및 설정 변경으로 인해 발생하는 시스템 장애에 대해서는 사용 환경에 맞는 사전 검증이 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함께 보면 좋은 글&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linux 보안취약점 점검 자동화 스크립트 공통 함수 및 환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux 보안취약점 점검 스크립트를 여러 항목에서 공통으로 사용하기 위한 함수와 환경 설정에 대한 내용은 별도의 글에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/6&quot;&gt;자동화 스크립트 공통 함수 및 환경 설정&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#U01 #U02 #U03 #U04 #U05 #리눅스보안 #계정관리보안 #취약점진단 #루트접속제한 #패스워드정책 #계정잠금 #보안가이드 #주요정보통신기반시설 #서버보안 #쉘스크립트</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/96</guid>
      <comments>https://ismsp-case.tistory.com/96#entry96comment</comments>
      <pubDate>Fri, 4 Sep 2026 14:50:26 +0900</pubDate>
    </item>
    <item>
      <title>[보안 분석] HTTP SEARCH 메소드 공격 기법과 보안 관제 대응 전략</title>
      <link>https://ismsp-case.tistory.com/91</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;최근 웹 애플리케이션 보안 환경에서는 GET이나 POST와 같은 표준 메소드 외에, 비표준 HTTP 메소드를 악용한 공격 시도가 지속적으로 포착되고 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;이번 리포트에서는 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;2&quot;&gt;HTTP SEARCH 메소드 공격&lt;/b&gt;의 구조와 &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;2&quot;&gt;RFC 5323&lt;/b&gt; 표준의 위험성, 그리고 보안관제 관점에서의 위협 우선순위와 보고서 분류 기준을 종합적으로 정리해 드립니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;1. HTTP SEARCH 메소드와 RFC 5323 표준의 이해&lt;/h2&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;SEARCH 메소드는 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;5&quot;&gt;RFC 5323&lt;/b&gt; 사양으로 정의된 WebDAV(Web-based Distributed Authoring and Versioning) 확장 규격입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;주요 역할:&lt;/b&gt; GET 요청의 URL 길이 및 표현력 한계를 극복하고, 요청 본문(Body)에 XML 또는 JSON 구조의 대용량 검색 조건을 실어 서버 측 자원을 조회합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;활용 분야:&lt;/b&gt; Microsoft Exchange, SharePoint, MS Outlook 등 문서 및 리소스 공유 환경에서 주로 작동합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;보안상 위협 요인:&lt;/b&gt; XML 파싱이 필수적이며 비표준 메소드라는 특성 때문에 웹 애플리케이션의 공격 표면(Attack Surface)을 크게 넓히는 원인이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZX8T/dJMcacExrIp/Ta711MuzUozT2DhNmhWtqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZX8T/dJMcacExrIp/Ta711MuzUozT2DhNmhWtqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZX8T/dJMcacExrIp/Ta711MuzUozT2DhNmhWtqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZX8T%2FdJMcacExrIp%2FTa711MuzUozT2DhNmhWtqk%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;768&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;2. SEARCH 메소드를 악용한 주요 공격 유형&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;공격자는 페이로드(Payload)의 유무와 목적에 따라 SEARCH 요청을 다각도로 악용합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;1) 페이로드가 없는 공격: HTTP Verb Tampering (접근 제어 우회)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;원리:&lt;/b&gt; WAF나 웹 서버 보안 설정(예: Apache &amp;lt;Limit&amp;gt;, Java web.xml)이 GET과 POST에만 접근 제어를 걸어두고 비표준 메소드를 누락한 허점을 노립니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;공격 방식:&lt;/b&gt; 공격자가 GET /admin 접근 시 차단되면 SEARCH /admin으로 변경해 전송합니다. 백엔드가 메소드 구분 없이 파라미터만 처리할 경우 인증 필터를 우회하여 관리자 자원에 접근하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;2&quot; data-index-in-node=&quot;0&quot;&gt;1-1) Verb Tampering (접근 제어 우회) 샘플&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;3&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;3,0,0&quot; data-index-in-node=&quot;0&quot;&gt;추천 위치:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2장 - 페이로드가 없는 공격: HTTP Verb Tampering 설명 바로 하단&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;3,1,0&quot; data-index-in-node=&quot;0&quot;&gt;샘플 코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre style=&quot;background-color: #f8f8f8; color: #383a42;&quot;&gt;&lt;code&gt;SEARCH /admin/manage_users.php HTTP/1.1
Host: target-website.com
User-Agent: Mozilla/5.0
Accept: */*
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;2)페이로드가 있는 공격: 요청 본문(Body) 악용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;SQL Injection (SUBSTRING 활용):&lt;/b&gt; 검색 파라미터 내부에 SUBSTRING 등의 내장 함수를 주입합니다. Blind SQL Injection 공격 시 SUBSTRING(문자열, 시작위치, 길이)을 이용해 관리자 암호 등의 데이터를 한 글자씩 조각내어 참/거짓을 비교하는 방식으로 내부 DB 정보를 탈취합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;XXE (XML External Entity):&lt;/b&gt; XML 본문에 악의적인 DTD를 삽입하여 서버 내부 파일(/etc/passwd 등)을 유출하거나 SSRF 공격을 수행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;XML DoS (Billion Laughs):&lt;/b&gt; 과도하게 중첩된 XML 엔티티 구조를 전달하여 파서의 CPU와 메모리 자원을 고갈시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;2-1) SEARCH + Blind SQL Injection (SUBSTRING ) 샘플&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;추천 위치:&lt;/b&gt; 2장 - 페이로드가 있는 공격: SQL Injection 설명 바로 하단&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;샘플 코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;SEARCH /dav/search HTTP/1.1
Host: target-website.com
Content-Type: text/xml; charset=&quot;utf-8&quot;
Content-Length: 310

&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;
&amp;lt;C:searchrequest xmlns:C=&quot;DAV:&quot;&amp;gt;
  &amp;lt;C:sql&amp;gt;
    SELECT * FROM docs WHERE title = 'test' 
    AND ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1)) = 97
  &amp;lt;/C:sql&amp;gt;
&amp;lt;/C:searchrequest&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;2-2) SEARCH + XXE (XML External Entity) 샘플&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;추천 위치:&lt;/b&gt; 2장 - 페이로드가 있는 공격: XXE 설명 바로 하단&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;샘플 코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;SEARCH /dav/files HTTP/1.1
Host: target-website.com
Content-Type: text/xml; charset=&quot;utf-8&quot;
Content-Length: 210

&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE search [
  &amp;lt;!ENTITY xxe SYSTEM &quot;file:///etc/passwd&quot;&amp;gt;
]&amp;gt;
&amp;lt;DAV:searchrequest xmlns:DAV=&quot;DAV:&quot;&amp;gt;
  &amp;lt;DAV:basicsearch&amp;gt;
    &amp;lt;DAV:select&amp;gt;&amp;lt;DAV:prop&amp;gt;&amp;amp;xxe;&amp;lt;/DAV:prop&amp;gt;&amp;lt;/DAV:select&amp;gt;
  &amp;lt;/DAV:basicsearch&amp;gt;
&amp;lt;/DAV:searchrequest&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;2-3) XML DoS (Billion Laughs Attack) 샘플&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;추천 위치:&lt;/b&gt; 2장 - 페이로드가 있는 공격: XML DoS 설명 바로 하단&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;샘플 코드:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;SEARCH /dav/files HTTP/1.1
Host: target-website.com
Content-Type: text/xml; charset=&quot;utf-8&quot;

&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;!DOCTYPE lolz [
  &amp;lt;!ENTITY lol &quot;lol&quot;&amp;gt;
  &amp;lt;!ELEMENT lolz (#PCDATA)&amp;gt;
  &amp;lt;!ENTITY lol1 &quot;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&quot;&amp;gt;
  &amp;lt;!ENTITY lol2 &quot;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&quot;&amp;gt;
  &amp;lt;!ENTITY lol3 &quot;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&quot;&amp;gt;
]&amp;gt;
&amp;lt;lolz&amp;gt;&amp;amp;lol3;&amp;lt;/lolz&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6925545514896875&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size26&quot;&gt;3. GET /.bashrc/ 스캔과 SEARCH 공격의 우선순위 비교&lt;/h2&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;보안 모니터링 현장에서 자주 포착되는 단순 정찰 요청과 SEARCH 공격의 위험도를 비교하면 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;18&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SEARCH 메소드 공격&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;GET /.bashrc/ 스캔 공격&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,0,0&quot;&gt;공격 성격&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,1,1,0&quot;&gt;Verb Tampering, SQLi, XXE 등 타깃 공격&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,1,2,0&quot;&gt;무차별 자동화 정찰 (환경변수/비밀번호 탐색)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,2,0,0&quot;&gt;특이 사항&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,2,1,0&quot;&gt;보안 장비 사각지대 노림&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,2,2,0&quot;&gt;경로 끝 슬래시(/)로 WAF 정규식 우회 시도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,3,0,0&quot;&gt;대응 우선순위&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,3,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,3,1,0&quot;&gt;1순위 (상위)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;18,3,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,3,2,0&quot;&gt;2순위 (하위)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;GET /.bashrc/ 요청은 인터넷 전체 대역을 대상으로 무작위 찌르기를 시도하는 단순 보안 소음(Background Noise)인 반면, SEARCH 요청은 보안 통제 우회나 복합 악성 페이로드가 실렸을 가능성이 높아 우선적인 정밀 분석이 필요합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;222.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brYG5j/dJMcad4k5uS/yRHs7Vdm3lA88D4QnwIEUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brYG5j/dJMcad4k5uS/yRHs7Vdm3lA88D4QnwIEUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brYG5j/dJMcad4k5uS/yRHs7Vdm3lA88D4QnwIEUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrYG5j%2FdJMcad4k5uS%2FyRHs7Vdm3lA88D4QnwIEUK%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;1376&quot; height=&quot;768&quot; data-filename=&quot;222.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size26&quot;&gt;4. 보안 보고서 작성을 위한 단일 카테고리 분류 기준&lt;/h2&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;단일 분류체계 보고서를 작성해야 하는 경우, '공격의 목적(최종 위협)'을 최우선 기준으로 지정하는 것이 보안관제 표준 규격입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,0,0&quot;&gt;웹 애플리케이션 취약점 공격:&lt;/b&gt; SEARCH 요청 본문에 SQLi, XXE 등의 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;24,0,0&quot;&gt;악성 페이로드가 존재&lt;/b&gt;하는 경우 (SEARCH는 전달 수단으로 보고 본문 내 페이로드를 기준으로 분류)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,1,0&quot;&gt;접근 제어 우회 시도:&lt;/b&gt; 페이로드 없이 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;24,1,0&quot;&gt;인증&amp;middot;인가 우회만을 목적&lt;/b&gt;으로 SEARCH 메소드를 사용한 경우&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,2,0&quot;&gt;정보 수집 및 정찰:&lt;/b&gt; GET /.bashrc/와 같이 페이로드 없이 &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;24,2,0&quot;&gt;민감 파일 존재 여부를 탐색&lt;/b&gt;하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;WebDAV 서비스가 불필요한 환경이라면 웹 서버(Nginx, Apache) 및 WAF 레벨에서 SEARCH 메소드를 전면 차단(405 Method Not Allowed)하고, XML 파서의 외부 엔티티 참조 기능을 비활성화하는 것이 가장 확실한 예방책입니다.&lt;/p&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#HTTPSEARCH공격 #HTTP메소드제한 #WebDAV보안 #RFC5323 #VerbTampering #SQL주입공격 #SQLInjection #BlindSQLi #SUBSTRING함수 #XXE공격 #XMLDoS #웹보안 #보안관제 #WAF차단 #침해사고분석 #정찰공격 #웹애플리케이션보안 #접근제어우회 #bashrc스캔 #보안보고서분류</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/91</guid>
      <comments>https://ismsp-case.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 4 Sep 2026 10:00:42 +0900</pubDate>
    </item>
    <item>
      <title>[HP 서버] HP ProLiant DL380 Smart Storage Administrator(SSA)를 이용한 RAID 구성 완벽 가이드</title>
      <link>https://ismsp-case.tistory.com/68</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;HP ProLiant DL380 서버에서 하드웨어 스토리지 컨트롤러인 Smart Storage Administrator(SSA)를 활용하여 RAID(Redundant Array of Independent Disks)를 구성하고 로지컬 드라이브(Logical Drive)를 생성하는 정석 절차를 정리해 드립니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;안정적인 운영체제(OS) 설치와 데이터 보호를 위한 첫 번째 필수 단계인 RAID 구성의 전체 과정을 명확하게 안내합니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;1. Smart Storage Administrator(SSA) 진입&lt;/h2&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;서버의 전원을 켜고 바이오스(BIOS) 및 포스트(POST) 초기화 화면에서 SSA 설정 도구로 진입해야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vvv.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xdpxf/dJMcabedott/iaafIUcPZZWYCyMtkI1gz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xdpxf/dJMcabedott/iaafIUcPZZWYCyMtkI1gz1/img.png&quot; data-alt=&quot;Gemini를 이용한 HP 서버랙 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xdpxf/dJMcabedott/iaafIUcPZZWYCyMtkI1gz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxdpxf%2FdJMcabedott%2FiaafIUcPZZWYCyMtkI1gz1%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;1376&quot; height=&quot;768&quot; data-filename=&quot;vvv.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini를 이용한 HP 서버랙 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서버 전원 버튼을 눌러 부팅을 시작합니다.&lt;/li&gt;
&lt;li&gt;HP 로고와 함께 시스템 포스트(POST) 화면이 표시되면 F10 키(Intelligent Provisioning)를 눌러 진입합니다. &lt;i data-index-in-node=&quot;76&quot; data-path-to-node=&quot;7,1,0&quot;&gt;(참고: 부팅 화면에서 F11 Boot Menu 진입 후 SSA를 선택하거나, 온보드 SSA 진입 키 안내에 따라 진행할 수도 있습니다.)&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Intelligent Provisioning 메인 화면이 출력되면 &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;7,2,0&quot;&gt;Smart Storage Administrator (SSA)&lt;/b&gt; 아이콘을 클릭하여 GUI 관리 도구를 실행합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;2. 어레이(Array) 생성 및 물리 디스크 선택&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;장착된 하드디스크(HDD) 또는 SSD를 하나의 물리적 어레이 그룹으로 묶는 작업입니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;11&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;11,0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bbbbbbbb.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6QNZs/dJMcaafsLYq/lZf8KVQ1sCDNFXKyIzihRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6QNZs/dJMcaafsLYq/lZf8KVQ1sCDNFXKyIzihRK/img.png&quot; data-alt=&quot;Gemini를 이용한 HP SSA 참고용 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6QNZs/dJMcaafsLYq/lZf8KVQ1sCDNFXKyIzihRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6QNZs%2FdJMcaafsLYq%2FlZf8KVQ1sCDNFXKyIzihRK%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;1376&quot; height=&quot;768&quot; data-filename=&quot;bbbbbbbb.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini를 이용한 HP SSA 참고용 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SSA 메인 화면 좌측 상단에서 &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;12,0,0&quot;&gt;Smart Array 컨트롤러&lt;/b&gt;(예: Smart Array P408i-a SR Gen10 등)를 선택합니다.&lt;/li&gt;
&lt;li&gt;좌측 메뉴에서 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;12,1,0&quot;&gt;Actions&lt;/b&gt; ➔ Configure를 클릭한 후, 화면 중앙의 &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;12,1,0&quot;&gt;Create Array&lt;/b&gt; 버튼을 누릅니다.&lt;/li&gt;
&lt;li&gt;RAID로 구성하고자 하는 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;12,2,0&quot;&gt;물리 디스크(Physical Drives) 목록을 체크 박스로 선택&lt;/b&gt;합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,1,0,0&quot;&gt;&amp;nbsp;예시: 4개의 디스크 전체를 하나의 어레이로 묶는 경우 4개 항목을 모두 선택합니다.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;디스크 선택 확인 후 하단의 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;12,3,0&quot;&gt;Create Array&lt;/b&gt; 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size26&quot;&gt;3. RAID 레벨 지정 및 로지컬 드라이브(Logical Drive) 생성&lt;/h2&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;어레이 생성이 완료되면, 해당 디스크 그룹에 적용할 RAID 정책과 볼륨 용량을 결정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fffffff.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TBsiq/dJMcabMg77k/3WF6bCkEylrJSNcI700lb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TBsiq/dJMcabMg77k/3WF6bCkEylrJSNcI700lb1/img.png&quot; data-alt=&quot;Gemini를 이용한 HP 서버랙 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TBsiq/dJMcabMg77k/3WF6bCkEylrJSNcI700lb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTBsiq%2FdJMcabMg77k%2F3WF6bCkEylrJSNcI700lb1%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;768&quot; data-filename=&quot;fffffff.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini를 이용한 HP 서버랙 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;RAID Level 선택:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,1,0,0&quot;&gt;&amp;nbsp;RAID 0:&lt;/b&gt; 성능 및 용량 극대화 (복구 불가, 단일 디스크용)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,1,1,0&quot;&gt;&amp;nbsp;RAID 1 / RAID 10:&lt;/b&gt; 데이터 미러링을 통한 높은 안정성 및 성능 (서버 운영 환경 권장)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,1,2,0&quot;&gt;&amp;nbsp;RAID 5 / RAID 6:&lt;/b&gt; 패리티 기반의 용량 효율성 및 복구력 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;Strip Size / Size 지정:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,1,0,0&quot;&gt;&amp;nbsp;Strip Size:&lt;/b&gt; 기본 추천값(Default, 예: 256 KiB 등)을 유지하는 것을 권장합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,1,1,0&quot;&gt;&amp;nbsp;Size:&lt;/b&gt; 전체 디스크 용량을 통째로 하나의 로지컬 드라이브로 사용할 경우 Maximum Size를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설정을 마친 후 하단의 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;17,2,0&quot;&gt;Create Logical Drive&lt;/b&gt; 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size26&quot;&gt;4. 설정 저장 및 완료&lt;/h2&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;생성된 로지컬 드라이브의 상태를 최종 검증하고 구성을 확정합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;21&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;화면에 표시된 Summary(요약 정보)를 통해 RAID 레벨, 총 용량, 구성 디스크 개수가 정확한지 최종 확인합니다.&lt;/li&gt;
&lt;li&gt;우측 하단의 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;21,1,0&quot;&gt;Finish&lt;/b&gt; 버튼을 눌러 어레이 조작을 완료합니다.&lt;/li&gt;
&lt;li&gt;우측 상단의 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;21,2,0&quot;&gt;X&lt;/b&gt; 버튼 또는 종료 메뉴를 눌러 SSA 프로그램을 빠져나옵니다.&lt;/li&gt;
&lt;li&gt;서버 재부팅(Reboot)을 진행합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size26&quot;&gt;  다음 단계 안내 (내부 링크 연결)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;HP Smart Storage Administrator(SSA)를 통한 RAID 구성 및 로지컬 드라이브 확보가 완료되었습니다. 이제 OS 설치 미디어(USB)를 통해 파티셔닝 작업 및 운영체제 설치를 진행할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,0,0&quot;&gt;&amp;nbsp;다음 연관 가이드:&lt;/b&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/67&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.08.25 - [보안실무 &amp;amp; 트러블슈팅] - [실무 가이드] 로키 리눅스 9.6 서버 재설치부터 수동 파티셔닝, 폐쇄망 IP 설정 및 SSH 포트 변경 완벽 정리&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#HPDL380 #HP서버 #RAID구성 #SmartStorageAdministrator #SSA #하드웨어RAID #로지컬드라이브 #서버스토리지 #리눅스서버구축 #서버엔지니어</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/68</guid>
      <comments>https://ismsp-case.tistory.com/68#entry68comment</comments>
      <pubDate>Wed, 26 Aug 2026 10:06:01 +0900</pubDate>
    </item>
    <item>
      <title>[Rockey 9.6] 로키 리눅스 9.6 서버 재설치부터 수동 파티셔닝, 폐쇄망 IP 설정 및 SSH 포트 변경 완벽 정리</title>
      <link>https://ismsp-case.tistory.com/67</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;HP 서버 환경(RAID 구성 완료 상태)에서 로키 리눅스 9.6(Rocky Linux 9.6)을 재설치하고, 폐쇄망 환경에 맞춰 고정 IP 및 SSH 포트를 변경한 전체 실무 구축 과정을 정리해 드립니다. OS 구동 중 루트 파티션 축소의 한계로 인해 진행된 재설치 단계부터 인스톨러 에러 해결, 보안 정책 적용까지의 핵심 절차를 명확히 안내합니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;1. OS 재설치 및 수동 파티셔닝 (Protected Device 에러 해결)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;운영 중인 상태에서는 마운트된 루트 파티션(/)의 용량을 줄일 수 없으므로, 설치 USB를 통한 재설치를 진행했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fffffffffffffffffffff.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cieAHC/dJMcacK9X8g/sR1jtAgIA0dFIufg9le13k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cieAHC/dJMcacK9X8g/sR1jtAgIA0dFIufg9le13k/img.png&quot; data-alt=&quot;Gemini로 생성된 KVM 스위치 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cieAHC/dJMcacK9X8g/sR1jtAgIA0dFIufg9le13k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcieAHC%2FdJMcacK9X8g%2FsR1jtAgIA0dFIufg9le13k%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;768&quot; data-filename=&quot;fffffffffffffffffffff.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini로 생성된 KVM 스위치 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;① 'Cannot modify protected device' 에러 조치&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;기존 파티션이 잠겨 삭제되지 않는 경우, 아래 절차로 디스크를 완전히 초기화해야 합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;설치 요약 화면에서 [설치 대상(Installation Destination)]으로 이동합니다.&lt;/li&gt;
&lt;li&gt;스토리지 구성을 Automatic(자동)으로 변경한 후 [완료]를 클릭합니다.&lt;/li&gt;
&lt;li&gt;용량 부족 팝업창이 뜨면 Reclaim Space(공간 회수)를 선택합니다.&lt;/li&gt;
&lt;li&gt;기존 파티션 리스트에서 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;8,3,0&quot;&gt;Delete All(모두 삭제)&lt;/b&gt; ➔ Reclaim Space를 적용하여 디스크 잠금을 해제합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;② 수동 파티셔닝 (LVM 구성)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;디스크 잠금 해제 후 스토리지 구성을 Custom(수동)으로 전환하여 아래 규격으로 파티션을 지정합니다. (별도의 /data 파티션 없이 루트 파티션에 잔여 용량을 올인하는 구성입니다.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&amp;nbsp; /boot/efi&lt;/b&gt;: 600 MiB (UEFI 부팅 필수 파티션)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;&amp;nbsp; /boot&lt;/b&gt;: 1 GiB (커널 업데이트 대비 용량 확보)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;&amp;nbsp; swap&lt;/b&gt;: 16 GiB (가상 메모리)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,3,0&quot;&gt;&amp;nbsp; / (루트 파티션)&lt;/b&gt;: 용량 칸을 빈칸으로 유지 (남은 전체 용량 약 1.9 TiB가 자동으로 할당됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;※ 설치 완료 후 df -h 명령어를 통해 물리 디스크(/dev/mapper/rl-root)에 1.9TB 용량이 정상 할당되었음을 검증했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;# 디스크 할당 상태 확인
$ df -h
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;③ 최소 설치(Minimal Install) 패키지 선택 및 설치 진행&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;수동 파티셔닝 설정이 완료되면, 실제로 OS 패키지를 디스크에 복사하고 기본 시스템 환경을 구성하는 단계를 진행합니다. 서버 리소스 최적화와 보안 강화를 위해 &lt;b data-index-in-node=&quot;89&quot; data-path-to-node=&quot;3&quot;&gt;'최소 설치(Minimal Install)'&lt;/b&gt; 모드로 진행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rrrr.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvgDRh/dJMcagfB28V/oIZgCjLsFedbmL8UQloej0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvgDRh/dJMcagfB28V/oIZgCjLsFedbmL8UQloej0/img.png&quot; data-alt=&quot;Gemini로 생성된 Rockey 9.6 설치 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvgDRh/dJMcagfB28V/oIZgCjLsFedbmL8UQloej0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvgDRh%2FdJMcagfB28V%2FoIZgCjLsFedbmL8UQloej0%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;1196&quot; height=&quot;896&quot; data-filename=&quot;rrrr.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini로 생성된 Rockey 9.6 설치 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;소프트웨어 선택 (Software Selection):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp; 설치 요약 화면에서 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;5,0,1,0,0&quot;&gt;[소프트웨어 선택]&lt;/b&gt; 메뉴로 진입합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp; 기본 환경(Base Environment) 옵션에서 Minimal Install (최소 설치)를 선택하고 완료를 누릅니다.&lt;/li&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,1,2,0&quot;&gt;&amp;nbsp; (이유: 불필요한 GUI 환경과 대몬 서비스를 배제하여 서버 시스템 자원 소모를 줄이고 보안 공격 표면을 최소화하기 위함입니다.)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;시간 및 날짜 설정 (Time &amp;amp; Date):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0,0&quot;&gt;&amp;nbsp; [시간 및 날짜]&lt;/b&gt; 메뉴에서 지역을 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;5,1,1,0,0&quot;&gt;아시아(Asia)&lt;/b&gt;, 도시를 서울(Seoul)로 지정하여 시스템 타임존을 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;Root 암호 및 사용자 계정 생성 (Root Password / User Creation):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,1,0,0&quot;&gt;&amp;nbsp; [Root 암호]&lt;/b&gt; 메뉴로 이동하여 최고 관리자 비밀번호를 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,1,1,0&quot;&gt;&amp;nbsp; (참고: 보안 정책에 따라 필요한 경우 'Root 계정 잠금 해제' 및 'SSH 비밀번호 로그인 허용' 여부를 체크합니다.)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0&quot;&gt;설치 시작 및 재부팅 (Begin Installation &amp;amp; Reboot):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp; 모든 필수 설정 항목의 경고 표시가 사라진 것을 확인한 후, 우측 하단의 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;5,3,1,0,0&quot;&gt;[설치 시작(Begin Installation)]&lt;/b&gt; 버튼을 클릭합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp; 패키지 설치 및 시스탬 초기화 작업이 완료되면, 장착된 &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;5,3,1,1,0&quot;&gt;설치 USB 미디어를 제거&lt;/b&gt;한 뒤 &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;5,3,1,1,0&quot;&gt;[시스템 재부팅(Reboot System)]&lt;/b&gt; 버튼을 눌러 첫 부팅을 진행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6925545514896875&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;2. 폐쇄망 환경 고정 IP 및 네트워크 설정&lt;/h2&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;인터넷 연결이 되지 않는 폐쇄망 환경이므로, 텍스트 기반 네트워크 관리 도구인 nmtui를 사용하여 고정 IP를 할당했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adfa.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWsVyA/dJMcafHR266/k431C2FkEHcsokdx6HfMQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWsVyA/dJMcafHR266/k431C2FkEHcsokdx6HfMQk/img.png&quot; data-alt=&quot;Gemini로 생성된 nmtui 참고용 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWsVyA/dJMcafHR266/k431C2FkEHcsokdx6HfMQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWsVyA%2FdJMcafHR266%2Fk431C2FkEHcsokdx6HfMQk%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;768&quot; data-filename=&quot;adfa.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini로 생성된 nmtui 참고용 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size23&quot;&gt;① IP 수동 설정 절차&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;터미널에서 nmtui 명령어를 실행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;Edit a connection&lt;/b&gt; ➔ 활성화된 네트워크 카드(예: ens3f0)를 선택합니다.&lt;/li&gt;
&lt;li&gt;IPv4 CONFIGURATION을 &amp;lt;Manual&amp;gt;로 변경합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,3,0&quot;&gt;IP 주소 및 서브넷 마스크:&lt;/b&gt; IP주소/25 형태로 입력합니다. (서브넷 마스크 255.255.255.128 기준)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,4,0&quot;&gt;Gateway:&lt;/b&gt; 지정된 게이트웨이 IP를 입력합니다.&lt;/li&gt;
&lt;li&gt;저장 후 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;19,5,0&quot;&gt;Activate a connection&lt;/b&gt; 메뉴에서 해당 인터페이스를 비활성화(Deactivate) 후 재활성화(Activate)합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;② 네트워크 설정 검증&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# IP 및 서브넷 마스크 확인
$ ip a

# 라우팅 테이블 및 게이트웨이 확인
$ ip route show
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size26&quot;&gt;3. SSH 포트 변경 및 SELinux 트러블슈팅&lt;/h2&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;기본 포트(22번)를 변경하고, 최소 설치(Minimal Install) 환경에서 발생하는 semanage 명령어 부재 문제를 해결했습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;① SSH 설정 파일 수정&lt;/h3&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;/etc/ssh/sshd_config 파일 내 Port 항목을 원하는 포트 번호(예: 2222)로 변경 및 저장합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ vi /etc/ssh/sshd_config
# Port 22 -&amp;gt; Port 2222 로 수정
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;28&quot; data-ke-size=&quot;size23&quot;&gt;② semanage 명령어 부재 해결 (폐쇄망 대응)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;최소 설치 환경에는 SELinux 포트 제어 도구인 semanage가 포함되어 있지 않으므로, 설치 USB를 로컬 리포지토리로 마운트하여 패키지를 설치하거나 SELinux를 비활성화해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;30&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30,0,0&quot;&gt;&amp;nbsp; 방법 A: 로컬 USB 리포지토리 활용 (패키지 설치)&lt;/b&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# USB 마운트 및 로컬 repo 등록 후 설치
$ mount /dev/cdrom /mnt/cdrom
$ dnf install -y policycoreutils-python-utils
$ semanage port -a -t ssh_port_t -p tcp 2222
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30,1,0&quot;&gt;&amp;nbsp; 방법 B: SELinux 비활성화 (실무 우회 적용)&lt;/b&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# SELinux 설정 파일 수정
$ vi /etc/selinux/config
# SELINUX=enforcing -&amp;gt; SELINUX=disabled 로 변경 후 reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size23&quot;&gt;③ 방화벽 허용 및 SSH 서비스 재시작&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# 방화벽 포트 추가 및 리로드
$ firewall-cmd --permanent --add-port=2222/tcp
$ firewall-cmd --reload

# SSH 데몬 재시작
$ systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-path-to-node=&quot;34&quot; data-ke-size=&quot;size26&quot;&gt;4. 서비스 가동 상태 최종 검증&lt;/h2&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;모든 설정을 마친 뒤, 외부 접속을 시도하기 전 서버 내부에서 3단계 검증을 완료했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;zzzzzz.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4P395/dJMcafueTPO/VY66qt4knDqLe7KLTULXkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4P395/dJMcafueTPO/VY66qt4knDqLe7KLTULXkk/img.png&quot; data-alt=&quot;Gemini로 생성된 명령어 실행 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4P395/dJMcafueTPO/VY66qt4knDqLe7KLTULXkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4P395%2FdJMcafueTPO%2FVY66qt4knDqLe7KLTULXkk%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;768&quot; data-filename=&quot;zzzzzz.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gemini로 생성된 명령어 실행 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;# 1. SSH 데몬 가동 상태 확인
$ systemctl status sshd

# 2. 변경된 포트의 LISTEN 상태 확인
$ ss -tlpn | grep :2222

# 3. 방화벽 개방 포트 리스트 확인
$ firewall-cmd --list-ports
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;모든 명령어의 출력 결과에서 서비스 정상 작동(active running), 포트 바인딩(LISTEN), 방화벽 허용 상태를 확인한 후 원격 접속 테스트를 성공적으로 완료했습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;10,0&quot;&gt;HP DL380 서버를 처음 구축하시나요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10,1&quot; data-ke-size=&quot;size16&quot;&gt;OS 설치 전 진행되는 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;10,1&quot;&gt;Smart Storage Administrator(SSA) 기반의 하드웨어 RAID 설정 과정&lt;/b&gt;은 아래 연결된 포스팅에서 상세히 확인하실 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;10,2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;10,2&quot;&gt;관련 가이드:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ismsp-case.tistory.com/68&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026.08.25 - [보안실무 &amp;amp; 트러블슈팅] - [HP 서버] HP ProLiant DL380 Smart Storage Administrator(SSA)를 이용한 RAID 구성 완벽 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#로키리눅스9 #RockyLinux #리눅스재설치 #수동파티셔닝 #폐쇄망서버 #고정IP설정 #nmtui #SSH포트변경 #SELinux #서버엔지니어</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/67</guid>
      <comments>https://ismsp-case.tistory.com/67#entry67comment</comments>
      <pubDate>Wed, 26 Aug 2026 10:00:25 +0900</pubDate>
    </item>
    <item>
      <title>[L4 스위치] 파이오링크(PiOLINK) PAS-K 계열 SLB 설정 가이드: CLI 템플릿 및 명령어</title>
      <link>https://ismsp-case.tistory.com/42</link>
      <description>&lt;h1 data-path-to-node=&quot;0&quot;&gt;[L4 스위치] 파이오링크(PiOLINK)&amp;nbsp;PAS-K&amp;nbsp;계열&amp;nbsp;SLB&amp;nbsp;설정&amp;nbsp;가이드: CLI 템플릿 및 명령어 주석 정리&lt;/h1&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오늘 안내해 드릴 내용은 기업 네트워크 환경에서 필수적인 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;2&quot;&gt;L4 스위치(파이오링크 PAS-K 계열)의 SLB(Server Load Balancing, 서버 부하분산) 설정법&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;네트워크 현장에 즉시 적용할 수 있도록 실제 IP/포트 대신 범용 가이드 템플릿을 적용하였으며, &lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;3&quot;&gt;각 명령어의 상세한 주석&lt;/b&gt;을 포함하였습니다. 차근차근 확인하시어 안정적인 시스템 환경 구축에 도움이 되기를 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sss.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfETOq/dJMcadiOFTr/UMdSxQFAYpskV1CMFvgOsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfETOq/dJMcadiOFTr/UMdSxQFAYpskV1CMFvgOsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfETOq/dJMcadiOFTr/UMdSxQFAYpskV1CMFvgOsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfETOq%2FdJMcadiOFTr%2FUMdSxQFAYpskV1CMFvgOsk%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;768&quot; data-filename=&quot;sss.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. L4 스위치 SLB 구축의 3단계 개요&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;L4 스위치에서 부하분산 서비스를 구성할 때는 다음 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;12&quot;&gt;3가지 핵심 구조&lt;/b&gt;를 순차적으로 설정해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;헬스체크(Health Check):&lt;/b&gt; 백엔드 서버의 서비스 상태(살아있는지 여부)를 감시하는 정책입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;리얼 서버(Real Server):&lt;/b&gt; 트래픽을 실제로 수신하여 처리하는 물리/가상 서버의 IP를 등록합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;SLB(Virtual Server &amp;amp; Policy):&lt;/b&gt; 대표 IP(VIP)를 지정하고, 로드밸런싱 알고리즘, 세션 고정(Sticky), 접근 제어(Filter) 및 리얼 서버를 결합합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 헬스체크(Health Check) 및 리얼 서버(Real Server) 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 먼저 서버의 상시 생존 여부를 감시할 프로토콜과 포트를 정의한 후, 실제 트래픽을 처리할 서버들을 시스템에 등록합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;헬스체크 및 리얼 서버 설정 CLI&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;config                                    # 설정(Configure) 모드 진입

# ========================================================
# 1. Health Check (헬스체크 설정)
# ========================================================
health-check [생성할 헬스체크 번호]          # 헬스체크 정책 식별 번호 생성 (예: 10)
  type [감시 프로토콜 타입]                  # 생존 여부를 감시할 프로토콜 (tcp, http, icmp 등)
  port [감시할 서비스 포트]                  # 헬스체크 대상 포트 번호 지정
  apply                                    # 헬스체크 설정 적용
exit                                       # 헬스체크 설정 메뉴 종료

# ========================================================
# 2. Real Server (리얼 서버 등록)
# ========================================================
real [1번 REAL 서버 식별 번호]              # 1번 리얼 서버 식별 ID 지정 (예: 101)
  rip [1번 REAL 서버 IP]                   # 실제 서비스가 동작 중인 1번 서버의 IP
  status enable                           # 1번 리얼 서버 상태 활성화
  apply                                   # 설정 적용
exit                                      # 리얼 서버 설정 메뉴 종료

real [2번 REAL 서버 식별 번호]              # 2번 리얼 서버 식별 ID 지정 (예: 102)
  rip [2번 REAL 서버 IP]                   # 실제 서비스가 동작 중인 2번 서버의 IP
  status enable                           # 2번 리얼 서버 상태 활성화
  apply                                   # 설정 적용
exit                                      # 리얼 서버 설정 메뉴 종료&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fffff.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTfUAd/dJMcaasP270/cQEVh3lmPUDKhu13bvepV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTfUAd/dJMcaasP270/cQEVh3lmPUDKhu13bvepV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTfUAd/dJMcaasP270/cQEVh3lmPUDKhu13bvepV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTfUAd%2FdJMcaasP270%2FcQEVh3lmPUDKhu13bvepV1%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;768&quot; data-filename=&quot;fffff.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6925545514896875&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. SLB 및 서비스 정책 구성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 대표 IP(VIP)를 생성하고 앞서 등록한 헬스체크 정책과 리얼 서버를 하나로 묶어주는 &lt;b data-index-in-node=&quot;52&quot; data-path-to-node=&quot;24&quot;&gt;SLB 가상 서버 설정&lt;/b&gt;을 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주요 핵심 정책 안내&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,0&quot;&gt;NAT 모드 (nat-mode lan-to-lan):&lt;/b&gt; 클라이언트와 서버가 동일 대역에 위치하거나 Source NAT 처리가 필요한 경우 사용되는 표준 전송 방식입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,1,0&quot;&gt;부하분산 방식 (lb-method):&lt;/b&gt; rr (Round Robin, 순차 분산) 또는 lc (Least Connection, 최소 연결 수 기반 분산) 방식을 주로 채택합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,2,0&quot;&gt;트래픽 필터 (filter):&lt;/b&gt; 허용할 트래픽 조건(SIP, DIP, DPort)을 명시하여 인가되지 않은 통신을 차단합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,3,0&quot;&gt;세션 유지 (sticky):&lt;/b&gt; 로그인 세션 유지 등이 필요한 웹 애플리케이션의 경우, 동일 클라이언트 IP의 요청을 일정 시간 동안 지정된 서버로 지속 연결합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wwww.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEgO9H/dJMcaalWOqD/CY1kpgkCPgy7M9neh4trd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEgO9H/dJMcaalWOqD/CY1kpgkCPgy7M9neh4trd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEgO9H/dJMcaalWOqD/CY1kpgkCPgy7M9neh4trd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEgO9H%2FdJMcaalWOqD%2FCY1kpgkCPgy7M9neh4trd0%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;768&quot; data-filename=&quot;wwww.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 전체 CLI 템플릿&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래는 파이오링크 L4 스위치 구축 시 즉시 활용할 수 있는 전체 스크립트 템플릿입니다. 대괄호 [...] 영역을 네트워크 환경에 맞는 값으로 치환하여 사용하십시오.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;config                               # 설정(Configure) 모드 진입

# ========================================================
# 1. Health Check (헬스체크 설정)
# ========================================================
health-check [생성할 헬스체크 번호]     # 헬스체크 정책 식별 번호 생성 (예: 10)
  type [감시 프로토콜 타입]             # 감시할 프로토콜 (tcp, http, icmp 등)
  port [감시할 서비스 포트]             # 헬스체크 대상 포트 번호 지정
  apply                              # 헬스체크 설정 적용
exit                                 # 헬스체크 설정 메뉴 종료

# ========================================================
# 2. Real Server (리얼 서버 등록)
# ========================================================
real [1번 REAL 서버 식별 번호]         # 1번 리얼 서버 식별 ID 지정 (예: 101)
  rip [1번 REAL 서버 IP]              # 실제 서비스가 동작 중인 1번 서버의 IP
  status enable                      # 1번 리얼 서버 상태 활성화
  apply                              # 설정 적용
exit                                 # 리얼 서버 설정 메뉴 종료

real [2번 REAL 서버 식별 번호]         # 2번 리얼 서버 식별 ID 지정 (예: 102)
  rip [2번 REAL 서버 IP]              # 실제 서비스가 동작 중인 2번 서버의 IP
  status enable                      # 2번 리얼 서버 상태 활성화
  apply                              # 설정 적용
exit                                 # 리얼 서버 설정 메뉴 종료

# ========================================================
# 3. SLB 및 서비스 정책 설정
# ========================================================
slb [생성할 SLB 서비스명]               # SLB 그룹 및 서비스 이름 생성 (예: WEB_SLB)
  status enable                       # SLB 서비스 활성화
  nat-mode lan-to-lan                 # Source NAT 방식을 LAN-to-LAN 모드로 설정
  lb-method [부하분산 방식]             # 트래픽 분산 알고리즘 지정 (rr: 순차, lc: 최소접속 등)

  health-check [연동할 헬스체크 번호]    # 1단계에서 만든 헬스체크 번호 바인딩

  vip [사용할 VIP 주소] protocol [프로토콜] vport [포트] 
  # 대표 가상 IP(VIP), 프로토콜, 접속 포트 설정
  lan-to-lan [NAT 통신용 LAN 대역 IP/마스크]      
  # LAN-to-LAN NAT 통신에 사용될 내부 네트워크 대역

  apply                               # 기본 SLB 정보 적용

  filter [필터 번호]         # 트래픽 제어/접근 제어(ACL) 필터 번호 지정 (예: 1)
    type include                      # 조건을 만족하는 트래픽 허용(Include) 정책
    protocol [프로토콜 타입]            # 필터링 대상 프로토콜 (예: tcp)
    sip [출발지 IP/서브넷마스크]         # 접속 허용할 출발지 Client IP 대역 (전체 허용: 0.0.0.0/0)
    dip [목적지 VIP/서브넷마스크]        # 목적지 IP 대역 (보통 설정한 VIP/32)
    dport [목적지 포트]                 # 목적지 서비스 포트 번호
    status enable                     # 필터 정책 활성화
    apply                             # 필터 설정 적용

  sticky time [세션 유지 시간(초)]       
  # 동일 클라이언트의 세션 지속 유지 시간 (예: 60)
  sticky source-subnet [세션 고정 기준 마스크]    
  # 세션 고정 기준 IP 범위 (단일 IP 기준: 255.255.255.255)

  real [연동할 1번 REAL 서버 번호] status enable   
  # 2단계에서 만든 1번 리얼 서버를 SLB에 바인딩
  real [연동할 2번 REAL 서버 번호] status enable  
  # 2단계에서 만든 2번 리얼 서버를 SLB에 바인딩

  apply                               # SLB 최종 설정 적용
exit                                  # SLB 설정 메뉴 종료&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;36&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;파이오링크 L4 스위치 환경에서의 SLB 핵심 설정 명령어와 구체적인 주석 설명을 안내해 드렸습니다. &lt;br /&gt;네트워크 설정 시 정책을 철저히 검증하시어 안정적인 서비스를 운용하시기를 바랍니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#L4스위치 #파이오링크 #PASK #SLB설정 #로드밸런싱 #서버부하분산 #네트워크엔지니어 #VIP설정 #HealthCheck #RealServer #StickySession #네트워크가이드</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/42</guid>
      <comments>https://ismsp-case.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 12 Aug 2026 10:53:31 +0900</pubDate>
    </item>
    <item>
      <title>[폐쇄망환경] 윈도우 프로그램 실행 지연 해결: CRL(인증서 실효 목록) 타임아웃 완벽 가이드</title>
      <link>https://ismsp-case.tistory.com/14</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;폐쇄망(Air-gapped) 환경에서 서버 및 PC를 운용할 때, 인터넷이 연결된 환경에서는 발생하지 않던 기이한 장애를 겪는 경우가 있습니다. 특정 프로그램이나 서비스가 실행될 때 1분 이상 무응답 상태로 멈춰 있거나, 끝내 실행에 실패하는 현상입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문제의 대표적인 원인은 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;1&quot;&gt;Windows의 인증서 실효 목록(CRL, Certificate Revocation List) 검증 과정에서 발생하는 네트워크 타임아웃&lt;/b&gt;입니다. 네트워크가 차단된 환경에서 Windows CryptoAPI(CAPI2)가 외부 인증 기관(CA)의 CRL 서버로 접속을 시도하다 실패하면서 시스템 지연이 발생하는 것입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;현직 보안 엔지니어 및 IT 관리자를 위해, 이 현상의 정확한 원인 분석부터 그룹 정책(GPO), 레지스트리, certutil 명령어를 활용한 단계별 해결책을 상세히 안내해 드립니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;1. CRL 단절 장애의 정확한 발생 메커니즘&lt;/h2&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;Windows 시스템에서 디지털 서명이 완료된 Executable(.exe), Dynamic Link Library(.dll), 또는 드라이버(.sys) 파일을 실행하면, OS 내부의 CryptoAPI(CAPI2)가 해당 파일의 서명 유효성을 검증합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;[프로그램 실행 요청] 
       │
       ▼
[디지털 서명 검증 (CAPI2)]
       │
       ▼
[상위 Root/Intermediate CA 확인]
       │
       ▼
[CRL / OCSP 외부 URL 접속 시도] ──(폐쇄망 차단)──► [타임아웃 대기 (30초~1분)]
       │                                                 │
       ▼                                                 ▼
[검증 실패 또는 지연 완료] ◄──────────────────────────────┘
       │
       ▼
[프로그램 실행 지연 또는 무응답 종료]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;인증서 체인 확인:&lt;/b&gt; 파일에 서명된 인증서부터 최상위 루트 인증서(Root CA)까지의 체인을 검증합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;CRL/OCSP 검증 시도:&lt;/b&gt; 인증서 내부에 명시된 CDP(CRL Distribution Point) 또는 AIA(Authority Information Access)의 HTTP/LDAP 주소로 접속을 시도합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;네트워크 타임아웃 발생:&lt;/b&gt; 폐쇄망 환경 특성상 패킷이 드롭(Drop)되거나 차단되므로, Windows는 기본 타임아웃 시간 동안 응답을 기다립니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0&quot;&gt;실행 지연 및 오류:&lt;/b&gt; 이 타임아웃 대기 시간으로 인해 작업 관리자에는 프로세스가 올라와 있으나 화면에는 뜨지 않는 '프리징' 현상이 발생합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cccc.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAO9Q/dJMcagsSnum/mPmr2Bj8pehdKIWQft4Uu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAO9Q/dJMcagsSnum/mPmr2Bj8pehdKIWQft4Uu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAO9Q/dJMcagsSnum/mPmr2Bj8pehdKIWQft4Uu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAO9Q%2FdJMcagsSnum%2FmPmr2Bj8pehdKIWQft4Uu1%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;768&quot; data-filename=&quot;cccc.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size26&quot;&gt;2. 해결 방안 1: 그룹 정책(GPO)을 통한 루트 인증서 자동 업데이트 및 CRL 검증 차단&lt;/h2&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;도메인 환경(Active Directory) 또는 로컬 그룹 정책 편집기(gpedit.msc)를 통해 외부 네트워크 접속 시도 자체를 차단하는 방법입니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;2-1. 루트 인증서 자동 업데이트 비활성화&lt;/h3&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;외부 인터넷을 통한 자동 루트 인증서 업데이트 기능을 비활성화하여 불필요한 외산 서버 접속 시도를 차단합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Win + R 키를 눌러 gpedit.msc를 실행합니다.&lt;/li&gt;
&lt;li&gt;다음 경로로 이동합니다: 컴퓨터 구성 &amp;gt; 관리 템플릿 &amp;gt; 시스템 &amp;gt; 인터넷 통신 관리 &amp;gt; 인터넷 통신 설정&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;[루트 인증서 자동 업데이트 기능을 사용 안 함]&lt;/b&gt; (Turn off Automatic Root Certificates Update) 항목을 더블 클릭합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,3,0&quot;&gt;[사용]&lt;/b&gt;(Enabled)으로 변경한 후 적용합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;eeee.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;819&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNEAz6/dJMcaf1K7C6/2JvCbBt0tTuQpANuTYs941/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNEAz6/dJMcaf1K7C6/2JvCbBt0tTuQpANuTYs941/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNEAz6/dJMcaf1K7C6/2JvCbBt0tTuQpANuTYs941/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNEAz6%2FdJMcaf1K7C6%2F2JvCbBt0tTuQpANuTYs941%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;899&quot; height=&quot;819&quot; data-filename=&quot;eeee.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;819&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;2-2. 인증서 경로 검증 타임아웃 단축 및 네트워크 조회 비활성화&lt;/h3&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;인증서 검증 시 외부 네트워크 조회를 차단하거나, 대기 시간을 최소화하도록 설정합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다음 경로로 이동합니다: 컴퓨터 구성 &amp;gt; Windows 설정 &amp;gt; 보안 설정 &amp;gt; 공개 키 정책&lt;/li&gt;
&lt;li&gt;우측 창의 &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;18,1,0&quot;&gt;[인증서 경로 유효성 검사 설정]&lt;/b&gt;(Certificate Path Validation Settings)을 더블 클릭합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,2,0&quot;&gt;[네트워크 검색]&lt;/b&gt;(Network Retrieval) 탭으로 이동합니다.&lt;/li&gt;
&lt;li&gt;'이 정책 설정 정의'를 체크합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,4,0&quot;&gt;[기본 검색 제한 시간 설정]&lt;/b&gt; 항목에서 다음 값을 변경합니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18,4,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,4,1,0,0&quot;&gt;기본 경로 검색 타임아웃(초):&lt;/b&gt; 1 초 (기본값: 15초)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,4,1,1,0&quot;&gt;기본 누적 URL 검색 타임아웃(초):&lt;/b&gt; 1 초 (기본값: 20초)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하단의 &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;18,5,0&quot;&gt;'경로의 유효성을 검사하는 동안 발급자 인증서(AIA) 검색 허용(권장)'&lt;/b&gt; 체크를 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;18,5,0&quot;&gt;해제&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dddd.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGVMcR/dJMcadJBz8p/QGu9feR5vhFkQ6Ct0lDKO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGVMcR/dJMcadJBz8p/QGu9feR5vhFkQ6Ct0lDKO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGVMcR/dJMcadJBz8p/QGu9feR5vhFkQ6Ct0lDKO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGVMcR%2FdJMcadJBz8p%2FQGu9feR5vhFkQ6Ct0lDKO0%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;901&quot; height=&quot;883&quot; data-filename=&quot;dddd.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size26&quot;&gt;3. 해결 방안 2: 레지스트리(Registry) 직접 수정을 통한 일괄 적용&lt;/h2&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;그룹 정책 적용이 불가능하거나, 스크립트(BAT/PowerShell)를 통해 여러 폐쇄망 장비에 일괄 적용해야 할 때 사용하는 레지스트리 설정 값입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;명령 프롬프트(CMD)를 &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;23&quot;&gt;관리자 권한&lt;/b&gt;으로 실행한 후 아래 명령어를 수행합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;DOS&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;:: 1. 루트 인증서 자동 업데이트 비활성화
reg add &quot;HKLM\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot&quot; /v &quot;DisableRootAutoUpdate&quot; /t REG_DWORD /d 1 /f

:: 2. CAPI2 네트워크 검증 타임아웃 설정 (1초로 단축)
reg add &quot;HKLM\SOFTWARE\Policies\Microsoft\Cryptography\OID\EncodingType 0\CertDllCreateCertificateChainEngine\Config&quot; /v &quot;ChainUrlRetrievalTimeoutMilliseconds&quot; /t REG_DWORD /d 1000 /f

:: 3. 오프라인 상태에서 CRL 조회 실패 시 즉시 바이패스 처리 설정
reg add &quot;HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CertDllCreateCertificateChainEngine\Config&quot; /v &quot;DefaultFlags&quot; /t REG_DWORD /d 4 /f
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ffff.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PSm2o/dJMcai5dTrK/0eB2kLSIkPF30xHOOoBqX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PSm2o/dJMcai5dTrK/0eB2kLSIkPF30xHOOoBqX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PSm2o/dJMcai5dTrK/0eB2kLSIkPF30xHOOoBqX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPSm2o%2FdJMcai5dTrK%2F0eB2kLSIkPF30xHOOoBqX1%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;1008&quot; height=&quot;742&quot; data-filename=&quot;ffff.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;27&quot; data-ke-size=&quot;size26&quot;&gt;4. 해결 방안 3: certutil을 활용한 Root/Intermediate CA 및 CRL 오프라인 수동 등록&lt;/h2&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;정책 설정으로 네트워크 접속을 차단했더라도, 특정 보안 프로그램은 인증서 체인 자체가 유효하지 않으면 동작을 거부할 수 있습니다. 이 경우 외부 망에서 다운로드한 Root CA, Intermediate CA, 그리고 CRL(.crl) 파일을 폐쇄망으로 반입하여 수동 등록해야 합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;29&quot; data-ke-size=&quot;size23&quot;&gt;4-1. 외부망 PC에서 인증서 및 CRL 다운로드 방법&lt;/h3&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;프로그램 실행을 막는 해당 서명 인증서의 내역을 확인합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;31&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실행되지 않는 .exe 파일 우클릭 &amp;gt; &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;31,0,0&quot;&gt;[속성]&lt;/b&gt; &amp;gt; &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;31,0,0&quot;&gt;[디지털 서명]&lt;/b&gt; 탭으로 이동합니다.&lt;/li&gt;
&lt;li&gt;서명 목록에서 인증서를 선택하고 &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;31,1,0&quot;&gt;[자세히]&lt;/b&gt; &amp;gt; [인증서 보기]를 클릭합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31,2,0&quot;&gt;[자세한 정보]&lt;/b&gt; 탭에서 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;31,2,0&quot;&gt;[CRL 배포 지점]&lt;/b&gt;(CDP) URL(예: [&lt;a href=&quot;http://crl.pki.example.com/ref.crl](http://crl.pki.example.com/ref.crl)&quot;&gt;http://crl.pki.example.com/ref.crl](http://crl.pki.example.com/ref.crl)&lt;/a&gt;)을 확인 후 인터넷이 되는 환경에서 해당 URL에 접속하여 .crl 파일을 다운로드합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;33&quot; data-ke-size=&quot;size23&quot;&gt;4-2. 폐쇄망 PC에 CLI 명령어로 수동 등록&lt;/h3&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;반입한 인증서 및 CRL 파일을 관리자 권한 CMD에서 아래 명령어를 이용해 저장소에 등록합니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;:: 루트 인증서(Root CA) 등록
certutil -addstore -f Root &quot;C:\&amp;lt;&amp;lt;Path&amp;gt;&amp;gt;\To\RootCA.cer&quot;

:: 중계 인증서(Intermediate CA) 등록
certutil -addstore -f CA &quot;C:\&amp;lt;&amp;lt;Path&amp;gt;&amp;gt;\To\IntermediateCA.cer&quot;

:: CRL(인증서 실효 목록) 수동 등록
certutil -addstore -f Root &quot;C:\&amp;lt;&amp;lt;Path&amp;gt;&amp;gt;\To\Certificate.crl&quot;
certutil -addstore -f CA &quot;C:\&amp;lt;&amp;lt;Path&amp;gt;&amp;gt;\To\Certificate.crl&quot;

:: 캐시된 검증 정보 초기화 (수동 등록 반영)
certutil -urlcache * delete&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 data-path-to-node=&quot;37&quot; data-ke-size=&quot;size26&quot;&gt;5. 트러블 슈팅 결과 검증 방법&lt;/h2&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;모든 조치를 완료한 후, 정상적으로 조치가 되었는지 검증하는 두 가지 방법입니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;39&quot; data-ke-size=&quot;size23&quot;&gt;5-1. CAPI2 이벤트 로그를 통한 타임아웃 제거 확인&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;40&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;eventvwr.msc를 실행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;40,1,0&quot;&gt;[응용 프로그램 및 서비스 로그]&lt;/b&gt; &amp;gt; &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;40,1,0&quot;&gt;[Microsoft]&lt;/b&gt; &amp;gt; &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;40,1,0&quot;&gt;[Windows]&lt;/b&gt; &amp;gt; &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;40,1,0&quot;&gt;[CAPI2]&lt;/b&gt; &amp;gt; [Operational]로 이동합니다.&lt;/li&gt;
&lt;li&gt;우측 창에서 '로그 사용'을 클릭하여 활성화한 후 문제가 되던 프로그램을 실행합니다.&lt;/li&gt;
&lt;li&gt;이벤트 결과 중 Result 값이 0 (SUCCESS)으로 떨어지거나, NetworkRetrievalTimeout 관련 에러(Error) 메시지가 더 이상 발생하지 않는지 확인합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;41&quot; data-ke-size=&quot;size23&quot;&gt;5-2. CLI를 통한 URLFetch 테스트&lt;/h3&gt;
&lt;p data-path-to-node=&quot;42&quot; data-ke-size=&quot;size16&quot;&gt;관리자 권한 CMD에서 아래 명령어를 수행하여 오프라인 상태에서의 검증 속도를 측정합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;certutil -verify -urlfetch &quot;C:\Path\To\TargetApp.exe&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;결과 출력 시 Retrieval: ERROR가 출력되더라도, 타임아웃 대기 시간 없이 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;44&quot;&gt;즉시(1초 이내)&lt;/b&gt; 결과가 반환된다면 CRL 단절로 인한 지연 문제는 완전히 해결된 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;zzzz.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1ZIe/dJMcaiKWgsy/qMEZUuqTG1oLGLeWoJTgC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1ZIe/dJMcaiKWgsy/qMEZUuqTG1oLGLeWoJTgC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1ZIe/dJMcaiKWgsy/qMEZUuqTG1oLGLeWoJTgC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1ZIe%2FdJMcaiKWgsy%2FqMEZUuqTG1oLGLeWoJTgC0%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;906&quot; height=&quot;504&quot; data-filename=&quot;zzzz.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;47&quot; data-ke-size=&quot;size16&quot;&gt;폐쇄망 환경에서의 Windows 트러블 슈팅은 네트워크가 차단된 상황을 고려하여 OS의 기본 동작 메커니즘을 적절히 제어하는 것이 핵심입니다. 위 가이드에 따라 레지스트리 및 GPO 타임아웃을 단축하고, 필요한 루트 인증서를 사전에 배포해 두신다면 CRL 단절로 인한 서비스 장애를 완벽히 예방할 수 있습니다.&lt;/p&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#폐쇄망 #폐쇄망윈도우 #CRL타임아웃 #인증서실효목록 #CAPI2오류 #certutil #윈도우실행지연 #GPO인증서설정 #오프라인인증서등록 #RootCA등록 #DisableRootAutoUpdate #윈도우프리징해결 #보안엔지니어 #전산실트러블슈팅 #CDP타임아웃 #윈도우레지스트리수정 #네트워크타임아웃 #WindowsServer #윈도우트러블슈팅 #IT관리자</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/14</guid>
      <comments>https://ismsp-case.tistory.com/14#entry14comment</comments>
      <pubDate>Fri, 31 Jul 2026 10:39:50 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정</title>
      <link>https://ismsp-case.tistory.com/6</link>
      <description>&lt;h1 data-path-to-node=&quot;7&quot;&gt;[리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3333.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oSXDn/dJMcadJzUje/rVJAyjTsRrKvzaCkEZomdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oSXDn/dJMcadJzUje/rVJAyjTsRrKvzaCkEZomdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oSXDn/dJMcadJzUje/rVJAyjTsRrKvzaCkEZomdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoSXDn%2FdJMcadJzUje%2FrVJAyjTsRrKvzaCkEZomdK%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;1376&quot; height=&quot;768&quot; data-filename=&quot;3333.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size26&quot;&gt;1. 점검 목적&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;시스템 진단에 앞서 필요한 환경 변수(날짜,&lt;/span&gt;&lt;span&gt; OS 종류,&lt;/span&gt;&lt;span&gt; 권한 등)를 초기화하고,&lt;/span&gt;&lt;span&gt; 진단 결과를 저장할 파일 및 디렉터리를 자동 생성하는 것이 일차적인 목적입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;또한,&lt;/span&gt;&lt;span&gt; 스크립트 전반에서 사용될 화면 출력 포맷과 결과 파일 저장 로직을 함수화하여 코드의 중복을 방지하고 진단 결과의 가독성과 신뢰성을 확보하고자 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size26&quot;&gt;2. 점검 항목 (환경 설정 및 공통 함수)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;대상 OS:&lt;/b&gt;&lt;span&gt; Linux&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;주요 기능:&lt;/b&gt;&lt;span&gt; 환경 변수 정의,&lt;/span&gt;&lt;span&gt; 로그/결과 파일 초기화,&lt;/span&gt;&lt;span&gt; 결과 출력 함수 정의(양호/취약/정보),&lt;/span&gt;&lt;span&gt; 타임아웃 처리 로직,&lt;/span&gt;&lt;span&gt; root 권한 검증&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size26&quot;&gt;3. 점검 방법 (스크립트 소스 코드 분석)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아래 코드는 제공된 자동 점검 스크립트의 환경 설정 및 공통 함수 선언부입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash

# ==============================================================================
# 1. 환경 설정 및 변수 초기화
# ==============================================================================
START_TIME=$(date +%s)            # 스크립트 시작 시간 기록 (유닉스 타임)
TODAY=$(date +%y%m%d)             # 오늘 날짜 (YYMMDD 포맷)
mkdir -p &quot;$TODAY-result&quot;          # 결과 저장 디렉터리 생성

LOG=&quot;./$TODAY-result/check.log&quot;   # 상세 로그 파일 경로
RESULT=&quot;./$TODAY-result/$TODAY-result.txt&quot; # 최종 진단 결과 파일 경로
OS_NAME=$(uname -s)               # 운영체제 이름 확인 (Linux)

# 기존 로그 및 결과 파일 초기화 (0 바이트로 만듦)
&amp;gt; &quot;$LOG&quot;
&amp;gt; &quot;$RESULT&quot;

# 요약을 위한 배열 선언
WARN_LIST=()                     # 취약 항목 메시지 저장 배열
INFO_LIST=()                     # 정보/수동점검 항목 메시지 저장 배열
CURRENT_CODE=&quot;&quot;                  # 현재 점검 중인 항목 코드 (예: U-01)
CURRENT_ID=&quot;&quot;                    # 현재 점검 중인 항목 ID (숫자 추출용)

# ==============================================================================
# 2. 화면 출력 및 결과 파일 저장 공통 함수 정의
# ==============================================================================

# 구분선 출력 함수
BAR() {
    echo &quot;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&quot; | tee -a &quot;$RESULT&quot;
}

# 주요 요약 정보 출력 함수 (Cyan 색상)
SUMMARY() {
    printf '\033[36m %s\033[0m\n' &quot;$*&quot; | tee -a &quot;$RESULT&quot;
}

# 양호 결과 출력 함수 (Green 색상)
OK() {
    echo -e '\033[32m'&quot;[ 양호 ] : $1&quot;'\033[0m' | tee -a &quot;$RESULT&quot;
    if [ -n &quot;$2&quot; ]; then
        echo -e '\033[90m'&quot;  =&amp;gt; 판단 사유: $2&quot;'\033[0m' | tee -a &quot;$RESULT&quot;
    fi
}

# 취약 결과 출력 함수 (Red 색상) 및 WARN_LIST 배열 추가
WARN() {
    local msg=&quot;[ 취약 $CURRENT_ID ] : $1&quot;
    echo -e '\033[31m'&quot;$msg&quot;'\033[0m' | tee -a &quot;$RESULT&quot;
    if [ -n &quot;$2&quot; ]; then
        echo -e '\033[90m'&quot;  =&amp;gt; 판단 사유: $2&quot;'\033[0m' | tee -a &quot;$RESULT&quot;
    fi
    WARN_LIST+=(&quot;$msg&quot;)          # 최종 요약을 위해 배열에 저장
}

# 정보/수동점검 결과 출력 함수 (Yellow 색상) 및 INFO_LIST 배열 추가
INFO() {
    local msg=&quot;[ 정보/수동점검 $CURRENT_ID ] : $1&quot;
    echo -e '\033[33m'&quot;$msg&quot;'\033[0m' | tee -a &quot;$RESULT&quot;
    if [ -n &quot;$2&quot; ]; then
        echo -e '\033[90m'&quot;  =&amp;gt; 참고 내용: $2&quot;'\033[0m' | tee -a &quot;$RESULT&quot;
    fi
    INFO_LIST+=(&quot;$msg&quot;)          # 최종 요약을 위해 배열에 저장
}

# 점검 항목 시작 알림 함수 (Cyan 색상 및 ID 추출)
CODE(){
    CURRENT_CODE=&quot;$*&quot;
    CURRENT_ID=$(echo &quot;$CURRENT_CODE&quot; | grep -oE 'U-[0-9]{1,2}') # 항목에서 U-번호 추출
    echo &quot;&quot; | tee -a &quot;$RESULT&quot;   # 가독성을 위한 개행
    echo -e '\033[36m'&quot;■ $CURRENT_CODE&quot;'\033[0m' | tee -a &quot;$RESULT&quot;
}

# 항목 점검 완료 처리 및 구분선 출력 함수
FINISH() {
    echo -e '\033[90m'&quot;▶ $*&quot;'\033[0m' | tee -a &quot;$RESULT&quot; # 참고 링크 등 출력
    BAR
}

# ==============================================================================
# 3. 진단 결과 파일 헤더 작성 및 기본 정보 기록
# ==============================================================================
cat &amp;lt;&amp;lt; EOF &amp;gt; $RESULT
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 [ 2026 주요정보통신기반시설 기반 보안 취약점 점검 스크립트(리눅스)]                                                 
    - 스크립트 사용 전 충분한 검증을 수행하시고 사용하기 바랍니다.
	- 스크립트 사용에 대한 책임은 사용자에게 있습니다.
    - 2026 주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드를 기반으로 작성되었습니다.
	- 총 67개의 항목을 점검합니다.
	- 수동점검 항목이 존재하며, 사용자가 직접 확인 후 판단하여야 합니다.
    - 해당 스크립트는 취약점을 자동으로 조치하여 주지 않습니다.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

EOF

SUMMARY &quot;운영체제: $OS_NAME&quot;
SUMMARY &quot;진단일시: $(date)&quot;
BAR

# ==============================================================================
# 4. 타임아웃 실행 함수 (명령어 지연/Hang 방지)
# ==============================================================================
EXEC_TIMEOUT() {
    local WAIT_TIME=$1          # 첫 번째 인자: 제한 시간(초)
    shift
    local COMMAND=&quot;$*&quot;          # 나머지 인자: 실행할 명령어 전체

    # 1. timeout 명령어가 지원되는 환경 (대부분의 최신 리눅스)
    if command -v timeout &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
        timeout &quot;$WAIT_TIME&quot; bash -c &quot;$COMMAND&quot;
        local STATUS=$?
        return &quot;$STATUS&quot;        # timeout 종료 시 124 반환
    else
        #  지원되지 않는 경우 수동 구현 (백그라운드 실행 후 PID 감시)
        bash -c &quot;$COMMAND&quot; &amp;amp;
        local CMD_PID=$!
        local COUNT=0
        
        # 프로세스 생존 여부를 1초마다 확인
        while kill -0 &quot;$CMD_PID&quot; 2&amp;gt;/dev/null; do
            sleep 1
            COUNT=$((COUNT + 1))
            # 제한 시간 도달 시 강제 종료 (kill -9)
            if [ &quot;$COUNT&quot; -ge &quot;$WAIT_TIME&quot; ]; then
                kill -9 &quot;$CMD_PID&quot; 2&amp;gt;/dev/null
                return 124      # 타임아웃 반환 코드 고정
            fi
        done
        wait &quot;$CMD_PID&quot; 2&amp;gt;/dev/null
        return $?
    fi
}

# ==============================================================================
# 5. 사전 검증: root 권한 확인
# ==============================================================================
if [ &quot;$(id -u)&quot; -ne 0 ]; then
    echo &quot;==============================================================================&quot;
    echo &quot;[ 실행 오류 ] 이 진단 스크립트는 시스템 주요 설정 파일을 점검합니다.&quot;
    echo &quot;             따라서 반드시 root 권한(관리자)으로 실행해야 합니다.&quot;
    echo &quot;&quot;
    echo &quot;  ▶ 현재 접속 계정: $(whoami)&quot;
    echo &quot;  ▶ 올바른 실행 방법: sudo $0&quot;
    echo &quot;==============================================================================&quot;
    exit 1                      # root가 아니면 스크립트 강제 종료
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size23&quot;&gt;[라인 바이 라인(Line-by-Line) 코드 해설]&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,0&quot;&gt;1~16 라인 (환경 변수 초기화 및 디렉터리 생성):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;스크립트 실행에 필요한 시간 정보(&lt;/span&gt;START_TIME&lt;span&gt;),&lt;/span&gt;&lt;span&gt; 날짜(&lt;/span&gt;TODAY&lt;span&gt;),&lt;/span&gt;&lt;span&gt; 운영체제 종류(&lt;/span&gt;uname -s&lt;span&gt;)를 변수에 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;날짜별로 결과 디렉터리를 생성(&lt;/span&gt;mkdir -p&lt;span&gt;)하고,&lt;/span&gt;&lt;span&gt; 상세 로그(&lt;/span&gt;check.log&lt;span&gt;)와 최종 결과 파일(&lt;/span&gt;YYMMDD-result.txt&lt;span&gt;)의 경로를 정의합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;gt; &quot;$LOG&quot;&lt;span&gt; 구문을 통해 진단 시작 전 기존 파일 내용을 초기화하여 0 바이트로 만듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,1,0&quot;&gt;18~22 라인 (요약용 배열 선언):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WARN_LIST=()&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;INFO_LIST=()&lt;span&gt;를 선언하여 진단 중 발견된 취약(FAIL) 항목과 수동점검(INFO) 항목의 메시지를 저장했다가 스크립트 최하단에서 요약 출력하는 데 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,2,0&quot;&gt;28~86 라인 (출력 및 저장 공통 함수 정의 - BAR, SUMMARY, OK, WARN, INFO, CODE, FINISH):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;ANSI 색상 코드(Green,&lt;/span&gt;&lt;span&gt; Red,&lt;/span&gt;&lt;span&gt; Yellow,&lt;/span&gt;&lt;span&gt; Cyan 등)를 활용하여 터미널 화면에서 진단 결과를 시각적으로 명확하게 구분합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;모든 함수 내 명령어 뒤에 &lt;/span&gt;| tee -a &quot;$RESULT&quot;&lt;span&gt;를 붙여 화면 출력과 동시에 최종 결과 파일에 내용을 누적 저장(&lt;/span&gt;-a&lt;span&gt; 옵션)합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;WARN&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;INFO&lt;span&gt; 함수는 색상 출력과 동시에 앞서 선언한 배열(&lt;/span&gt;WARN_LIST&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;INFO_LIST&lt;span&gt;)에 메시지를 누적(&lt;/span&gt;+=&lt;span&gt;)합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;CODE&lt;span&gt; 함수는 점검 시작 시 &lt;/span&gt;grep&lt;span&gt;을 이용하여 점검 항목 문자열에서 &lt;/span&gt;CURRENT_ID&lt;span&gt;(예:&lt;/span&gt;&lt;span&gt; U-01)를 자동으로 추출하여 이후 &lt;/span&gt;WARN&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;INFO&lt;span&gt; 함수에서 사용하도록 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,3,0&quot;&gt;91~107 라인 (결과 파일 헤더 작성):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cat &amp;lt;&amp;lt; EOF &amp;gt; $RESULT&lt;span&gt; 구문을 사용하여 스크립트의 버전,&lt;/span&gt;&lt;span&gt; 출처,&lt;/span&gt;&lt;span&gt; 주의사항 등을 담은 긴 텍스트 블록을 결과 파일의 맨 윗부분에 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,4,0&quot;&gt;110~112 라인 (기본 정보 기록):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,4,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;앞서 정의한 &lt;/span&gt;SUMMARY&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;BAR&lt;span&gt; 함수를 호출하여 운영체제 이름과 진단 일시를 결과 파일에 기록합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,5,0&quot;&gt;119~150 라인 (EXEC_TIMEOUT 함수 정의):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,5,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;진단 중 응답이 없거나 매우 느린 명령어(Hang 현상)로 인해 스크립트 전체가 멈추는 것을 방지하는 핵심 함수입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;시스템에 &lt;/span&gt;timeout&lt;span&gt; 명령어가 존재(&lt;/span&gt;command -v&lt;span&gt;)하면 이를 활용하고,&lt;/span&gt;&lt;span&gt; 없는 구형 Unix 시스템의 경우 명령어를 백업그라운드(&lt;/span&gt;&amp;amp;&lt;span&gt;)로 실행한 후 PID를 감시하여 수동으로 제한 시간을 처리하도록 구현되어 호환성을 확보했습니다.&lt;/span&gt;&lt;span&gt; 타임아웃 발생 시 결과 코드 &lt;/span&gt;124&lt;span&gt;를 반환합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,6,0&quot;&gt;155~166 라인 (root 권한 사전 검증):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20,6,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;시스템 보안 설정을 진단하기 위해서는 주요 설정 파일(&lt;/span&gt;/etc/shadow&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;/etc/ssh/sshd_config&lt;span&gt; 등)에 대한 읽기 권한이 필수적입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;id -u&lt;span&gt; 명령어의 결과가 &lt;/span&gt;0&lt;span&gt;(root의 UID)이 아닌 경우 에러 메시지를 출력하고 스크립트를 즉시 강제 종료(&lt;/span&gt;exit 1&lt;span&gt;)하여 오진을 방지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size23&quot;&gt;[스크립트 보완 및 예외 처리 제안]&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,0,0&quot;&gt;보완 필요 요소:&lt;/b&gt;&lt;span&gt; 전반적으로 매우 완성도 높은 초기 선언부입니다.&lt;/span&gt;&lt;span&gt; 다만,&lt;/span&gt;&lt;span&gt; 다수의 리눅스 배포판 및 구형 Unix 시스템과의 호환성을 더욱 강화하기 위해 아래와 같은 개선안을 제안해 드립니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,0&quot;&gt;권한 확인 로직 보완:&lt;/b&gt;&lt;span&gt; &lt;/span&gt;id -u&lt;span&gt;를 지원하지 않는 아주 오래된 유닉스 시스템 환경을 고려하여 사용자를 확인하는 방식을 강화할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,2,0&quot;&gt;날짜 포맷 변경:&lt;/b&gt;&lt;span&gt; 결과 파일의 가독성과 파일 정렬을 위해 날짜 포맷을 &lt;/span&gt;YYMMDD&lt;span&gt;에서 &lt;/span&gt;YYYYMMDD&lt;span&gt; 형식으로 변경하는 것을 권장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/div&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# 권장 개선 코드 (2 라인)
START_TIME=$(date +%s 2&amp;gt;/dev/null || perl -e 'print time') # date +%s 미지원 유닉스 대응
TODAY=$(date +%Y%m%d)             # 20260101 포맷으로 변경

# 권장 개선 코드 (155~156 라인 - root 권한 확인 강화)
CURRENT_USER=$(id -u 2&amp;gt;/dev/null || whoami)
if [ &quot;$CURRENT_USER&quot; != &quot;0&quot; ] &amp;amp;&amp;amp; [ &quot;$CURRENT_USER&quot; != &quot;root&quot; ]; then
    # ... 에러 메시지 출력 로직 ...
    exit 1
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #101828; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-streamdown=&quot;heading-2&quot;&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;span style=&quot;color: #000000;&quot;&gt;본 포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 반드&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시 테스트 환경에서 사전 검증을 거친 후 적용&lt;/b&gt;&lt;/span&gt;하시기 바랍니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리눅스 서버 진단&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전&lt;/b&gt;&lt;b&gt;체 자동화 스크립트 원본 압축파일의 비밀번호는 비밀댓글을&lt;/b&gt;&lt;/span&gt; 남겨 주시면 확인 후 송부해 드리겠습니다. 본 가이드의 코드를 활용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;발생하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시스템 장애 및 불이익에 대한 책임은 사용자 본인&lt;/b&gt;&lt;/span&gt;에게 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bgGtun/dJMcafuxsIH/RUcIiJLC7348TXUUfVTNk0/Linux_VulnCheck_2026_v2.5.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Linux_VulnCheck_2026_v2.5.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>보안취약점점검_요약</category>
      <category>#스크립트초기화 #리눅스보안점검 #쉘스크립트함수 #tee명령어 #ANSI색상코드 #타임아웃처리 #root권한확인 #보안스크립트공통 #주요정보통신기반시설 #보안취약점점검</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/6</guid>
      <comments>https://ismsp-case.tistory.com/6#entry6comment</comments>
      <pubDate>Tue, 28 Jul 2026 14:44:58 +0900</pubDate>
    </item>
    <item>
      <title>윈도우 레지스트리 USBSTOR 삭제 오류 해결: 장치 관리자를 통한 안전한 우회 방법</title>
      <link>https://ismsp-case.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 시스템을 관리하다 보면 보안이나 시스템 초기화 목적으로 과거의 하드웨어 접속 흔적을 지워야 할 때가 있습니다. 특히 USB 저장장치의 사용 이력이 기록되는 &lt;b&gt;HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR&lt;/b&gt; 레지스트리 키를 삭제하려는 경우가 대표적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 많은 관리자가 관리자 권한(Administrators 그룹)을 가지고 있음에도 불구하고, 이 키를 삭제할 때 &quot;키를 삭제하는 동안 오류가 발생했습니다&quot;라는 메시지와 함께 거부당하는 경험을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 이 오류가 발생하는 &lt;b&gt;팩트 기반의 이유&lt;/b&gt;와, 폐쇄망과 같은 제약된 환경에서도 외부 도구 없이 &lt;b&gt;윈도우 순정 기능만으로 안전하게 문제를 해결하는 방법&lt;/b&gt;을 공유합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 왜 삭제되지 않을까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 이해해야 할 점은 이것이 단순한 권한 설정 오류가 아니라는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcsut/dJMcah6q5Yj/nU0KaFh7bZ8IWNCgCTWF2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcsut/dJMcah6q5Yj/nU0KaFh7bZ8IWNCgCTWF2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcsut/dJMcah6q5Yj/nU0KaFh7bZ8IWNCgCTWF2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flcsut%2FdJMcah6q5Yj%2FnU0KaFh7bZ8IWNCgCTWF2k%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;768&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;커널 레벨의 보호:&lt;/b&gt; 문제의 Enum 하위 키는 윈도우 커널(PnP 매니저)이 플러그 앤 플레이 장치의 하드웨어 트리를 관리하는 핵심 영역입니다. 윈도우는 OS 가동 중에 이 영역이 무단으로 수정되어 시스템 안정성이 저해되는 것을 막기 위해 권한 이상의 강력한 보호 메커니즘을 가동합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하위 키의 권한 잠금:&lt;/b&gt; 소유자가 Administrators로 되어 있더라도, 그 하위에 존재하는 개별 USB 기기의 고유 ID 폴더들은 커널에 의해 실시간으로 잠겨 있거나 제각각 다른 시스템 권한이 부여되어 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 윈도우가 정상 가동 중인 상태(Online)에서는 그 어떤 전지전능한 권한을 가져와도 이 키를 '직접' 날려버리는 것은 커널 레벨에서 거부되도록 설계되어 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 안전한 해결책: 장치 관리자 우회법&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 목적이 &quot;과거의 USB 접속 흔적(이력) 제거&quot;라면, 위험하게 레지스트리를 강제로 부수지 않고 시스템이 스스로 이 기록을 정리하게 만드는 우회법이 가장 확실하고 안전합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 폐쇄망과 같이 외부 프로그램을 사용할 수 없는 환경에서도 사용할 수 있는 &lt;b&gt;윈도우 순정 기본 기능&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLqrma/dJMcajbXvdA/QzhpbSjWgW7txPEDZgOfQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLqrma/dJMcajbXvdA/QzhpbSjWgW7txPEDZgOfQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLqrma/dJMcajbXvdA/QzhpbSjWgW7txPEDZgOfQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLqrma%2FdJMcajbXvdA%2FQzhpbSjWgW7txPEDZgOfQk%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;768&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[단계별 절차]&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;관리자 권한으로 명령 프롬프트(CMD) 실행:&lt;/b&gt; 반드시 관리자 권한으로 CMD를 엽니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;숨겨진 장치 로드 설정:&lt;/b&gt; 현재 PC에 연결되지 않은 과거의 장치 목록까지 모두 불러오기 위해 아래 명령어를 입력합니다. (아무런 메시지가 없어야 정상입니다.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set devmgr_show_nonpresent_devices=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장치 관리자 실행:&lt;/b&gt; 같은 CMD 창에 아래 명령어를 입력하여 장치 관리자를 실행합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devmgmt.msc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;숨겨진 장치 표시 활성화:&lt;/b&gt; 장치 관리자 상단 메뉴에서 [보기] -&amp;gt; [숨겨진 장치 표시]를 반드시 체크합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;과거 흔적 제거:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목록 중 &lt;b&gt;[디스크 드라이브]&lt;/b&gt; 및 &lt;b&gt;[범용 직렬 버스 컨트롤러]&lt;/b&gt; 항목을 펼칩니다.&lt;/li&gt;
&lt;li&gt;지금 연결되지 않은 과거 장치들은 아이콘이 &lt;b&gt;흐리게(투명하게)&lt;/b&gt; 보입니다.&lt;/li&gt;
&lt;li&gt;이 흐릿한 USB 장치들을 마우스 우클릭한 뒤 [장치 제거]를 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[결과]&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 관리자에서 제거를 완료하면, 윈도우 커널은 해당 장치가 시스템에서 완전히 제거된 것으로 판단합니다. 이 과정에서 &lt;b&gt;Enum\USBSTOR 하위에 있던 해당 USB의 레지스트리 키를 시스템이 알아서 안전하게 동반 삭제합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 레지스트리를 건드리는 위험 없이 목적을 달성할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약 및 주의사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 시스템 핵심 영역인 Enum 레지스트리는 직접 삭제보다 시스템 명령을 통한 우회 제거가 훨씬 신뢰할 수 있는 방법입니다. 이 방법은 폐쇄망에서도 완벽하게 작동합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;참고:&lt;/b&gt; 만약 이 방법으로도 흔적이 남거나, &lt;b&gt;반드시 키 자체를 완전히 날려버려야 하는 특수 목적&lt;/b&gt;이 있다면, 윈도우 복구 환경(WinRE)으로 진입하여 &lt;b&gt;오프라인 하이브 로드&lt;/b&gt; 상태에서 하위 ACL(권한 목록)을 초기화하고 지워야 하는 작업이 필요합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#레지스트리삭제오류 #USBSTOR삭제 #EnumUSBSTOR #USB사용기록삭제 #장치관리자 #숨겨진장치표시 #레지스트리권한 #윈도우팁 #USB흔적제거 #IT팁</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/4</guid>
      <comments>https://ismsp-case.tistory.com/4#entry4comment</comments>
      <pubDate>Mon, 27 Jul 2026 16:58:10 +0900</pubDate>
    </item>
    <item>
      <title>[폐쇄망환경] mstsc.exe 파일 삭제 및 MUI 오류 발생 시 복구 방법</title>
      <link>https://ismsp-case.tistory.com/1</link>
      <description>&lt;h2 style=&quot;text-align: left;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;[폐쇄망환경] mstsc.exe 파일 삭제 및 MUI 오류 발생 시 복구 방법&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;인터넷 연결이 차단된 폐쇄망 환경에서 업무를 진행하다 보면, 시스템 설정 변경이나 실수로 인해 원격 데스크톱 연결(mstsc.exe) 프로그램이 삭제되는 상황이 발생할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;외부망을 통한 파일 다운로드가 불가능한 상태에서 이 조치를 시도하면, 간혹 &quot;mstsc.exe.MUI 파일이 없습니다&quot;라는 오류 메시지가 나타나며 실행이 차단되기도 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문제는 외부 프로그램 설치 없이, Windows 운영체제 내부에 기본적으로 보관되어 있는 시스템 백업 저장소를 활용하여 해결할 수 있습니다. 그 구체적인 복구 절차를 안내해 드립니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;MUI 오류 발생 원인&lt;/h2&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;Windows의 주요 실행 파일(*.exe)은 프로그램의 기본 로직만을 담당합니다. 사용자 화면에 표시되는 한글 메뉴나 레이아웃 정보는 별도의 언어 전용 파일인 MUI(Multilingual User Interface)에 저장됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;mstsc.exe&lt;/b&gt;: 원격 데스크톱 실행 파일&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;mstscax.dll&lt;/b&gt;: 원격 연결에 필요한 라이브러리 파일&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;mstsc.exe.mui&lt;/b&gt;: 한국어 사용자 인터페이스 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;따라서 실행 파일인 mstsc.exe만 복구하고 언어 파일인 mstsc.exe.mui를 제자리에 두지 않으면 시스템은 실행 환경을 구성하지 못하고 오류를 발생시킵니다. 원활한 구동을 위해서는 세 가지 파일이 모두 정해진 경로에 위치해야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;원격데스크톱 구성요소.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVhrNI/dJMcabSwFsO/AHklISGRSfMZ34Hk4Lqw4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVhrNI/dJMcabSwFsO/AHklISGRSfMZ34Hk4Lqw4K/img.png&quot; data-alt=&quot;원격 데스크톱 구성 요소 및 MUI 오류의 개념도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVhrNI/dJMcabSwFsO/AHklISGRSfMZ34Hk4Lqw4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVhrNI%2FdJMcabSwFsO%2FAHklISGRSfMZ34Hk4Lqw4K%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;768&quot; data-filename=&quot;원격데스크톱 구성요소.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원격 데스크톱 구성 요소 및 MUI 오류의 개념도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size26&quot;&gt;Windows 내부 저장소(WinSxS)를 활용한 복구 절차&lt;/h2&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;Windows 운영체제는 시스템 파일 손상에 대비하여 WinSxS라는 내부 저장소에 주요 파일의 원본을 보관합니다. 인터넷이 연결되어 있지 않더라도 명령 프롬프트를 이용해 이 파일들을 추출할 수 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;1. 명령 프롬프트 관리자 권한 실행&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;키보드의 Windows 키를 누른 뒤 cmd를 입력합니다.&lt;/li&gt;
&lt;li&gt;검색 결과에 나타나는 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;15,1,0&quot;&gt;명령 프롬프트&lt;/b&gt;를 마우스 우클릭한 후 [관리자 권한으로 실행]을 선택합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;2. 백업 파일 추출 명령어 입력&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;명령 프롬프트 창에 아래의 명령어를 순서대로 입력하고 각 줄마다 Enter 키를 누릅니다. 이 작업은 내부 저장소에서 필요한 원본 파일들을 찾아 C:\ 경로로 복사하는 과정을 수행합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19&quot;&gt;mstsc.exe 파일 추출&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;for /f &quot;delims=&quot; %i in ('dir /b /s &quot;C:\Windows\WinSxS\*mstsc.exe&quot;') do copy &quot;%i&quot; &quot;C:\mstsc.exe&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21&quot;&gt;mstscax.dll 파일 추출&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;for /f &quot;delims=&quot; %i in ('dir /b /s &quot;C:\Windows\WinSxS\*mstscax.dll&quot;') do copy &quot;%i&quot; &quot;C:\mstscax.dll&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23&quot;&gt;mstsc.exe.mui 파일 추출&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;for /f &quot;delims=&quot; %i in ('dir /b /s &quot;C:\Windows\WinSxS\*mstsc.exe.mui&quot;') do copy &quot;%i&quot; &quot;C:\mstsc.exe.mui&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;26&quot; data-ke-size=&quot;size23&quot;&gt;3. 추출된 파일의 올바른 경로 배치&lt;/h3&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;명령어 실행이 완료되면 C:\ 최상단 경로에 세 개의 파일이 생성됩니다. 이 파일들을 지정된 시스템 폴더로 각각 이동시켜야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;경로배치.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/peT6B/dJMcafU0I8g/PIB5VaxlG90abHckxy5KV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/peT6B/dJMcafU0I8g/PIB5VaxlG90abHckxy5KV1/img.png&quot; data-alt=&quot;이동해야 할 지정경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/peT6B/dJMcafU0I8g/PIB5VaxlG90abHckxy5KV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpeT6B%2FdJMcafU0I8g%2FPIB5VaxlG90abHckxy5KV1%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;768&quot; data-filename=&quot;경로배치.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이동해야 할 지정경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;28&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파일명&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;이동해야 할 지정 경로&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;28,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28,1,0,0&quot;&gt;mstsc.exe&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;28,1,1,0&quot;&gt;C:\Windows\System32\&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;28,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28,2,0,0&quot;&gt;mstscax.dll&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;28,2,1,0&quot;&gt;C:\Windows\System32\&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;28,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28,3,0,0&quot;&gt;mstsc.exe.mui&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;28,3,1,0&quot;&gt;C:\Windows\System32\ko-KR\&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29&quot;&gt;※ System32 폴더 내에 ko-KR 폴더가 존재하지 않는 경우, 새 폴더를 생성하여 해당 이름을 지정한 뒤 mstsc.exe.mui 파일을 넣으시면 됩니다.&lt;/i&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size26&quot;&gt;정상 작동 여부 확인&lt;/h2&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;모든 파일의 배치가 완료된 후 정상적으로 프로그램이 복구되었는지 확인합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;33&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Windows + R 키를 눌러 실행 창을 열어줍니다.&lt;/li&gt;
&lt;li&gt;mstsc를 입력하고 확인을 누릅니다.&lt;/li&gt;
&lt;li&gt;원격 데스크톱 연결 창이 오류 없이 정상적으로 실행되는지 확인합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;35&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;폐쇄망 환경에서 시스템 주요 파일이 손실된 경우, 외부 파일에 의존하기보다 Windows 내부의 WinSxS 저장소를 활용하는 것이 가장 안전하고 확실한 복구 방법입니다. 위의 절차를 차근차근 진행하시면 원격 데스크톱 기능을 정상적으로 재개하실 수 있습니다.&lt;/p&gt;</description>
      <category>보안실무 &amp;amp; 트러블슈팅</category>
      <category>#폐쇄망 #원격데스크톱 #mstsc #mstsc삭제복구 #mstscMUI오류 #원격데스크톱연결삭제 #System32복구 #WinSxS #윈도우10복구 #윈도우11복구 #CMD파일복구 #IT업무팁 #네트워크오류</category>
      <author>보안실무자J</author>
      <guid isPermaLink="true">https://ismsp-case.tistory.com/1</guid>
      <comments>https://ismsp-case.tistory.com/1#entry1comment</comments>
      <pubDate>Thu, 23 Jul 2026 15:56:01 +0900</pubDate>
    </item>
  </channel>
</rss>