紹介
多くの場合、あなたの主要な焦点はクラウドアプリケーションの立ち上げと運用にある。設定とデプロイメントプロセスの一部として、システムとアプリケーションに対して堅牢で徹底的なセキュリティ対策を構築することが重要である。このチュートリアルに記載のセキュリティ対策をデプロイメント前に実施することで、インフラストラクチャ上で動作するすべてのソフトウェアに対して安全な基本設定を提供することができ、デプロイ後に実施されるアドホックな対策に対比する。
このガイドでは、サーバーインフラを設定・セットアップする際に取ることができる実践的なセキュリティ対策をいくつかハイライトする。このリストはサーバーを安全に保つためにすべてを網羅したものではないが、これを基に構築することができるスタート地点を提供する。時間が経つにつれて、環境やアプリケーションに特化したより適合したセキュリティアプローチを開発することができる。
SSHキー
SSH( Secure Shell)は、通信やサーバーの管理を行うために使用される暗号化プロトコルです。SSHを使っていると、大半の時間は终端会话でサーバーに接続しています。密码Based loginの代わりにSSH key-based authenticationが推奨されています。SSH key authenticationでは、私钥と公鍵のペアを作成し、私钥は秘密に保管し、公鍵は共有します。これは他にも知られている非対称加密のパタンです。私钥は秘密に保管され、公鍵は共有されます。これは一般的に
「asymmetric encryption」と呼ばれます。SSH key authenticationを設定するには、公SSH keyを期待される場所(通常は~/.ssh/authorized_keys
)に置きます。SSH key-based authenticationの仕様や機能に関する詳細は、Understanding the SSH Encryption and Connection Processを読みます。
SSH Key Authenticationの機能と効果を知りたい場合は、How Do SSH Keys Enhance Security?を見てください。
SSH Key Authenticationの詳細
SSHを使用すると、パスワード認証を含むあらゆる認証が完全に暗号化されます。しかし、パスワードベースのログインが許可されている場合、悪意のあるユーザーは、特にパブリックなIPアドレスを持つサーバーに対して繰り返し、自動的にアクセスを試みることができます。同じIPからの複数の失敗した試み後にアクセスをロックアウトする方法はありますが、悪意のあるユーザーは実際にはサーバーにどのくらい早くログインを試みられるかに制限されますが、ユーザーが繰り返しブルートフォース攻撃を試みてツールのアクセスを得ようとするどんな状況もセキュリティリスクとなります。
SSHキー認証を設定することで、パスワードベースの認証を無効にすることができます。SSHキーは通常、パスワードよりも多くのビットのデータを持っています — 12文字のパスワードから128文字のSSHキーハッシュを生成することができます — これにより、ブルートフォース攻撃にはかなり難しいです。しかし、いくつかの暗号化アルゴリズムは、十分に強力なコンピューターでパスワードハッシュを逆解析しようとすることで解読可能と考えられています。一方、現代のSSHクライアントによって生成されるデフォルトのRSAキーは、まだ解読することができないとされています。
SSHキーの実装方法
SSHキーは、リモートでLinuxサーバー環境にログインするための推奨される方法です。SSHキーのペアは、ローカルマシン上でssh
コマンドを使用して生成でき、その後、公開鍵をリモートサーバーに転送することができます。
サーバー上でSSHキーを設定するには、Ubuntu、Debian、またはCentOSに対してSSHキーの設定方法に従ってください。
パスワードアクセスが必要なスタックの一部、またはブルートフォース攻撃にさらされる部分に対して、サーバー上でfail2banなどのソリューションを実装して、パスワードの推測を制限することができます。
root
ユーザーが直接SSH経由でログインするのを許可するのはベストプラクティスではありません。代わりに、アンプリヴィレッジドユーザーとしてログインし、必要に応じて特権を昇格させるsudo
などのツールを使用してください。このアプローチは、最小権限原則として知られています。サーバーに接続し、SSHで動作することを確認したアンプリヴィレッジドアカウントを作成した後、root
ログインを無効にするために、サーバーの/etc/ssh/sshd_config
にPermitRootLogin no
ディレクティブを設定し、sudo systemctl restart sshd
のようなコマンドでサーバーのSSHプロセスを再起動します。
ファイアウォール
ファイアウォールは、サービスをどのように expose(暴露)しているかということを制御するソフトウェアやハードウェアであり、あなたのサーバーやネットワORKでは何種類のtraffic(流量)が入って来ても出て行くかを制限します。適当に設定されたファイアウォールは、あなたのサーバーやネットワORKでは、唯一 publicly accessible(公开可访问)であるべき service(服务)を确保します。
Typically, when a server is installed, several services may be running by default. These can generally be divided into three categories:
- Public services that can be accessed by anyone on the internet, often anonymously. One example of this is the web server that serves your actual website.
- Private services that should only be accessed by a specific group of authorized accounts or from certain locations. For instance, a database control panel like phpMyAdmin..
- Internal services that should be accessible only from within the server itself, without exposing the service to the public internet. For example, a database that should only accept local connections.
Firewalls can restrict access to your software according to the categories above with varying degrees of granularity. Public services can be left open and accessible to the internet, while private services can be restricted based on different criteria, such as connection types. Ports that are not in use are completely blocked in most configurations.
ファイアウォールはどのように安全性を向上させるのか?
您的服务实现了安全特性,或者仅限于您希望它们运行的接口,但防火墙作为基础保护层,通过在应用程序处理流量之前限制与您服务的连接来实现。
正确定义の防火墙は、除了您需要保持开放的特定服务以外, everything elseを拒否します。通常、これらのサービスに関連したポートだけを開けます。たとえば、SSHは一般的にポート22で运行し、webブラウザを通じたHTTP/HTTPSアクセスは通常ポート80と443で运行します。少数のソフトウェアだけを公開することで、サーバの攻撃面を減らし、利用可能なコンポーネントを限定し、脆弱性の拡大を防止します。
ファイアウォールの実装方法
Linuxシステムには多くのファイアウォールがあり、其中のいくつかは他と比べて複雑です。一般的には、サーバ上で実行中のサービスを変更するたびに、防火墙の設定を変更する必要がありません。以下は、始めるためのいくつかのオプションです。
-
UFW、または、単純なファイアウォールは、UbuntuなどのいくつかのLinuxディストリビューションでデフォルトでインストールされています。それについてより詳細に学ぶには、Ubuntu 20.04でUFWを使用してファイアウォールを設定する方法を参照してください。
-
Red Hat、Rocky、またはFedora Linuxを使用している場合、デフォルトのツールを使用するために、firewalldを使用してファイアウォールを設定する方法を読むことができます。
-
UFWやfirewalldなどの多くのソフトウェアファイアウォールは、設定されたルールを
iptables
という名前のファイルに直接書き込む。iptables
設定を直接操作する方法を学ぶには、Iptables Essentials: Common Firewall Rules and Commandsを参照することができます。Dockerなどの他のソフトウェアが独自のポートルールを実装し、iptables
に直接書き込むことに注意してください。これらのような場合、iptables
設定を読むことが便利です。
注意:DigitalOceanなど多くのホスティングプロバイダーが、デフォルトのファイアウォール設定を直接適用する代わりに、外部の層としてcloud server(s)上で実行されるサービスとしてファイアウォールを設定することを許可します。これらの設定は、管理ツールを使用してネットワークエッジで実施されるため、実践上はより単純ですが、スクリプト化とリプロダクションにはより困難です。DigitalOceanのクラウドファイアウォールのドキュメントについて参照してください。
デフォルトで未知のトラフィックをブロックするようにファイアウォール設定を確認してください。これにより、新しいサービスが意図せぬところでインターネットに露出于います。代わりに、アクセスを明示的に許可する必要があります。これにより、サービスがどのように実行され、アクセスされ、誰が使用できるかの評価を強制されます。
VPCネットワーク
仮想プライベートクラウド(VPC)ネットワークは、インフラのリソースを含むプライベートなネットワークです。VPCネットワークは、リソース間でより安全な接続を提供します。なぜなら、ネットワークのインターフェースは公共インターネットからアクセスできないからです。
VPCネットワークはどのように安全性を向上させるのか?
一些托管提供商将默认为您分配一个公共网络接口和一个私有网络接口。禁用部分基础设施的公网接口将只允许这些实例使用其私有网络接口在内部网络上相互连接,这意味着您的系统之间的流量将不会通过公共互联网路由,从而暴露或被拦截的风险较低。
通过仅将少数专用互联网网关(也称为入口网关)作为您VPC网络资源与公共互联网之间通信的唯一通道,您可以更好地控制和监控连接到您的资源的公共流量。现代容器编排系统如Kubernetes具有非常明确的入站网关概念,因为它们通常创建许多私有网络接口,需要选择性地将其暴露。
如何实施VPC网络
许多云基础设施提供商都支持在他们的数据中心内创建和添加VPC网络中的资源。
注意:如果您想在DigitalOcean上设置自己的VPC网关,可以参考如何在Debian、Ubuntu和CentOS服务器上配置Droplet为VPC网关指南。
手動で自分の私有ネットワORKを設定することは、高级サーバーコンFIGurationや networking knowledge が必要です。VPC ネットワORKを設定するのに代わりに、サーvers 間で VPN 接続を使用することも可能です。
VPNs and Private Networking
A VPN, or virtual private network, is a way to create secure connections between remote computers and present the connection as if it were a local private network. This provides a way to configure your services as if they were on a private network and connect remote servers over secure connections.
For example, DigitalOcean private networks enable isolated communication between servers in the same account or team within the same region.
How Do VPNs Enhance Security?
Using a VPN is a way to map out a private network that only your servers can see. Communication will be fully private and secure. Other applications can be configured to pass their traffic over the virtual interface that the VPN software exposes. This way, only services that are meant to be used by clients on the public internet need to be exposed on the public network.
VPNの実装方法
プライベートネットワークを使用する場合、通常、サーバーを初めてデプロイする際にネットワークインターフェースについて決定を行う必要があり、アプリケーションとファイアウォールをこれらのインターフェースを優先するように設定する必要があります。それに対して、VPNのデプロイは追加のツールをインストールし、追加のネットワークルートを作成する必要がありますが、通常、既存のアーキテクチャの上にデプロイすることができます。VPN上の各サーバーは、VPN接続を確立するために必要な共有のセキュリティと設定データを持たなければなりません。VPNが稼働し始めた後、アプリケーションをVPNトンネルを使用するように設定する必要があります。
UbuntuやCentOSを使用している場合、Ubuntu 20.04でOpenVPNサーバーを設定および構成する方法のチュートリアルに従うことができます。
Wireguardも別の人気のあるVPNデプロイメントです。一般的に、VPNはクラウドサーバーへの入り口を制限するために、いくつかのエントリーポイントの背後にプライベートネットワークインターフェースを一連に実装する同じ原則に従いますが、VPC設定は通常、コアインフラストラクチャの考慮事項ですので、VPNはよりアドホックな基盤でデプロイすることができます。
サービス監査
良いセキュリティには、システムを分析し、利用可能な攻撃面を理解し、可能な限りコンポーネントを固める必要があります。
サービス監査は、特定のシステムで実行されているサービスを知る方法です。これらのサービスが通信のために使用しているポートと、それらサービスが使用しているプロトコルを調査します。この情報は、どのサービスが公にアクセス可能であるべきか、ファイアウォールの設定、監視と警報といったことを設定するために役立ちます。
サービス監査は、安全性をどのように強化するのか?
実行中の各サービスは、内部用か公的なものであろうと、悪意のあるユーザーによる攻撃面を拡大させます。実行しているサービスが多く、ソフトウェアに影響を与える脆弱性を引き起こす可能性が高まります。
自分のマシンで実行されているネットワークサービスを详细了解することができるようになったら、これらのサービスを分析することができます。サービス監査を行う際、各実行中のサービスについて以下の質問を考えてください。
- このサービスは実行されているべきですか?
- このサービスは、実行していないべきであるネットワークインターフェースで実行されていますか?
- サービスはpublic network interfaceに绑り付けられているか、あるいはprivate network interfaceに绑り付けられているかですか?
- 私たちのfirewall rule structureはこのサービスを legitimate trafficに対応させることができますか?
- 私たちのfirewall rule structureはillegitimate trafficをブロックすることができますか?
- 私たちは、これらのserviceのvulnerabilityに関するsecurity alert mechanismを持っていますか?
この種類のservice auditは、configuring any new server in your infrastructureにおいてstandard practiceです。performing service audits every few months will also help you catch any services with configurations that may have changed unintentionally。
How to Implement Service Auditing
To audit network services that are running on your system, use the ss
command to list all the TCP and UDP ports that are in use on a server. An example command that shows the program name, PID, and addresses being used for listening for TCP and UDP traffic is:
The p
, l
, u
, n
, and t
options work as follows:
p
shows the specific process using a given socket.l
shows only sockets that are actively listening for connections.u
includes UDP sockets (in addition to TCP sockets).n
shows numerical traffic values.- この文書は、Internet技術を扱う职业になっています。以下のテキストを日本語に訳してください。
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名の列です。Local Address:Portが0.0.0.0
である場合、サービスはすべてのIPv4ネットワークインタフェースで接続を受け取ります。Addressが[:]
である場合、サービスはすべてのIPv6インタフェースで接続を受け取ります。上記の例の出力ではSSHとNginxは両方の公開インタフェース、IPv4およびIPv6ネットワークスタックでListeningしています。
あなたはSSHやNginxを両方のインタフェースでListeningか、一方のみか、それ以外のインタフェースでListeningかを決められます。通常、使用しないインタフェースで运行するサービスを無効にすることは安全です。
自動更新
保持サーバーの最新化は基本のセキュリティーを确保する必要があります。使用していない更新や不安全なVersionのSoftwareは、ほとんどの安全事件の原因です。定期的に更新を行うことは、脆弱性を軽減し、攻撃者があなたのサーバーへの立足点を得られなくなります。自動更新は多数のパッケージを自動的に更新できます。
以上は、日本語訳です。ご利用ありがとう!
未観察の更新はセキュリティをどのように強化するのか?
未観察の、つまり自動的な更新を実施することで、サーバーのセキュリティを维持するために必要な努力のレベルを低下させ、サーバーが既知のバグに対して脆弱な状態に置かれる時間を短縮することができます。サーバー上のソフトウェアに影響を与える脆弱性が発生した場合、更新を実行するまでにサーバーは脆弱な状態に置かれます。毎日の未観察のアップグレードは、パッケージを逃さないようにし、修补が利用可能になるまでに脆弱なソフトウェアを패치することを保証します。
未観察の更新の実装方法
Ubuntu上で未観察の更新を実装する方法についての詳細は、Ubuntuサーバーの更新を管理する方法をご参照ください。
公钥インフラとSSL/TLS暗号化
公钥 Infrastructure(PKI)は、身份認証や通信の加密を行うために設計されたシステムです。SSLまたはTLS証書は、他の实体との間の通信を確実にすることができます。Authentication(認証)後、通信を加密します。
PKIは何で安全を高めていますか?
A certificate authority (CA) is established and certificates are managed for servers within your infrastructure, allowing each entity to validate the identities of other members and encrypt their traffic. This prevents man-in-the-middle attacks where an attacker interposes itself between a server in your infrastructure and intercepts traffic.中間狙擊攻击
Servers within your infrastructure can be configured to trust a centralized certificate authority. Any certificate signed by this authority can be implicitly trusted.
Implementation of PKI involves several steps:
实施方法
1. **Certificate Authority Setup**: Establish a Certificate Authority (CA) that signs digital certificates for users, devices, and services.
2. **Key Pair Generation**: For each user or device, generate a pair of public and private keys. The public key is distributed while the private key is kept secret.
3. **Certificate Request**: Users or devices submit a certificate request to the CA, which includes their public key and identity information.
4. **Certificate Issuance**: The CA reviews the request and issues a digital certificate containing the user’s or device’s public key and the CA’s signature.
5. **Distribution and Installation**: The issued certificate is distributed to the intended recipients and installed on their systems.
6. **Trust Delegation**: Systems and applications are configured to trust the CA’s certificates, ensuring the authenticity of the public keys included in the certificates.
7. **Regular Maintenance**: Periodically review and update the list of trusted CAs to ensure security against new threats.
初めての努力として、証書Authorityを設定し、他のpublic key infrastructureを構成することは相当な努力を必要にします。さらに、証書管理は新たな証書の作成、署名、又は废止時において additional administration burden を生じます。
Many users may find it more practical to use a VPN for securing communications between components before reaching the point where a full public key infrastructure is warranted due to the added administrative costs associated with managing certificates.
If you would like to set up your own Certificate Authority, you can refer to the How To Guides specific to your Linux distribution:How To Set Up and Configure a Certificate Authority (CA).
Conclusion
The strategies outlined in this tutorial are intended to provide an introduction to several actions you can take to enhance the security of your systems. It’s crucial to understand that these measures become less effective over time if you delay implementing them. Security should not be an afterthought; it must be considered from the outset when you set up your infrastructure. By creating a secure foundation, you can then deploy your services and applications with some assurance that they are running in a secure environment by default.
安全の起動環境を Securely 持っているときも、安全は常に進化し続ける過程であり、 iteration 过程であります。任何の変更に対する安全性影響を考え、 Software を安全なデフォルト構成や環境にするために何かを取られることが必要です。
Source:
https://www.digitalocean.com/community/tutorials/7-security-measures-to-protect-your-servers