Exposing Services in Kubernetes
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Kubernetesには、内部エンドポイントと外部エンドポイントの両方がアクセスできるようにサービスを公開するさまざまな方法があります。このKubernetesの設定は非常に重要であり、管理者が攻撃者にアクセスしてはいけないサービスへのアクセスを与える可能性があります。
K8sがサービスを公開する方法を列挙する前に、名前空間、サービス、イングレスをリストできる場合、次のコマンドを使用して公開されているすべてのものを見つけることができることを知っておいてください:
ClusterIP サービスは、デフォルト の Kubernetes サービス です。これは、クラスター内の他のアプリがアクセスできる クラスター内のサービス を提供します。外部アクセス はありません。
しかし、これは Kubernetes プロキシを使用してアクセスできます:
今、次のスキームを使用してKubernetes APIを介してサービスにアクセスできます:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
例えば、次のURLを使用できます:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
このサービスにアクセスするために:
この方法では、認証されたユーザーとして kubectl
を実行する必要があります。
すべての ClusterIP をリストします:
NodePortが利用されると、すべてのノード(仮想マシンを表す)で指定されたポートが利用可能になります。この特定のポートに向けられたトラフィックは、体系的にサービスにルーティングされます。通常、この方法は欠点があるため推奨されません。
すべてのNodePortをリストします:
NodePort仕様の例:
If you 指定しない the nodePort in the yaml (it's the port that will be opened) a port in the 範囲 30000–32767 will be used.
Exposes the Service externally using a cloud provider's load balancer. On GKE, this will spin up a Network Load Balancer that will give you a single IP address that will forward all traffic to your service. In AWS it will launch a Load Balancer.
You have to pay for a LoadBalancer per exposed service, which can be expensive.
List all LoadBalancers:
外部IPは、Load Balancerタイプのサービスによって公開され、一般的に外部クラウドプロバイダーのLoad Balancerが使用されるときに使用されます。
それらを見つけるには、EXTERNAL-IP
フィールドに値があるロードバランサーを確認してください。
外部IP(宛先IP)でクラスタに入るトラフィックは、サービスポートでサービスエンドポイントの1つにルーティングされます。externalIPs
はKubernetesによって管理されず、クラスタ管理者の責任です。
サービス仕様では、externalIPs
は任意のServiceTypes
とともに指定できます。以下の例では、"my-service
"は"80.11.12.10:80
"(externalIP:port
)でクライアントによってアクセスできます。
ドキュメントから: ExternalNameタイプのサービスは、サービスをDNS名にマッピングします。通常のセレクタ(my-service
やcassandra
など)にはマッピングしません。これらのサービスはspec.externalName
パラメータで指定します。
例えば、このサービス定義は、prod
ネームスペースのmy-service
サービスをmy.database.example.com
にマッピングします:
my-service.prod.svc.cluster.local
を調べると、クラスターDNSサービスは値my.database.example.com
のCNAME
レコードを返します。my-service
へのアクセスは他のサービスと同様に機能しますが、重要な違いはリダイレクションがDNSレベルで発生するということです。
すべてのExternalNamesをリストします:
上記のすべての例とは異なり、Ingressはサービスの一種ではありません。代わりに、複数のサービスの前に位置し、「スマートルーター」として機能します、またはクラスターへのエントリポイントです。
Ingressを使用すると、さまざまなことができます。また、異なる機能を持つ多くのタイプのIngressコントローラーがあります。
デフォルトのGKE Ingressコントローラーは、HTTP(S) Load Balancerを自動的に立ち上げます。これにより、パスベースおよびサブドメインベースのルーティングをバックエンドサービスに対して行うことができます。たとえば、foo.yourdomain.comのすべてをfooサービスに送信し、yourdomain.com/bar/パスの下のすべてをbarサービスに送信できます。
GKE上のL7 HTTP Load Balancerを持つIngressオブジェクトのYAMLは次のようになります:
すべてのイングレスをリストします:
この場合、各情報を一つずつ取得する方が、より良く読むことができます:
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、練習する:HackTricks Training GCP Red Team Expert (GRTE)