Kubernetesのヒントとコツ:開発サイトへのアクセス

開発者と開発者がKubernetesで日々の作業をしやすくする方法に関するハウツー記事シリーズを続けます。 それらはすべて、クライアントからの問題を解決した経験から収集され、時間の経過とともに改善されますが、それでも理想的であると主張していません。









今回は、条件付きで1つのトピック、つまり開発環境へのユーザーアクセスに関連する2つのトピックを検討します。



1.不要なユーザーからのdev-circuitをどのように閉じますか?



検索ボットまたは非常にサードパーティの人々がそこに到達できないように、基本的な認証またはホワイトリストの背後にある開発回路全体(数十/数百のアプリケーション)を閉じるタスクにしばしば直面します。



通常、アクセスを制限するには、各イングレスとアプリケーションが基本認証の個別のシークレットを作成する必要があります。 多数のアプリケーションで入力する場合、それらの管理は非常に問題があります。 そのため、一元化されたアクセス制御を編成しました。



これを行うために、nginxはこのタイプの構成で作成されました。



location / { satisfy any; auth_basic "Authentication or whitelist!"; auth_basic_user_file /etc/nginx/htpasswd/htpasswd; allow 10.0.0.0/8; allow 175.28.12.2/32; deny all; try_files FAKE_NON_EXISTENT @return200; } location @return200 { return 200 Ok; }
      
      





さらにアプリケーションのイングレスで、注釈を追加するだけです:



ingress.kubernetes.io/auth-url: "http://dev-auth.dev-auth-infra.svc.cluster.local"







したがって、アプリケーションにアクセスすると、リクエストはdev-auth



に送られ、正しい基本認証が入力されているか、クライアントがホワイトリストに登録されているかがチェックされます。 条件の1つが満たされると、要求が確認され、アプリケーションに渡されます。







このようなサービスを使用する場合は、1つのリポジトリで十分であり、そこにすべてのアクセスのリストが保存され、「単一の認証センター」を簡単に構成できます。 新しいアプリケーションへの配布は、基本的な注釈を追加することで行われます。



2.開発環境でKubernetes内のアプリケーションへのアクセスを提供するにはどうすればよいですか?



... Redis、RabbitMQ、PostgreSQL、またはXdebugのお気に入りのPHP開発者になります。



非常に多くの場合、アプリケーションをKubernetesに変換する場合、セキュリティを強化するために、外部からのアクセスを完全にブロックする必要があります。 そして、データベースやXdebugに「IDEを使用する」ことに慣れている開発者は、深刻な問題に直面します。



この問題を解決するために、KubernetesクラスターでVPNを直接使用します。 一般的なスキームは、K8sで実行されているVPNサーバーに接続するときに、OpenVPN構成ファイルで、K8sにも存在するDNSサーバーのアドレスをプッシュするように見えます。 OpenVPNは、Kubernetes内のリソースを要求すると、最初にKubernetes DNSサーバーに移動するように、たとえばredis.production.svc.cluster.local



サービスのアドレスの背後にVPNを構成します。 KubernetesのDNSはそれを10.244.1.15に解決し、このIPアドレスのリクエストはOpenVPNを介してKubernetesクラスターに直接送られます。



このソリューションの運用中に、私たちはそれを繰り返し拡張することに成功しました。 特に:



  1. VPNへのアクセスのアカウンティングのためのシンプルで適切な(この場合) 管理パネルが見つからなかったため、独自のシンプルなインターフェイスを作成する必要がありました- 公式のグラフは、証明書を発行するためのコンソールコマンドを起動するオプションのみを提供します。



    結果の管理パネルDocker Hubを参照)は非常に禁欲的です。





    新しいユーザーを作成するか、古い証明書を取り消すことができます。





    このクライアントの設定も確認できます。



  2. GitLabのユーザーに基づいてVPNに承認を追加しました 。ここで、パスワードがチェックされ、ユーザーがGitLabでアクティブかどうかが確認されます。 これは、クライアントがGitLabのみに基づいて開発者VPNに接続でき、追加の管理者を使用せずに接続できるユーザーを管理する場合です-ある意味では、「貧しい人々のためのSSO」です。 基礎として、彼らはすでに述べた既製のチャートを取りました



    これを行うために、ログインとパスワードを使用してユーザーをOpenVPNに接続するときに、GitLabデータベース内のハッシュを比較し、そのステータス(アクティブかどうか)をチェックするPythonスクリプトを作成しました。







    スクリプト自体は次のとおりです。



     #!/usr/bin/env python3 # pip3 install psycopg2-binary bcrypt import bcrypt import sys import os import psycopg2 import yaml with open("/etc/openvpn/setup/config.yaml", 'r') as ymlfile: cfg = yaml.load(ymlfile) def get_user_info(username=''): try: connect_str = "dbname=%s user=%s host=%s password=%s" % (cfg['db'], cfg['user'], cfg['host'], cfg['pass']) # use our connection values to establish a connection conn = psycopg2.connect(connect_str) # create a psycopg2 cursor that can execute queries cursor = conn.cursor() # create a new table with a single column called "name" cursor.execute("""SELECT encrypted_password,state FROM users WHERE username='%s';""" % username) # run a SELECT statement - no data in there, but we can try it rows = cursor.fetchall() print(rows) return(rows[0]) except Exception as e: print("Uh oh, can't connect. Invalid dbname, user or password?") print(e) def check_user_auth(): username = os.environ['username'] password = bytes(os.environ['password'], 'utf-8') # hashed = bcrypt.hashpw(password, bcrypt.gensalt()) user_info = get_user_info(username=username) user_encrypted_password = bytes(user_info[0], 'utf-8') user_state = True if user_info[1] == 'active' else False if bcrypt.checkpw(password, user_encrypted_password) and user_state: print("It matches!") sys.exit(0) else: print("It does not match :(") sys.exit(1) def main(): check_user_auth() if __name__ == '__main__': main()
          
          





    そして、OpenVPN configで次を指定するだけです:



    auth-user-pass-verify /etc/openvpn/auth-user.py via-env

    script-security 3

    client-cert-not-required








    したがって、従業員がクライアントを辞めた場合、GitLabで従業員を非アクティブ化するだけで、その後は彼はVPNに接続できなくなります。


結論の代わりに



Kubernetes操作用の実用的なFlantレシピを含む一連の記事の続きでは、特定のタスクの個々のノードを強調表示する(なぜ、どのように?)などのトピックを取り上げ、重い負荷の下でコンテナーで実行されるphp-fpm / gunicornなどのサービスをセットアップします。 アップデートを見逃さないように、ブログを購読してください!



PS



その他のK8sのヒントとトリックのサイクル:





ブログもご覧ください。






All Articles