소개
대부분의 시간을 사용하여 클라우드 애플리케이션을 실행하고 있을 것입니다. 설정 및 배포 절차의 일부로, 시스템과 애플리케이션이 공개될 때까지 강력하고 철저한 보안 조치를 구축하는 것이 중요합니다. 이 가이드에서 설명하는 보안 조치를 애플리케이션을 배포하기 전에 시행하면, 인프라에서 실행하는 모든 소프트웨어가 안전한 기본 구성을 가지게 되며, 배포 후에 시행될 수 있는 일시적인 조치보다 더 좋습니다.
이 가이드는 서버 인프라를 구성하고 설정하는 과정에서 취할 수 있는 실용적인 보안 조치를 강조합니다. 이 목록은 서버 보안을 위해 할 수 있는 모든 것을 포함한 완전한 목록은 아니지만, 시작점으로 사용할 수 있는 것을 제공합니다. 시간이 지나면서 환경과 애플리케이션의 특정 필요에 맞는 더 맞춤형 보안 접근 방식을 개발할 수 있습니다.
SSH 키
SSH(보안 셸)은 서버를 관리하고 통신하기 위해 사용되는 암호화된 프로토콜입니다. 서버와 작업할 때, 아마 SSH를 통해 서버에 연결된 터미널 세션에서 대부분 시간을 보낼 것입니다. 암호 기반 로그인 대신, SSH 키는 암호화을 사용하여 서버에 로그인하는 안전한 방법을 제공하며, 모든 사용자에게 추천됩니다.
SSH 키를 사용하면, 인증 목적으로 개인 키와 공개 키 쌍이 생성됩니다. 개인 키는 사용자가 비밀리고 안전하게 보관하고, 공개 키는 공유할 수 있습니다. 이는 비대칭 암호화라고 일반적으로 지칭되며, 다른 곳에서도 볼 수 있는 패턴입니다.
SSH 키 인증을 구성하려면, 공개 SSH 키를 서버의 기대 위치(보통 ~/.ssh/authorized_keys
)에 배치해야 합니다. SSH-키 기반 인증이 어떻게 작동하는지 더 알고 싶다면, SSH 암호화와 연결 과정 이해하기를 읽으십시오.
SSH 키가 보안을 어떻게 강화할까요?
SSH로 인증할 수 있는 모든 유형의 인증, 비밀번호 인증을 포함,는 완전히 암호화되어 있습니다. 그러나 비밀번호 기반의 로그인이 허용되면, 특히 공개 IP 주소를 갖춘 서버에 대해, 악의적인 사용자는 반복적으로, 자동으로 서버에 アクセス하ようと 시도할 수 있습니다. 동일한 IP에서 multiple failed attempts 이후에 접근을 차단하는 방법이 있지만, 악의적인 사용자는 자신의 서버로 로그인하려고 얼마나 빨라게 시도할 수 있는지 제한되는 실제적인 제한을 겪게 됩니다. 사용자가 여러 brute force 攻撃을 통해 여러 번 시도해서 사용자의 스택에 접근하는 수 있는 모든 상황은 보안 риск를 岑 dynamicly raise하게 됩니다.
SSH 鍵인증 설정은 비밀번호 기반 인증을 사용하지 않도록 가능합니다. SSH 鍵는 비밀번호보다 훨씬 더 많은 데이터 비트를 갖추고 있습니다. 비밀번호를 128 글자로 만들 수 있는 12 글자의 SSH 鍵 해시를 생성할 수 있습니다. 그러나 일부 암호 알고리즘은 강력한 컴퓨터를 사용해 비밀번호 해시를 역 engineer 하는 것을 여러 번 시도하여 岑 crackable 하다고 여기고 있습니다. 다른 것들, 특히 현대 SSH 클라이언트가 생성하는 기본 RSA 키는 아직까지 岑 crackable 하지 않습니다.
SSH 키를 사용하는 방법
SSH 키는 的任何 Linux 서버 환경에서 원격으로 로그인하는 RECOMMENDED 方法입니다. SSH 키 쌍은 로컬 컴퓨터에서 ssh
명령어를 사용하여 생성할 수 있으며, 그 다음 公 open key를 원격 서버로 이전할 수 있습니다.
서버上에 SSH ключи를 설정하려면, 우분투, 디비안 또는 센토스에 대한 SSH ключи 설정하기를 따라 가며 지정할 수 있습니다.
your stack에 대한 암호 액세스가 필요한 부분이나, brutal force 攻撃에 취약한 부분에 대해, 암호 예측을 제한하기 위해 fail2ban과 같은 솔루션을 서버에 적용할 수 있습니다.
`root` 유저가 SSH経由で 직접 로그인하는 것을 허용하는 것은 ベスト 프ACTICE가 아닙니다. 대신, 無privileged 유저로 로그인하고 필요한 권한을 인가하는 `sudo`과 같은 도구를 사용하십시오. 이러한 접근 방식은 最小权限 원칙と 知られ고 있습니다. 서버에 연결하고 unprivileged 계정을 생성하고 SSH로 동작하는지 확인하면서, `root` 로그인을 사용하지 않도록 /etc/ssh/sshd_config
에 PermitRootLogin no
지시사항을 설정하고 서버의 SSH 프로세스를 다시 시작하는 명령어 sudo systemctl restart sshd
를 사용하여 可能합니다.
방화벽
방화벽은 서비스가 네트워크에 노출되는 방식을 제어하는 소프트웨어 또는 하드웨어 장치입니다. 이러한 방화벽은 주어진 서버 또는 서버들에 들어가는 이들 서비스에 대한 인도를 어떻게 하는지 결정하고, 허용되는 전체 교통 유형을 결정합니다. 정확히 설정되었다고 간주되는 방화벽은 외부 서버 또는 네트워크를 통해 publicly available가 되어야 하는 서비스만 실제로 접근할 수 있도록 보장합니다.
typcial server에는 디폴트로 多条 서비스가 실행될 수 있습니다. 이러한 서비스는 다음과 같은 그룹에 분류할 수 있습니다.
- 인터넷에 expose되어 누구나 ACCESS할 수 있는 公共服务, 이러한 예는 web server가 실제 웹사이트를 제공하는 것입니다.
- 인터넷에 expose되지 않고, 특정 그룹의 인증 계정에 의해 또는 특정 위치에서만 사용할 수 있는 개인 서비스, 예를 들어 phpMyAdmin과 같은 데이터 베이스 제어 パnl을 말합니다.
- 公共服务로부터 노출되지 않고 서버 내부로서만 접근할 수 있어야 하는 내부 서비스, 예를 들어 로컬 연결만을 허용하는 데이터 베이스를 말합니다.
방화벽은 위에 언급된 분류에 따라 소프트웨어에 대한 접근을 다양한 수준의 연산을 통해 제한할 수 있습니다. 公共服务는 인터넷에서 열리고 사용할 수 있도록 유지할 수 있으며, 개인 서비스는 연결 유형과 같은 다양한 기준에 따라 제한할 수 있습니다. 내부 서비스는 대부분의 구성에서 인터넷에서 접근이 불가능하게 만들 수 있습니다. 사용되지 않고 있는 포트는 대부분의 구성에서 모두 차단됩니다.
방화벽이 어떻게 보안을 강화하는가?
서비스가 보안 기능을 구현하거나 원하는 인터페이스에서 실행되도록 제한되었다고 하더라도, 방화벽은 응용 프로그램에서 트래픽을 처리하기 전에 서비스로 들어오는 및 나가는 연결을 제한하여 기본적인 보호层次을 제공합니다.
이상적으로 구성된 방화벽은 가장 중요한 서비스에 대한 연결을 제한하고, 일반적으로 이러한 서비스를 위한 포트만 열 수 있습니다. 例如, SSH는 대부분 포트 22를 사용하고, 웹 브라우저를 통해 HTTP/HTTPS アクセス은 보통 포트 80과 443을 사용합니다. 특정 Software에 대한 노출은 서버의 攻撃 대면적을 감소시키고, 攻撃을 받을 수 있는 구성 요소를 제한합니다.
방화벽 구현 방법
Linux 시스템에서 다양한 방화벽이 사용 가능하며, 중요도에 따라 다양하게 구성되어 있습니다. 일반적으로, 서버에서 실행되는 서비스를 변경할 때마다 防火墙 구성을 변경해야 합니다. 다음은 시작하는 몇 가지 옵션입니다.
-
UFW(언컴플리케이티드 파이어워ール)는 Ubuntu와 같은 일부 리눅스 배포판에서 기본적으로 설치됩니다. 이에 대해 더 알아보려면 Ubuntu 20.04에서 UFW를 사용하여 파이어워ール 설정하기
-
Red Hat, Rocky, 또는 Fedora 리눅스를 사용 중이라면, 기본 도구를 사용하려면 firewalld를 사용하여 파이어워ール 설정하기를 읽어보세요.
-
UFW와 firewalld와 같은 많은 소프트웨어 방화벽은 설정된 규칙을
iptables
라는 파일에 직접 기록합니다.iptables
설정을 직접 작업하는 방법을 배우려면 Iptables Essentials: Common Firewall Rules and Commands
를 검토할 수 있습니다. Docker와 같은 다른 소프트웨어도 포트 규칙을 자체 구현하여iptables
에 직접 기록할 수 있으며, UFW로 만든 규칙과 충돌할 수 있으므로, 이러한 경우iptables
설정을 읽는 방법을 알고 계� 것이 유용합니다.
노트: 디지털오cean을 포함한 많은 호스팅 제공업체는 cloudserver(s)에 직접 적용해야 하는 방화벽 대신에 서비스로 구성할 수 있는 방화벽을 허용합니다. 관리되는 도구를 사용하여 네트워크 엣지에 구성되는 이러한 configurations은 실제로 より 간단합니다. 하지만 스크립트를 만들고 克隆하는 것이 더 어려울 수 있습니다. 디지털오cean의 클라우드 방화벽의 文档을 참조할 수 있습니다.
방화벽 구성이 unknown traffic을 차단하는 기본값으로 설정되어 있는지 확인하십시오. 그러면 배포하는 새로운 서비스가 사실상 인터넷에 노출되는 것을 방지합니다. 대신에 准入 대상에 명확하게 해야 합니다. 이렇게 서비스가 어떻게 실행되고, 어떻게 사용되고, 누가 사용할 수 있는지 평가할 수 있습니다.
VPC 네트워크
가상 개인 cloudserver(s)를 사용하는 이유는 자원들之间的 보안적인 연결을 제공합니다. 네트워크의 인터페이스가 公 internet에서 인가되지 않기 때문에 이러한 네트워크는 보안에 유용합니다.
VPC 네트워크가 어떻게 보안을 강화하呢?
一些托管提供商将默认为您分配一个公共网络接口和一个私有网络接口。禁用部分基础设施的公网接口将仅允许这些实例使用其私有网络接口通过内部网络相互连接,这意味着您的系统之间的流量将不会被路由到公共互联网上,从而暴露或拦截。
通过条件地暴露几个专用互联网网关,也称为入口网关,作为您VPC网络资源与公共互联网之间通信的唯一途径,您可以更好地控制和监控连接到您的资源的公共流量。现代容器编排系统如Kubernetes具有非常明确的入站网关概念,因为它们通常创建许多私有网络接口,需要选择性地将其暴露。
如何实现VPC网络
许多云基础设施提供商使您能够在他们的数据中心内创建和添加VPC网络中的资源。
注意:如果您想在DigitalOcean中设置自己的VPC网关,可以参考如何在Debian、Ubuntu和CentOS服务器上配置Droplet为VPC网关指南。
manuelle konfigurieren Sie Ihr eigenes privates Netzwerk kann aufgrund der erforderlichen Serverkonfigurationen und Netzwerkeingriffskenntnisse eine fortgeschrittene Aufgabe sein. Eine Alternative zur Einrichtung eines VPC-Netzes ist die Verwendung einer VPN-Verbindung zwischen den Servern.
VPNs und Privatnetzwerke
Ein VPN, oder virtuelles privates Netzwerk, ist ein Weg, sicher zu verbinden und die Verbindung so darstellen, als ob sie eine lokale privaten Netzwerk war. Dies bietet eine Möglichkeit, Ihre Dienste so zu konfigurieren, als würden sie auf einem privaten Netzwerk liegen und Remote-Server über sichere Verbindungen verbinden.
Beispielsweise unterstützen DigitalOceans private Netze die Isolation von Kommunikation zwischen Servern innerhalb des gleichen Kontos oder Teams innerhalb der gleichen Region.
Wie verbessern VPNs die Sicherheit?
Die Nutzung eines VPNs ist eine Methode, um einen privaten Netzwerk zu erstellen, das nur Ihren Servern sichtbar ist. Die Kommunikation wird vollständig privat und sicher sein. Andere Anwendungen können über die virtuelle Interface festlegen, das die VPN-Software bereitstellt. In diesem Fall müssen nur Services an die öffentliche Netzwerke ausgestellt werden, die für Clients auf dem öffentlichen Netzwerk benötigt werden.
VPN을 어떻게 구현하는지
개인 네트워크를 사용하는 것은 서버를 처음 배포할 때 네트워크 인터페이스에 대한 결정을 하고 应用程序과 防火墙를 이 인터페이스를 우선으로 할 것인지 configure를 해야 합니다. 대비하여, VPN을 배포하는 것은 추가적인 ツール을 설치하고 추가적인 네트워크 경로를 생성하지만, 기존 아키텍처 위에 배포할 수 있습니다. VPN에 있는 각 서버는 VPN 연결을 설정하기 위해 공유 보안과 구성 데이터가 필요합니다. VPN이 실행되고 있으면, 응용 프로그램이 VPN 터널을 사용하도록 configure를 해야 합니다.
Ubuntu 또는 CentOS를 사용하고 있으면, Ubuntu 20.04에서 OpenVPN 서버를 설정하고 구성하는 방법 자습서를 따라야 합니다.
Wireguard는 다른 인기있는 VPN 배포입니다. 보통, VPN는 인gress를 제한하는 것과 같은 원칙을 따르고 云计算 서버에 대한 series of private network interfaces를 구현하고 있지만, 이는 VPC 구성이 일반적으로 기반 인프라 斟酌이 되는 반면, VPN은 더 이상 의도치 없이 배포할 수 있습니다.
서비스 감사
안전성을 향상시키는 데에는 시스템을 분석하고, 사용 가능한 攻撃 면을 이해하고, 가능한 程度上 コンポーネント를 锁定하는 것이 좋습니다.
서비스 감사는 주어진 시스템上で 어떤 서비스가 실행되고 있는지, 그들은 통신을 위해 어떤 포트를 사용하고 있는지, 그리고 이 서비스들은 어떤 프로토콜을 사용하는지 알기 위한 것입니다. 이 정보는 úblicly accessible로 어떤 서비스를 configure해야하는지, 防火墙 설정, 모니터링 및 경고를 위한 것입니다.
서비스 감사가 어떻게 안전성을 향상시키는가?
실행중인 어떤 서비스가 내부用途로 或者 úbliclypurposes로 存在하는지에 따라 恶意的사용자에 의한 攻撃 면을 넓히는 것입니다. 실행되는 서비스가 많으면 software에 영향을 미치는 취약성을 가진 것의 기회가 커지게 됩니다.
이제 시스템上에 실행되는 네트워크 서비스에 대한 좋은 의사를 가지고 있다면 이러한 서비스들을 분석할 수 있습니다. 서비스 감사를 실시할 때, 각 실행중인 서비스에 대해 다음과 같은 문제들을 자신self에게 던져보십시오.:
- 이 서비스가 실행되어야 하는지?
- 이 서비스가 이러한 networkinterfaces上에서 실행되어야 하는지에 대해?
- 서비스가 공용 네트워크 인터페이스에 연결되어야 하나 비공용 네트워크 인터페이스에 연결되어야 하나요?
- 이 서비스에 대한 합법적 트래픽을 통과하도록 방화벽 규칙이 구성되어 있나요?
- 방화벽 규칙이 불합법적인 트래픽을 차단하고 있나요?
- 이 서비스들의 취약성에 대한 보안 경고를 수신할 방법이 있나요?
이러한 서비스 점검은 인프라에 새로운 서버를 구성할 때 표준 절차로 shouldBe합니다. 몇 개월에 한 번 서비스 점검을 수행하면 예상치 못한 방식으로 구성이 변경된 서비스를 발견하는 데 도움이 됩니다.
서비스 점검을 어떻게 시행하는가
시스템에서 실행 중인 네트워크 서비스를 점검하려면, 서버에서 사용 중인 모든 TCP 및 UDP 포트를 나열하기 위해 ss
명령어를 사용하세요. 프로그램 이름, PID, 및 TCP 및 UDP 트래픽을 수신하기 위해 사용되는 주소를 보여주는 예제 명령어는 다음과 같습니다:
p
, l
, u
, n
, t
옵션은 다음과 같이 작동합니다:
p
는 주어진 소켓을 사용하는 특정 프로세스를 보여줍니다.l
는 활성적으로 연결을 수신하고 있는 소켓만 보여줍니다.u
는 TCP 소켓 외에 UDP 소켓도 포함합니다.n
는 숫자 트래픽 값만 보여줍니다.t
는 TCP 소켓뿐만 아니라 UDP 소켓도 包含하고 있습니다.
이러한 출력이 나오게 됩니다:
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=69226,fd=6),("nginx",pid=69225,fd=6))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=812,fd=4))
tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=69226,fd=7),("nginx",pid=69225,fd=7))
주목해야 하는 주요 열은 Netid, Local Address:Port, Process name 열입니다. Local Address:Port가 0.0.0.0
이면 서비스는 IPv4 네트워크 인터페이스 모두에 연결을 받고 있다는 것을 의미합니다. 주소가 [::]
이면 서비스는 IPv6 인터페이스 모두에 연결을 받고 있습니다. 上面的 예제 출력에서는 SSH와 Nginx가 모두 모든 公的 인터페이스에 대해 IPv4와 IPv6 네트워크 스택을 통해 듣고 있습니다.
SSH와 Nginx가 두 인터페이스 모두에 대해 듣고 싶은지, 한 인터페이스 또는 그 다른 인터페이스에 대해 듣고 싶은지 결정할 수 있습니다. 일반적으로는 사용하지 않는 인터페이스에 실행중인 서비스를 비활성화해야 합니다.
没有人管理的更新
서버들을 패치로 최신화하여 보안의 좋은 기반 수준을 확보하는 것은 필요합니다. 오래 전에 만들어진 안정적이지 않고 보안이 취약한 소프트웨어 버전을 실행하는 서버는 보안 이벤트의 대부분을 일으키고 있으며, 정기적인 更新은 취약성을 attenuate하고 공격자가 서버에 foothold을 얻을 수 있는 것을 prevents합니다. 没有人管理的更新은 시스템이 대부분의 パッケ지를 자동으로 更新하게 합니다.
没有人值守的更新如何提高安全性?
实施无人值守,即自动更新的方式,可以降低保持服务器安全所需的努力程度,并缩短服务器可能面临已知的漏洞的时间。如果在您的服务器上运行的软件存在漏洞,那么您的服务器将会在您运行更新所需的时间内保持易受攻击的状态。每天执行无人值守的升级将确保您不会错过任何软件包,并且任何易受攻击的软件都会在修复可用时尽快打上补丁。
如何实施无人值守的更新
您可以参考如何在Ubuntu服务器上保持更新来了解在Ubuntu上实施无人值守更新的概述。
公钥基础设施和SSL/TLS加密
공식키 인frastructure, 또는 PKI는 개체를 Identify하고 communication을 암호화할 수 있게 설정된 시스템입니다. SSL 또는 TLS certificates는 각 entity의 identity를 validate 하고 communication을 보호할 수 있습니다. Authentication 후에도 이를 위해서 certificate management가 필요합니다.
PKI는 어떻게 보완되는지?
A certificate authority (CA) is established and certificates for servers within your infrastructure are managed, allowing each member of your infrastructure to validate the identities of other members and encrypt their traffic. This prevents man-in-the-middle attacks where an attacker interrupts communication between two servers in your infrastructure.마나인더미드 attaeks
Servers can be configured to trust a centralized certificate authority. After that, any certificate signed by this authority can be implicitly trusted.
Implementation of PKI involves several steps:
구현 과정
1. Establish a Certificate Authority (CA).
2. Issue digital certificates to servers and devices within your network.
3. Configure servers and devices to trust the CA’s certificates.
4. Implement a policy for certificate management, including renewal and revocation processes.
5. Regularly audit and review your PKI implementation to ensure security and compliance.
CA를 구성하고 다른 공개 ключ 인프라스트럭트URE를 설정하는 것은 상당히 많은 초기 노력을 요하며, 자격 증명을 관리하는 것은 새로운 자격 증명을 생성하거나 서명하거나 취소할 때 extra 관리 부담을 생성할 수 있습니다.
많은 사용자에 대해, 완전한 공개 ключ 인프라스트럭트URE를 实施하는 것이 인프라스트럭트URE의 需要이 커지면서 合理的한 것이 될 수 있습니다. VPN을 사용하여 구성 요소 사이의 통신을 보호하는 것은 PKI가 extra 관리 비용을 할 만큼 가치가 있는 지점을 到达하기 전까지는 나은 중간 조치입니다.
자신의 자격 증명 기관(CA)를 만들고자 하면, 사용하고자 하는 Linux 분布에 따라 How To Set Up and Configure a Certificate Authority (CA) 가이드를 참조할 수 있습니다.
결론
이 튜토리얼에 记述된 전략은 자신의 시스템 보호를 강화하기 위한 一些의 단계를 개요합니다. 보호 조치가 실제 적용 후 기간이 增长하면 其的有效性가 减弱하는 것을 인지하는 것이 중요합니다. 보안은 后来的 생각보다 적극적으로 实施되어야 합니다. 인프라스트럭트URE를 初期 제공하면서 안전한 기반을 갖추면, 그 다음 서비스와 응용 프로그램을 배치하면 그들이 기본적으로 안전한 환경에서 运行하는 것을 보장할 수 있습니다.
안녕하세요. 보통의 시작环境은 보호를 위해서는 충분합니다. 그러나 보호는 계속적으로 과정이며 iteration 과정입니다. 어떤 변화에 대한 보호Implication을 자꾸 생각하고, 어떤 단계들을 취할 수 있습니다. 언제든 당신의 software가 보호 default configuration과 environment을 만드는데 최선을 다시 확인해주세요.
Source:
https://www.digitalocean.com/community/tutorials/7-security-measures-to-protect-your-servers