DockerのFreeIPAでの集中ユーザー認証管理システム

HabréでのDockerの人気をきっかけに、Dockerに関するコメントでいくつかの議論に参加した後、Linuxマシンのクラスターに対して集中認証を構成する最近の必要性に関連して、私は短いメモを書くことにしました。 ここでは、私個人の意見として、Dockerを小さなプライベートタスクに使用した例を鮮やかに示します。



ちなみに、FreeIPA WebUI( 公式デモ )(クリック可能)に見えます:







FreeIPAを使用して解決したいタスク:

  1. 個々のサーバーではなく、ユーザーアカウントを一元的に作成/変更/削除する機能を持っている
  2. sudoのための集中製錬
  3. 後でVPN認証をこのシステムに接続すると、他の内部オフィスサービスができるようになります


はい、私たちのケースで最も可能性の高いFreeIPAは、スズメの大砲でのショットですが、一方で、何かが他の人には見えません。 私はそのようなオプションを検討しました:NIS(私の意見では、彼は長い間休暇をとるべきです)、OpenLDAP + ... + ...(あまりフレンドリーではなく、結果としてFreeIPAにはLDAPがありますが、直接対処する必要はありません)、ここでリストは終了しますが、他には何も見つかりませんでした。



それでは始めましょう!



サーバーのセットアップ



使用されているテクノロジーのリスト:





FreeIPAは、RedHat製品であるという事実により、CentOSおよびFedoraに自然にうまく展開でき、他のディストリビューションには事実上展開しません。 (私は実際に目標を設定しなかったので、どこかに指示があるかもしれませんが、FreeIPAサーバー用のDebian / Ubuntuにはパッケージがありませんが、 freeipa-client



クライアントパッケージがありますが、それについては後で詳しく説明します。)




この事実は決して私を動揺させることはありませんでしたが、逆に、私にインスピレーションを与えました! これは、Debian / Ubuntu / Gentoo / etcサーバー上でのDockerにとって理想的なタスクです。 つまり、基本的なFedoraイメージを取得し、必要なパッケージをそこに置き、すべてをヒープに入れて実行できますが公式のDocker freeipa-serverイメージは私にとってさらに楽しいニュースになりました(クライアントもありますが、Ubuntuのクライアントのオプションに興味がありました、そのため、Dockerでubuntuイメージを実行し、最初からプロセスをデバッグするためにシミュレートし、最初からすばやく開始しました)。



一般に、freeipa-serverを起動しても問題は発生せず、すべてがDockerイメージのドキュメントに準拠しています。



  1. 再起動後に残す必要があるFreeIPA構成のイメージにマウントされるディレクトリを作成します(ドキュメントでは/var/lib/ipa-data/



    を使用することを推奨していますが、システムを詰まらせたくないので/opt/



    ):

     $ sudo mkdir -p /opt/dockers/freeipa-data
          
          





  2. freeipa-serverのインストール時に使用されるオプションを含むファイルを追加します。

     $ sudo tee /opt/dockers/freeipa-data/ipa-server-install-options --ds-password=The-directory-server-password --admin-password=The-admin-password
          
          





  3. 開始します(何をする必要があるかは明らかですが、ドックには十分なポート転送がありません。ドックがパーティションをpostfixに接続する必要があると言っていることにも注意してください:Z:rw



    、しかし、SELinuxがない場合は、このオプションが必要です不要( grosswsに感謝)):

     $ docker run \ --name freeipa-server-test \ -it \ --rm \ --hostname freeipa.example.test \ --volume /opt/dockers/freeipa-data:/data \ --publish "443:443" \ --publish "389:389" \ --publish "636:636" \ --publish "88:88" \ --publish "88:88/udp" \ --publish "464:464" \ --publish "464:464/udp" \ adelton/freeipa-server
          
          





  4. 短いインストールの後、 bash



    が親切に提供されます-これで、FreeIPA Serverのインストールと設定はおおむね完了しました。 freeipa.example.testを/ etc / hostsで自分に追加し、 https://freeipa.example.test/にアクセスして 、adminとしてログインし、ユーザーを作成できます。


FreeIPAは、そのイメージで、バインド(DNS)を含むサービスの動物園全体を調達しました。バインド(DNS)は必要に応じて設定しました(他のDNSで繰り返すことはほとんど不可能な魔法)。 FreeIPAクライアントには、このDNSにアクセスできることが期待されます。これは、フェールオーバーを巧妙な方法で処理する方法をまだ知っていますが、このような場合-すべて1つのDockerイメージで、このようなフェールオーバーの利点は実際にはわかりません。 しかし、私は議論に行かず、FreeIPA開発者の希望を考慮しました(ちなみに、これはKerberosの機能です。結局、FreeIPAは単に多くのパッケージを組み合わせているだけです)。



だから、私はDNSについて何を話しているのですか? クラスター内にDNSが必要でしたが、FreeIPAコンテナー内のバインドには絶対に入りたくありませんでした。 したがって、実績のあるソリューションDnsmasqを使用することにしました。 Docker Hubには、 Alpine Linux -6MBに基づく最小限のDnsmasqイメージがあります。



ここに私がそれを準備した方法があります:

  1. 構成用のディレクトリを作成しました:

     $ sudo mkdir -p /opt/dockers/dnsmasq.d
          
          





  2. そこにdnsmasq構成を追加しました:

     $ sudo tee /opt/dockers/dnsmasq.d/dnsmasq.conf address=/freeipa.example.test/10.12.0.172 address=/server00.example.test/10.12.0.172 address=/server01.example.test/10.12.0.173 address=/server02.example.test/10.12.0.174
          
          





  3. 開始します(DNSは53 / tcpおよび53 / udpポートで動作するため、それらをconfigフォルダーに転送します):

     $ docker run \ --name dnsmasq-test \ --rm \ --publish 53:53 \ --publish 53:53/udp \ --cap-add NET_ADMIN \ --volume /opt/dockers/dnsmasq.d:/etc/dnsmasq.d \ --entrypoint /bin/sh \ andyshinn/dnsmasq \ -c '/usr/sbin/dnsmasq -k -h --conf-dir /etc/dnsmasq.d/'
          
          





  4. 動作を確認します。

     $ nslookup server00.example.test 127.0.0.1
          
          





合計で、1つのコンテナーにFreeIPAサーバーがあり、別のコンテナーにDnsmasqがあります。 ところで、ご覧のとおり、DnsmasqはまだFreeIPAのバインドDNSサーバーと対話していません。



次に、これら2つのサービスを1つのdocker-compose.yml



にリンクしました。

docker-compose.yml
 dnsmasq: image: andyshinn/dnsmasq ports: - "53:53" - "53:53/udp" cap_add: - NET_ADMIN links: - freeipa volumes: - "/opt/dockers/dnsmasq.d:/etc/dnsmasq.d" entrypoint: ["/bin/sh", "-c", "/usr/sbin/dnsmasq -k -h --conf-dir /etc/dnsmasq.d/ -S /example.test/`getent hosts freeipa | cut -f1 -d' '`"] freeipa: image: adelton/freeipa-server hostname: freeipa.example.test ports: - "443:443" - "389:389" - "636:636" - "88:88" - "88:88/udp" - "464:464" - "464:464/udp" cap_add: - NET_ADMIN volumes: - "/opt/dockers/freeipa-data:/data"
      
      





dnsmasqコマンドの追加オプションを使用すると、ちょっとした魔法に気付くかもしれません。このオプションは、要求を* .example.testにリダイレクトして、freeipaコンテナにインストールされたDNSをバインドします。



この特定のケースでのDocker Composeの利便性は、その構成がdocker run



bashスクリプトよりも読みやすいことです。 そして、すぐにうまくやる方がいいです。 docker-compose.yml



を保存して実行します:

 $ docker-compose up -d
      
      





Cサーバーがついに完成しました。



顧客設定



ここに私は3つのチームで解決策を持っています:)



  1. リストの最初が完全修飾ドメイン名(FQDN)になるように、/ etc / hostsを修正する必要があります。

     127.0.1.1 server00.example.test server00
          
          





  2. DNSを( /etc/network/interfaces



    または/etc/resolvconf/resolv.conf.d/head



    を介して)構成して、 /etc/network/interfaces



    /etc/resolvconf/resolv.conf.d/head



    に次の行が表示されるようにします。

     nameserver 10.12.0.172 search example.test
          
          





  3. そして、次のコマンドでFreeIPAの管理者パスワードを変更したら、実行できます。

     $ sudo bash -c 'bash -c "cat > /usr/share/pam-configs/mkhomedir <<EOF Name: activate mkhomedir Default: yes Priority: 900 Session-Type: Additional Session: required pam_mkhomedir.so umask=0022 skel=/etc/skel EOF" && DEBIAN_FRONTEND=noninteractive apt-get install -y freeipa-client && ipa-client-install -U -N -p admin -w The-admin-password && sed -i "s/services = .*/services = nss, pam, ssh, sudo/" /etc/sssd/sssd.conf && restart sssd && restart ssh'
          
          





    ここでは、ホームディレクトリを自動的に作成するPAMモジュールが追加され、freeipa-clientがインストールされ、ipa-clientがインストールを開始し、sudoサービスがsssd.confに追加され、sssdとsshがリロードされます。


以上で、このホストでsu / sudo / sshを実行できるようになりました。ユーザーは最初のログインでパスワードの変更を強制され、新しいホストの最初のディレクトリが/etc/skel



からユーザー用に自動的に作成されます。



結論



Dockerは、あらゆるインフラストラクチャでの複雑なプロジェクトの展開を簡素化できます。 Dockerには多くの用途がありますが、その1つにすぎません。



将来的には、Dockerに統合されたリソース制限(CPU、RAM)を集中的に使用する別のプロジェクトについて書きます。



All Articles