Oracle Cloud Infrastructureドキュメント

コンピュートの保護

セキュリティの推奨事項

Oracle Cloud Infrastructure Computeは、業界をリードするセキュリティのベスト・プラクティスに従って設計され管理されている、ベアメタルと仮想マシン(VM)の両方のインスタンスを提供します。

インスタンスと資格証明の管理

  • クリティカル・インスタンス(本番インスタンスなど)の意図しない終了や悪意のある終了を防ぐため、最小セットのグループに対してINSTANCE_DELETEパーミッションを与えることをお薦めします。 DELETE パーミッションは、テナンシおよびコンパートメント管理者にのみ許可してください。
  • インスタンスは、Oracle Cloud InfrastructureInstance Principal機能を使用して、IAMユーザーに代わってOracle Cloud Infrastructureサービス(コンピュート、ブロック・ボリューム、ネットワーキング、ロード・バランシング、オブジェクト・ストレージ)にアクセスする権限を与えることができます。 この機能を使用するには、動的グループを作成し、サービスAPIへのアクセスを許可します。 動的グループのメンバーは、インスタンスをグループに一致させるルールに基づいて定義するインスタンスです。 APIコールに署名するための短命の秘密キーは、インスタンス・メタデータ・サービス(http://169.254.169.254/opc/v1/identity/cert.pem)を介して配信され、キーは1日に複数回ローテーションされます。 インスタンスからのサービスへのアクセスの詳細については、「インスタンスからのサービスの呼び出し」を参照してください。

インスタンス・メタデータ・アクセス制御

  • インスタンス・メタデータ(http://169.254.169.254)は、カスタム・フィールドとともに、あらかじめ定義されたインスタンス情報(OCIDや表示名など)を提供します。 ダイナミック・グループ資格証明などの短命の資格証明は、インスタンス・メタデータを通じて提供できます。 インスタンスのメタデータ・アクセスは、インスタンス上の特権ユーザーのみに制限することをお薦めします。 たとえば、iptablesを使用すると、次のルールを使用して、rootなどの特権ユーザーのみにインスタンスのメタデータ・アクセスを制限できます。

    iptables -A OUTPUT -m owner ! --uid-owner root -d 169.254.169.254 -j DROP
  • インスタンスは、インスタンス・メタデータ・サービス(169.254.169.254:80)、DNS (169.254.169.254:53)、NTP (169.254.169.254:123)、カーネル・アップデート(169.254.0.3)、およびブート・ボリュームへのiSCSI接続(169.254.0.2:3260)にアクセスするためにリンク・ローカル・アドレスを使用します。、169.254.2.0/24:3260)。 iptablesなどのホスト・ベースのファイアウォールを使用して、rootユーザーだけにこれらのIPにアクセスする権限を与えることができます。 これらのOSファイアウォール・ルールが変更されていないことを確認します。

インスタンス・ネットワーク・アクセス・コントロール

  • すべてのインスタンスでセキュア・シェル(SSH)を強化します。 次の表に、SSHセキュリティの推奨事項を示します。 SSH構成オプションは、sshd_configファイル(Linuxの場合は/etc/ssh/sshd_configにあります)で構成できます。 

    セキュリティ勧告 構成sshd_config コメント
    公開キーログインのみを使用 PubkeyAuthenticationはい ~/.ssh/authorized_keysファイルのSSH公開キーを定期的に確認
    パスワード・ログインを無効にします PasswordAuthenticationいいえ パスワードbrute-force攻撃を軽減
    rootログインを無効にします PermitRootLoginいいえ リモート・ログインのroot権限を禁止
    SSHポートを非標準ポートに変更 ポート<port number> これはオプションです。 この変更によって、SSHのポート22を使用するアプリケーションが中断しないことを確認してください
  • インスタンスにアクセスして偶発的な漏洩を防ぐために使用されるセキュアなSSH秘密キー。 SSHキー・ペアの作成とキーを使用したインスタンスの構成の詳細については、「キー・ペアの作成」を参照してください。

  • VCNのネットワーク・セキュリティ・グループまたはセキュリティ・リストをメカニズムとして使用すると、認可済のIPアドレスからのインスタンス・アクセスを許可できます。 Fail2banは、ログイン試行に関連するIPアドレスをブラックリストに登録するアプリケーションです(つまり、インスタンスへの試行に失敗した回数が多すぎます)。 Fail2banはデフォルトでSSHアクセスを検査し、他のプロトコル用に構成することができます。 Fail2banの詳細については、「Fail2banメイン・ページ」を参照してください。
  • VCNのネットワーク・セキュリティ・グループおよびセキュリティ・リストに加えて、ホスト・ベースのファイアウォール(iptablesやファイアウォールなど)を使用して、ポート、プロトコル、およびパケット・タイプに関してインスタンスへのネットワーク・アクセスを制限できます。 これらのファイアウォールを使用すると、潜在的なネットワーク・セキュリティ攻撃の偵察(ポート・スキャンなど)や侵入の試みを防ぐことができます。 カスタム・ファイアウォール・ルールは、すべてのインスタンス・ブート時に構成、保存、初期化できます。 次の例は、iptablesのコマンドを示しています。

    # save iptables rules after configuration 
    sudo iptables-save > /etc/iptables/iptables.rules 
    # restore iptables rules on next reboot 
    sudo /sbin/iptables-restore < /etc/iptables.rules 
    # restart iptables after restore 
    sudo service iptables restart

インスタンス・エントロピ

ベアメタル・インスタンスとVMインスタンスの両方が、高品質かつ高スループットのエントロピ・ソースを提供します。 インスタンスにはハードウェア乱数ジェネレータのサポートがあり、その出力は乱数を生成するためにOSが使用するエントロピ・プールに供給されます。 Linuxの場合、/dev/randomは非ブロック型であり、乱数を必要とするセキュリティ・アプリケーションに使用することが推奨されています。 アプリケーションで出力を使用する前に、次のコマンドを使用して、/dev/randomによって生成された乱数のスループットと品質を確認できます。

# check sources of entropy 
sudo rngd -v 
# enable rngd, if not already 
sudo systemctl start rngd 
# verify rngd status 
sudo systemctl status rngd 
# verify /dev/random throughput and quality using rngtest 
cat /dev/random | rngtest -c 1000

ホスト・セキュリティの強化とパッチ適用

  • インスタンス上で実行されるOSイメージ(Linux、Windows)のセキュリティ強化のベースラインを確立します。 Oracle Linuxイメージのセキュリティ強化の詳細については、「Oracle Linuxサーバーを強化するためのヒント」を参照してください。 「インターネット・セキュリティ・ベンチマーク・センター」はLinuxとWindows Serverのさまざまなディストリビューションのための包括的なOSセキュリティ強化ベンチマークを提供します。
  • セキュリティ・パッチを適用してインスタンス・ソフトウェアを最新の状態に保ちます。 使用可能な最新のソフトウェア・アップデートをインスタンスに定期的に適用することをお薦めします。 Oracle Linuxでは、sudo yum updateコマンドを実行できます。 Oracle Linuxでは、yum-securityプラグインを使用して、利用可能なセキュリティ・パッチとインストールされているセキュリティ・パッチに関する情報を取得できます。 yum-securityのコマンドは以下の通りです。 2017年2月15日以降に開始されたOracle Linuxインスタンスでは、インスタンスを再起動せずにパッチを適用するためのKspliceサポートが利用できます。 Oracle Cloud InfrastructureインスタンスでKspliceを使用する方法の詳細については、「Oracle Kspliceのインストールと実行」を参照してください。

    # Install yum-security plugin
    yum install yum-plugin-security
    # Get list of security patches without installing them
    yum updateinfo list security all
    # Get list of installed security patches
    yum updateinfo list security all

インスタンスのセキュリティ・ログとモニタリング

  • さまざまなセキュリティ関連のイベントがログファイルに取り込まれます。 セキュリティの問題を検出するために、これらのログ・ファイルを定期的に確認することをお薦めします。 Oracle Linuxでは、ログファイルは/var/logにあります。 セキュリティ関連のログファイルの一部を次の表に示します。 

    ログファイルまたはディレクトリ 説明
    /var/log/secure 失敗したログインと成功したログインを示す認証ログ
    /var/log/audit 監査dは、発行されたシステム・コール、sudo試行、ユーザー・ログインなどを記録します。ausearchとaureportは、auditdログを問合せするために使用される2つのツールです
    /var/log/yum.log yumを使用してインスタンス上にインストールまたは更新されたさまざまなパッケージをリスト
    /var/log/cloud-init.log cloud-initは、インスタンス起動中に、特権ユーザーとしてユーザー提供のスクリプトを実行できます。 たとえば、SSHキーはcloud-initを使用して導入できます。 認識できないコマンドについては、cloud-initログを確認することをお薦めします。
  • ホスト・ベースの侵入検知システム(IDS)は、インスタンスに不正アクセスがないかどうかをモニターします。 OSSECとWazuh (OSSECフォーク)は、無許可のアクセス、マル・ウェア、ファイルの変更、およびセキュリティの誤った設定をモニターできる一般的なオープンソースのIDSです。 Wazuhの場合、WazuhサーバーとELKスタックはインスタンスにデプロイされ、VCNの他のインスタンスにエージェントが配置されてWazuhサーバーにログが送信されます。 結果のアラートは、Kibanaダッシュボードに表示されます。 Wazuh IDSはインスタンス上で試作されました。以下は、インスタンス上にWazuhサーバーをデプロイするための手順です(ELKバージョン5.6.3)。 WazuhエージェントのインストールとKibanaダッシュボードへのアクセスの詳細については、「Wazuhのドキュメント」を参照してください。

    #!/bin/sh
                
    echo "installing elasticsearch"
    sudo add-apt-repository ppa:webupd8team/java;
    sudo apt-get update;
    sudo apt-get install oracle-java8-installer;
                
    sudo apt-get install curl apt-transport-https
    curl -s https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - ;
    echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-5.x.list;
    sudo apt-get update;
                
    sudo apt-get install elasticsearch=5.6.3;
                
    sudo systemctl daemon-reload
    sudo systemctl enable elasticsearch.service
    sudo systemctl start elasticsearch.service
                
    curl https://raw.githubusercontent.com/wazuh/wazuh-kibana-app/2.1/server/startup/integration_files/template_file.json | curl -XPUT 'http://localhost:9200/_template/wazuh' -H 'Content-Type: application/json' -d @-
                
    curl https://raw.githubusercontent.com/wazuh/wazuh-kibana-app/2.1/server/startup/integration_files/alert_sample.json | curl -XPUT "http://localhost:9200/wazuh-a
    lerts-"`date +%Y.%m.%d`"/wazuh/sample" -H 'Content-Type: application/json' -d @-
                
    echo "installing logstash"
    sudo apt-get install logstash=1:5.6.3-1;
    sudo curl -so /etc/logstash/conf.d/01-wazuh.conf https://raw.githubusercontent.com/wazuh/wazuh/2.1/extensions/logstash/01-wazuh.conf;
    sudo curl -so /etc/logstash/wazuh-elastic5-template.json https://raw.githubusercontent.com/wazuh/wazuh/2.1/extensions/elasticsearch/wazuh-elastic5-template.json;
    sudo usermod -a -G ossec logstash;
                
    sudo systemctl daemon-reload;
    sudo systemctl enable logstash.service;
    sudo systemctl start logstash.service;
                
    echo "installing kibana"
    sudo apt-get install kibana=5.6.3;
    sudo -u kibana /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-2.1.1_5.6.3.zip;
                
    sudo systemctl daemon-reload;
    sudo systemctl enable kibana.service;
    sudo systemctl start kibana.service;

セキュリティ・ポリシーの例

以下のすべての例では、ポリシーの対象範囲はテナンシです。 ただし、コンパートメント名を指定することで、コンパートメント名を特定のコンパートメントに限定してテナンシにすることができます。

ユーザーがインスタンスを削除できるようにします

次の例では、InstanceUsers グループでインスタンスを起動できますが、削除はできません

Allow group InstanceUsers to manage instance-family in tenancy
 where request.permission!='INSTANCE_DELETE' 
Allow group InstanceUsers to use volume-family in tenancy 
Allow group InstanceUsers to use virtual-network-family in tenancy

インスタンス・コンソールを使用する機能を制限

セキュリティ・コンプライアンス上の理由から、一部の顧客は、インスタンス・コンソールをユーザーのテナンシに公開したくない場合があります。 次のポリシー例では、コンソールの作成またはコンソールからの読み取りを制限しています。

Allow group InstanceUsers to manage instance-console-connection in tenancy
 where all {request.permission!= INSTANCE_CONSOLE_CONNECTION_READ, 
            request.permission!= INSTANCE_CONSOLE_CONNECTION_CREATE}