Squidで復号プロキシを立ててみた
めずらしくAnsible系以外の記事になります。
Repsonaというプロジェクト管理ツールが個人的に気に入っていて、会社でも使いたいなーと思っているのですが、会社のHTTPS復号環境だと、ログイン画面の直前でWebSocket用のJavaScriptの読み込みで失敗するようでした。
ひたすら、これが出る感じですね。 pic.twitter.com/1mi3CCX9EC
— tatematsu_san (@tk4_jj) 2020年7月12日
↑再現させた自宅での環境もこんな感じ。
Repsonaの開発者の ガッシー( @GussieTech ) さんと会話をする中で、検証環境用にHTTPS復号プロキシを簡単に立てられないかなと思い、実際に立ててみました。その作業メモを残しておきます。
環境
手順
Squidのインストール
yumコマンドでインストールを行います。
$ sudo yum -y install squid
インストール後、バージョン確認と有効になっているOptionを確認。
$ squid -v [ansible@proxy2 ~]$ squid -v Squid Cache: Version 3.5.20 Service Name: squid
以下のように、有効になっているオプションが表示されますが、このなかで赤字にしてある2点(--enable-ssl-crtd , --with-openssl)が入っていれば、HTTPS復号プロキシは利用可能です。
configure options: '--build=x86_64-redhat-linux-gnu'(略) '--enable-snmp' '--enable-ssl-crtd' '--enable-storeio=aufs,diskd,rock,ufs' '--enable-wccpv2' '--enable-esi' '--enable-ecap' '--with-aio' '--with-default-user=squid' '--with-dl' '--with-openssl' '--with-pthreads' '--disable-arch-native' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches (略)
オレオレ認証局の証明書と鍵の作成
Squidのディレクトリに移動し、オレオレ認証局の証明書と鍵を作成します。
$ cd /etc/squid $ sudo openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout secret.key -out squidCA.pem Generating a 2048 bit RSA private key ...........................................................................................................+++ ..................+++ writing new private key to 'secret.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:JP State or Province Name (full name) []:hogehoge Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:hogehoge.com Email Address []: #↑の部分は対話式で入力していきます。
結果、以下のように認証局証明書(squidCA.pem)と秘密鍵(secret.key)の作成が完了しました。
認証局証明書の取得、信頼するルートCAへのインポート
SCPなどを用いて、squidCA.pemをプロキシクライアント端末へ取得し、ブラウザの証明書ストアへインポートします。
※DER形式へのコンバートコマンドなども書いてありますが、FireFoxであれば、pemでそのままインポート可能でした。
設定→オプション→「プライバシーとセキュリティ」→「証明書」
証明書マネージャ→「インポート」
対象のpemファイルを選択し、「開く」
インポートダイアログで「この認証局によるウェブサイトの識別を信頼する」にチェックし「OK」
インポートした認証局の情報が表示されることを確認。(ここでは、Default Company Ltd)
証明書ファイルの所有者・権限の変更
以下コマンドを入力し、証明書ファイルをsquid:squidの所有権に変更します。
$ sudo chown squid:squid squidCA.pem $ sudo chmod 400 squidCA.pem
証明書キャッシュの作成と初期化、所有権の変更
以下コマンドで、証明書キャッシュの作成と初期化を行います。
なお、参考サイトで記載しているカスペルスキーさんのところでは「/usr/lib/squid/ssl_crtd 」となっていますが、最近の環境では、下記のように「/usr/lib64/squid/ssl_crtd」に修正する必要があると思います。
$ sudo mkdir -p /var/lib/squid $ sudo /usr/lib64/squid/ssl_crtd -c -s /var/lib/squid/ssl_db Initialization SSL db... Done $ sudo chown -R squid:squid /var/lib/squid
/etc/squid/squid.confの修正
以下の箇所の変更を行います。
# Squid normally listens to port 3128 #http_port 3128 #コメントアウト http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/squidCA.pem key=/etc/squid/secret.key #追加 sslcrtd_program /usr/lib64/squid/ssl_crtd -s /var/lib/squid/ssl_db -M 4MB #追加 sslcrtd_children 5 #追加 ssl_bump server-first all #追加 sslproxy_cert_error deny all #追加
firewalldの設定追加
Squid用のTCP3128について、着信を許可します。
$ sudo firewall-cmd --add-port=3128/tcp --zone=public --permanent success $ sudo firewall-cmd --reload success $ sudo firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens192 sources: services: dhcpv6-client ssh ports: 3128/tcp #これが出てればOK protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
SELINUXのPermissive
Enforceのままだと証明書キャッシュの生成に失敗するので、とりあえずPermissiveにします。(怒られそう)
$ sudo setenforce permissive
サービスの起動と動作確認
systemctlコマンドでsquidサービスを起動します。
$ sudo systemctl start squid
クライアントのプロキシ設定と動作確認
プロキシを以下のように設定。
以下のように、HTTPSサイトにアクセスしたときに証明書の認証局が書き換わっており、SquidのアクセスログにHTTPSでアクセスした詳細なパス情報が記録されていればOK。
$ sudo cat /var/log/squid/access.log | grep news.yahoo 1594645647.847 78 192.168.10.243 TAG_NONE/200 0 CONNECT news.yahoo.co.jp:443 - HIER_DIRECT/182.22.25.124 - 1594645647.946 91 192.168.10.243 TCP_MISS/200 29546 GET https://news.yahoo.co.jp/pickup/6365311 - HIER_DIRECT/182.22.25.124 text/html 1594645649.292 56 192.168.10.243 TCP_MISS/200 8623 GET https://news.yahoo.co.jp/comment/plugin/v1/short/? - HIER_DIRECT/182.22.25.124 text/html
上手く行かない時は…
だいたい、/var/log/squid/cache.logか、/var/log/messagesに理由が書いてあります。
- 初期化されていない系→案内通りにやってみる。だめならSELINUX設定見直し。
Uninitialized SSL certificate database directory: /var/lib/squid/ssl_db. To initialize, run "ssl_crtd -c -s /var/lib/squid/ssl_db".
- 証明書が有効でない系エラーの場合→squid.confと、証明書ファイルのアクセス権の見直し。
まとめ
大分雑な環境ですが、こんな形でSquidでHTTPS復号を行うプロキシサーバを立てることができました。
実運用考えた場合、squidのスタートアップだけでなく、SELINUXもConfigいじったりしないといけませんし、復号除外用のACLが書けるような設定にしたり、プロセス数をチューニングしたりと色々考える必要がありますので、そのあたりは適宜調整していただければ。
何かのお役に立てば幸いです。
今度はこれ、Playbook化しよっと。
参考にさせていただいたサイト
AnsibleでMineMeldをインストールしてみた
皆さんは、OSINTというものをご存じでしょうか?
OSINTは「Open Source Intelligence」の略で、「一般に公開されている脅威情報」ととらえていただければよいかなと思います。
本日は、そのOSINT情報を集めて、好きな形で出力してくれるツールとして、MineMeldというOSSをAnsibleを使ってインストールしてみます。
Ansible関連の実践記事一覧はこちら。
目的
- Minemeldが仕事でつかえるかどうか判断するため
OSINTの情報を起点にAnsibleをHubにして、セキュリティ製品への設定を自動化したいなと考えています。
MineMeldとは?
セキュリティ機能も活用可能なファイアウォールを出されているPalo Alto NetworksさんがOSSで提供する、OSINT情報蓄積・出力用ツールです。
同様のツールで「MISP」というものもあります。
【参考】MISP公式サイト
公式サイト
MineMeldの公式サイトは以下URLです。
公式インストール手順
以下URLのWikiに記載されています。
User's Guide · PaloAltoNetworks/minemeld Wiki · GitHub
今回は、ソースコードからインストールしますので、以下URLの情報を参考に作業をしています。
GitHub - PaloAltoNetworks/minemeld-ansible: Ansible playbook for installing MineMeld on Linux
環境
全部仮想サーバ、同一ネットワーク内です。
Minemeldをインストールする対象のサーバは、ansibleユーザをwheelに入れてPWなしでsudoできる状態にしたのみです。
作成したPlaybook
公式のインストール手順を参考に、以下のようなPlaybookを作成しました。
install_minemeld.yml --- - hosts: all gather_facts: no become: yes vars: user_name: ansible tasks: - name: Yum update yum: name: "*" state: latest - name: Install packages yum: state: latest name: - wget - gcc - git - python-devel - libffi-devel - openssl-devel - zlib-devel - sqlite-devel - bzip2-devel - name: Get bootstrap get_url: url: https://bootstrap.pypa.io/get-pip.py dest: /home/{{ user_name }}/ - name: Exec bootstrap file command: cmd: python get-pip.py - name: Install ansible pip: name: ansible state: latest - name: Git clone Minemeld git: repo: https://github.com/PaloAltoNetworks/minemeld-ansible.git dest: /$HOME/minemeld-ansible - name: Play ansible playbook command: cmd: ansible-playbook -i 127.0.0.1 /$HOME/minemeld-ansible/local.yml # ↑ここを改善できないものか… - name: Usergroup change user: name: "{{ user_name }}" append: yes groups: minemeld - name: reboot reboot:
インストール手順の中に、MineMeldインストール用のPlaybookをGithubからクローンしてきて、対象サーバ上でPlaybookを実行する、というような項目があります。 Playbookでは、SELINUX用の設定もしっかり実施してくれます。
全体の実行時間では、その項目が最も長くなります。(10分くらい?)
理想はAnsible実行サーバ側からそのタスクの状況をモニタリングできるとよいのですが…include_tasksとかでやろうと思っても上手く行きませんでした。
1個上のダウンロード先でdelegate_toでlocalhostを指定してAnsible実行ホスト側にPlaybookを落としてきても、そのPlaybookの一番上に「hosts: localhost 」が入っているためです。変数指定で上書きとかできるんだっけか…
良いアイディアをお持ちの方は教えていただけると嬉しいです。
インストール用のPlaybookは、以下に公開されています。
作業結果
無事、インストールが完了しました。
インストール実施確認
https://<minemeld_ipaddress>/
httpでアクセスしてもリダイレクトしてくれます。
初期のユーザ名は以下の通り。
項目 | 値 |
---|---|
user | admin |
password | minemeld |
ログイン情報を入力し、ログインしてみます。
ちゃんと動いていることが確認できました。
今後
このMineMeldを使って、セキュリティ製品へのブロックリスト投入などを自動化する検証を進めていこうと思います。
本当はインストール実施確認とかまでPlaybook化できるといいんですよね。もうちょっと考えよ…
Ansible Night オンライン!2020.06に参加しました。
先日開催された、Ansible Night オンライン2020に参加しました。
その際の資料や感想について記録したいと思います。
「Ansibleとドキュメント〜公式ドキュメントにあるエモい表現〜」RedHatさん
資料
感想
RedHatの燃脇さん、齋藤さん、中村さんが、Ansible Engineのドキュメントのエモい表現を語る!ということで、いろいろとぶっちゃけトークが聞けました。
曰く、「Ansibleのドキュメントは稀に見るフリーダムさ」なんだそうです。
実装されてもいない、幻の夢機能が記載されてた時期があったとか…
資料にも記載がありますが、「ヒント、ヒント」なんて、確かに他では目にしないですね…
なお、翻訳チームのおかげで、Ansible 2.9のドキュメントが「日本語化」されたそうです!!素晴らしい!今後ともよろしくお願いいたします!
これでますますAnsibleに触れる人が増えることを祈っております。
アンケートの話題のときの、齋藤さんの「そもそもドキュメントみない?ああ、ソースコード読んでるからドキュメントいらないってことですね」にはさすがに吹きました。
「AnsibleでNW自動化を進める人に伝えたいこと」by @usagi_automate さん
資料
感想
エーピーコミュニケーションズの三枝さんの、NWモジュールを使う上でのサーバモジュールとの違いについて、詳細に解説頂きました。
サーバ系のモジュールと異なり、ネットワーク系モジュールはモジュールの実行がAnsible実行ノード上となり、pingモジュールは疎通確認にならないなど、NWモジュールを触り始める際の要注意点や、冪等性に関する落とし穴(CLIだとスペースを補完してくれるが、冪等性的には異なる設定となるため毎回Changedになる)などをご紹介いただきました。
私もNW屋さんなので、Ansible触り始めのときには疎通確認にも苦労した覚えがあります。この資料を見て少しでも多くのNW屋さんがAnsibleに親しんでもらえればうれしいですね。
他作Playbookを実行することになって読みにくかった話 by @dayamaguchi1さん
資料
感想
エイチームの山口さんの、タイトルから不安を感じるLTです。
山口さんは、一般男性氏の元同僚で現同僚さんとのこと。仲良しか!
元同僚、現同僚です
— 一般男性 a.k.a 陽だまりの草原 (@aabbss757) 2020年6月23日
Ansibleにおけるいい点で「誰でも同じ作業ができる」というのがありますが、そんなAnsibleでも条件分岐などでよくわからない条件が設定された結果、なんで動くかよくわからないという悲しいPlaybookに頭を悩まされたそうです。
私は一人でAnsibleやってるので、引継ぎとかうらやましい限りだったりするのですが、他のスクリプトでも条件分岐はちょいちょいハマってますので、Playbookを自作するときはわかりやすさを心掛けたいなと肝に銘じました。
Ansible roleのCIをGitHub Actionsで行う by @ma2muratomonoriさん
資料
感想
普段からTwitterでもAnsibleを用いたCI/CDについて、様々な見解をつぶやかれている@ma2muratomonoriさんの、GitHub Actionsを用いたCIに関するLTでした。
CentOS7に対してcowsayをインストールする際の実際のサンプルコードを用いたCIのイメージを詳細に解説していただきました。
複数のVMが並列で起動しテストを実施する例の中で利用されたAnsibleは最新βの2.10.0b1とansible-base!!
バージョン違いも並列で簡単にチェック対象にできるというのは、やはりIaCの強味だなあと改めて思いました。
なお、その後AnsibleとMoleculeについてのこんなツイートもされていました。またお勉強させていただきます!
ふと思ったがMolecule簡単だとAnsible Nightでは言ったが
— matsumuratomonori (@ma2muratomonori) 2020年6月24日
自分の場合はYouTubeのハンズオン動画を3本ほど観て次の3時間でGitHub Actionsに入れられたのだが
そもそもの前提が
- 英語の動画でも観て理解出来る
- GitHub Actionsが分かる
なので当てはまる人がそもそも少ないのかも知れない…
Kubernetesクラスタ構築を例に既存の作業をAnsible化するポイント by @zaki_hmkcさん
資料
感想
やきうの人のLTでした。
kubeadmという、K8S公式インストーラの一つを用いたK8Sクラスタ構築自動化に関するPlaybookの紹介と、実際の構築におけるkubeadmのドキュメント上の要注意ポイントなどを解説していただきました。
実際のPlaybookはこちら。(↓)
業務でK8S触る予定ないのですが、簡単に構築できるなら少し試してみようかな…?
センセイ、よろしく!!!(ゝ∀・*)
やきうの人です←
— z a k i (@zaki_hmkc) 2020年6月25日
ちなみに発表に入らなかった話で、kubeadmでk8s構築を自動化すると、CentOS7インストール直後のVMからだと、1master/2workerでウチの一般的な回線で6~10分くらいで構築できます(・∀・)
» Ansible Night オンライン!2020.06に参加しました。 - てんこ https://t.co/lxb3EhZbcO
AWXのプロジェクトを自動同期させたい by @nnstt1 さん
資料
感想
Twitter上でもよくやり取りをさせていただいている、ののしさんの初LT!
「Ansibleユーザ会への物理参加」という、地方民にとてもわかりみの深い目標を掲げてらっしゃいました。私も地方なので初参加のときはテンションあがりました!
内容は、GitLabとAWXを連携させた自動同期ということで、Moleculeまで既に使いこなされており、自分もNWだけでチマチマ遊んでいる場合ではないなあと改めてMoleculeの学習の必要性を感じました。
いつか現地で自動化Tシャツで集合写真撮りましょうね!!
Moleculeのdelegatedドライバ + OpenStackでAnsibleのテストを行う by @miyamadoKLさん
資料
www.slideshare.net
感想
最後はマイクロアドの長田さんの、Moleculeのdelegatedドライバに関するLTでした。
Moleculeのテストを、Dockerコンテナ以外のOpenStackやネットワーク機器などの環境で利用する場合に使う機能とのことで、仮想アプライアンスが用意されないような機器を触っている私も、身に着ける必要がありそうな内容でした…!
とはいえ、現時点ではMoleculeあまりにも無知なので改めて学習してから復習させていただこうと思います!
全般を通して
Molecule祭りだったなーという印象です。昨年のRedhatさんのイベントで「皆さん、Molecule使ってますよね?」と言われてからも全く手を付けていませんでしたが、いい加減覚えていかないといけないなあとヒシヒシと感じました。
ただ、あんまり急いでもアレなのでマイペースで学習を進めていきたいなあと思います。
皆さん結構Ansible Automatesからのハシゴをされていたような感じで、ほとんど聞けなかった私としてはとてもうらやましかったです。(Automatesの内容については、後日配信されるアーカイブ動画などをまた視聴させていただきます。)
ちなみに、ツイートランキングではなんと1位を頂いたそうです。あまり内容のないツイートばかりで申し訳ない…^^;
Ansible Night オンライン! 2020.06のツイート集計結果のTOP10の方々です!!@tk4_jj@mopoki2696@anikinthos@xzr_tw@answer_d@ZOLLVEREIN1213@maguro_infra@yassan168@Y0u281@yuta_k0911
— 日常系インフラ自動化もふもふおじさん@Ansible x VMware (@sky_jokerxx) 2020年6月23日
AnsibleJPボスへDMしていただければ良い物がもらえると思います!!
AnsibleJPボス: @fideleruuth
Ansible飯
Ansible Nightオンラインの後、ZoomでのリモートAnsible飯が開催され、自動化Tシャツ+顔出しで参加をさせていただきました!
途中、よこちさんのZoom画像をそのまま背景にしたりとZoomの背景をいろいろといじって遊んでいました。いたずらしてすみません。
ほぼほぼ自己紹介で終わってしまいましたが、これまでお会いしたことのある方、はじめましての方も含めて、様々な社外のエンジニアの方とリモートでも交流できるのはやはり楽しいなあと感じました。
コロナ禍で年内中は厳しいと思いますが、また落ち着いたら恵比寿で開催していただいて、その際には現地参加で直接顔を合わせたり、LTをしたいなと思いました。
それにむけて、もっとつよつよにならねば…!
ansible 2.10.0b1を #tekunabe で触ってみたメモ
最近毎週土曜日に #tekunabe でよこちさんが配信されている Youtubeを見ているのですが、本日は特別に日曜日にも開催されました。
テーマは「ansible 2.10.0 b1」です。ベータ版の最新版です。
配信に合わせて自身でも操作していましたが、いろいろと分かったことがあります。
既にまとめられているサイトも多いと思いますが、自分なりに理解した内容をまとめてみます。
配信者のよこちさんの当日のふりかえり記事はこちら。
[Ansible] 「つまずき Ansible 【Part7】Ansible 2.10.0b1 でずっこける」ふりかえり - てくなべ (tekunabe)
- 導入方法
- プラグインやモジュールの分離
- モジュールがどこに移行されたかを調べるには
- これまでのPlaybookとの互換性は?
- collectionでインストールするものをオフラインで使うには?
- 正式リリースは?
- まとめ
- おまけ
導入方法
pip で以下のようにインストールします。
pip install ansible-base
結果、以下のようにansible 2.10.0b1がインストールされました。
$ ansible --version ansible 2.10.0b1 config file = /home/ansible/ansible-study/ansible.cfg configured module search path = ['/home/ansible/a10-ansible/a10_ansible/library'] ansible python module location = /home/ansible/ansible-study/ansible210b1/lib64/python3.6/site-packages/ansible executable location = /home/ansible/ansible-study/ansible210b1/bin/ansible python version = 3.6.8 (default, Aug 7 2019, 17:28:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
プラグインやモジュールの分離
イメージとしては、以下のようになるようです。
上記のように、これまでAnsibleをインストールするだけで使えていたモジュールも、モノによっては別途ansible-galaxyコマンドでCollectionインストールする必要が出てきました。
ansible-baseだけのインストールで入るモジュールの数は、以下のようにたった68個…
Ansible 2.10 のインパクトがこれで伝わりますでしょうか・・ pic.twitter.com/nrGYwmpNOh
— よこち(yokochi) (@akira6592) 2020年6月18日
配信の際には、debugメッセージの出力をyaml形式に変えるコールバックプラグインもansible-baseだけでは利用できず、「community.general」というcollectionを導入することで利用することができるようになっていました。
このあたり、2.9のリリースの頃からcollectionへの移行の話は出ていましたが、本格的に実装されたということですね。
collectionのインストール方法は以下の通り。
ansible-galaxy collection install <collection名>
※6/22追記
よこちさんもブログに追記していただいていますが、どうやらpip install ansibleであれば、これまで同様、同梱モジュール系も含まれるようです。
コンテナのOSみたいに、最小パッケージとしての「ansible-base」という単位が増えたという捉え方をするのが良いのかもしれませんね。
修正してみたイメージ図がこちら。
モジュールがどこに移行されたかを調べるには
よこちさんが配信の中でも紹介されていましたが、以下のQiitaの記事に非常にわかりやすくまとめていただいていました。
これは手動で追うのは大変ですね…
ただ、下記にも記載したものを一覧表代わりに使うことはできそうです。
これまでのPlaybookとの互換性は?
上記Qiitaの記事内でも紹介されていますが、ansible_builtin_runtime というものが組み込まれており、現在のところ、これまでのモジュールの指定を新しい指定に変換してくれる機構が動作するため、Playbook自体の修正は必須ではないようです。
ansible/ansible_builtin_runtime.yml at devel · ansible/ansible · GitHub
ただ、あくまでもPlaybookに関してだけであり、モジュールやプラグインなどは別途導入する必要があります。
正式には、collectionで入れたものは、FQCNという書式で書く必要があります。
例)fortinet.fortios.モジュール名
互換性の機能がもし無くなるような場合、Playbook修正祭りが発生しますね…。
今後どうなるかはわからない点なので、要注意ポイントだと思います。
collectionでインストールするものをオフラインで使うには?
さいとうさんが素敵なナレッジをくださいました。ありがとうございます!!
2.10.0ではansible-galaxy collection download <COLLECTION_NAME>でcollectionsのアーカイブをダウンロードできるんですよ。同時に作られるrequirements.ymlとセットでオフラインホストに持っていってansible-galaxy collection install -r requirements.ymlしてやれば展開され手使えます
— SAITO Hideki (@saito_hideki) 2020年6月21日
なるほど、オプションでdownloadってやるとアーカイブでダウンロードできて、requirements.ymlとセットで活用すると…
これならオフラインでもだいぶ楽に展開できそうです。
正式リリースは?
2020年8月頃が予定されているとのこと。
今のうちに準備をしておいたほうがよさそうですね…
まとめ
- 2.10から本格的にcollectionの利用が始まる
- 今のうちにansible-galaxyコマンドに親しんでおいたほうが良さそう
- Playbookの修正は必須ではない
- モジュールやプラグインの多くは別途インストールする必要が出てきた
- オフライン用のアーカイブオプションが存在する
どなたかの理解の一助になれば幸いです。
おまけ
配信中、少しだけ遊んでた成果がこちら。
ansible完全に理解したてんこさん pic.twitter.com/T3rW1edbLW
— tatematsu_san (@tk4_jj) 2020年6月21日
てんこ可愛いよてんこ