DockerコンテナのXアプリを利用する方法
なんだかやけに長い説明ばかり検索に引っかかったので書きました。
Linuxのローカル環境でDockerコンテナ内のXアプリ(GUIアプリ)を利用するには
$ xhost localhost +
を実行した後に
$ docker run --rm --net host -e "DISPLAY" container_image_name x_app_binary_path
とすれば良いです。
もっと読むなんだかやけに長い説明ばかり検索に引っかかったので書きました。
Linuxのローカル環境でDockerコンテナ内のXアプリ(GUIアプリ)を利用するには
$ xhost localhost +
を実行した後に
$ docker run --rm --net host -e "DISPLAY" container_image_name x_app_binary_path
とすれば良いです。
もっと読むSSHなどよく知られたサービスポートで何も対策せずにいると数えきらないくらいの攻撃リクエストが来ます。不必要なログを増やしてリソースを無駄にし、もし不用意なユーザーやシステムがあると攻撃に成功する場合もあります。
SshguardはC作られており、flex/bisonのパーサールールを足せば拡張できますがカスタム版をメンテナンスするのも面倒です。必要なルールを足してプルリクエストを送ってもマージされる可能性の低いです。
Fail2banはPythonで作られていてメンテナンスも比較的容易です。しかし、削除された機能を使用しておりメンテナンス状態も良くないです。今のPythonで動くようにしても良いのですが、Fail2banは無駄に大きいです。そしてPythonはあまり速くもないです。
Webアプリも放置していれば攻撃できるか試し放題です。OWASP TOP 10 A09:2021-Security Logging and Monitoring Failures に準拠するにも「ほぼリアルタイム」のIPアドレスブロッカーが欠かせません。 A9:2021に対応するにはブロックツール以前に、Webアプリ攻撃ツールなどが生成するリクエスト(入力)を検知し記録しなければなりません。このためWebアプリの入力を厳格にバリデーションする必要があります。
参考:
(注意: A9:2021はWAFを導入するという基準ではないです。Webアプリが攻撃(≒無効な入力)を検知・記録・対応する機能がないと脆弱なWebアプリだとする基準です、念の為)
という事で簡単に拡張(どんなログでもパースしてブロック)できて、300行ほどの一つのスクリプトでそこそこ速く、簡単にカスタマイズできるIPアドレスブロッカーを書いたのでgithubに入れておきました。
https://github.com/yohgaki/ssblocker
もっと読む必要になる度に調べているのでメモ。少なくともRHEL系はこれで動くようになるはずです。出来れば/var/run/docker.sockにアクセスが必要なコンテナだけにアクセス許可を与えたいのですが良い方法を思い付きません。それでもSELinuxを無効化するより/var/run/docker.sockだけアクセス可能のする方がホストの安全性は高くなります。そもそもボリューム(ファイル)にアクセスできないとアクセスできないので、ほとんどの環境※では、リスクは大きく増えないでしょう。
※ Dockerコンテナを作る人を信用できない場合、無視できないリスクがあります。コンテナ好き勝手に弄られる可能性があります。古いDockerがloopbackでコマンドを受け付けていた時に外部ユーザーから好き勝手にコンテナを弄られる脆弱性がありました。これと同じです。
もっと読むAlpine Linuxは軽量Linuxディストリビューションの一つでカスタムDockerコンテナのベースイメージに使っている人も多いと思います。Dockerコンテナで複数サービスを起動したい場合、プロセススーパーバイザーを使うのが常道です。DJBのdaemontoolsなら小さく軽量で良いのですが、Pythonで実装されたSupervisordは軽量コンテナにする意味を台無しにするくらいに色々インストールする必要があります。
インストールするパッケージ/プログラム数と管理項目を最小限にしたいミニマリストなら、Alpine Linuxの起動プロセス管理ツールのOpenRC(昔ながらのSysV Initスタイル)を使いたいと思うハズです。私もその一人でしたが、検索してもどう構成すれば良いのかズバリ説明しているページを見つけられませんでした。
ということで、Alpine Linuxなどに付属するOpenRCを使ったDockerの起動プロセス管理の基本を紹介します。
もっと読む今のlibxmlは意図しないエンティティ変換により意図しない情報漏洩などを防ぐ為にエンティティ変換をしない仕様になっています。libxml関数にLIBXML_NOENT(エンティティ変換を行わせる為のフラグ)を渡して処理しないとエンティティ変換が行われません。しかし、例外があります。
もっと読む大抵のシェルスクリプトはセキュリティ対策を考慮する必要がないので与えられたパラメーターはそのまま利用されています。シェルスクリプトを利用して権限の無いユーザーが勝手なコマンドを実行できないようにするにはエスケープが必要になります。
このようなスクリプトで
この場合はエスケープ(やバリデーション)が必要になります。
もっと読むGigagineで比較的珍しいバグが見つかったことを記事にしています。
「%p%s%s%s%s%n」というSSIDのネットワークに接続すると、iPhoneのすべてのWi-Fi関連機能が無効になってしまう
https://gigazine.net/news/20210620-specific-network-name-disable-wi-fi-iphone/
「セキュリティって難しいんだな」と感じるニュースではなく「大手でも基本が出来てないんだな」と思えれば、似たような問題で困ることが無くなります。
もっと読むプログラムのコードを書く場合1文字でも間違えると致命的な問題になる事がよくあります。=< であるべき所を < で条件分岐すると困った事になります。何を当たり前の事を言っているのだ?と思うでしょう。プログラマには常識です。プログラマーは1文字も間違いがないコードを書くために懸命にコードを書いています。
しかし、プログラムでデータを処理する場合1文字でも正しく取り扱うことができないモノが含まれると正しく動作できない、これは常識でしょうか?それとも非常識でしょうか?プログラマは自分が書いたコードに正しく処理可能なデータであることを保証するコードに(データを検証するコードを記述)しているでしょうか?入力データの検証はアプリケーションでは必須ですが検証できているでしょうか?
もっと読むコンピューターサイエンス・システムエンジニアリングに基づくソフトウェアセキュリティ対策は論理的に構築されており問題ないです。しかし、一般に広まっているソフトウェアセキュリティ対策には出鱈目が普通にまかり通っています。
その最たる例はCWE-20の出鱈目な紹介や解釈です。
Terminology
The “input validation” term is extremely common, but it is used in many different ways. In some cases its usage can obscure the real underlying weakness or otherwise hide chaining and composite relationships.
Some people use “input validation” as a general term that covers many different neutralization techniques for ensuring that input is appropriate, such as filtering, canonicalization, and escaping. Others use the term in a more narrow context to simply mean “checking if an input conforms to expectations without changing it.” CWE uses this more narrow interpretation.
太字部分の訳
他の人々はより狭いコンテクストで”変更しなくても入力が期待に沿うモノかチェックすること”の意味で使用する。CWEはこの狭い意味の解釈を採用している。
このように現在の本家CWE-20の用語補足では「”変更しなくても入力が期待に沿うモノかチェックすること”の意味で使用」と明記されていますが、CWE-20にエスケープやフィルタリングが含まれる、とする驚くべき解説をする”セキュリティ専門家”が居たりします。(普通は「CWEはこの狭い意味の解釈を採用している」と注釈なくてもそれ以前に解説の文意で判る)
もっと読む非エンジニアのユーザーに現在のほぼ全てのWebサーバーは送信されてくるデータが妥当かどうか確認していない、と説明すると驚きます、「そんな仕組みでマトモに動くソフトウェアが作れるのか?」と。当然の疑問でしょう。
実際、コンピュータサイエンス・システムエンジニアリングの世界では一貫して入力データの妥当性検証を重要なセキュリティ対策として実装するように求めています。
現在のISO 27000ではセキュアプログラミング技術の採用を要求しています。セキュアプログラミングで最も重要な事は入力データバリデーションです。2013年にISO 27000が改定されるまで、入力データバリデーションだけは具体的な仕様が解説されていました。2013年の改定で普及したので「セキュアプログラミングを採用する」と簡易にされました。(ハンドブックではないJIS Q 27000:2014の冒頭の改定の経緯解説に書かれています)
もっと読む以前から気になっては居たのですがJVNのCWE-20の解説ページが出鱈目です。用語の定義が間違っています。もう何年も前から修正されていません。Draftとは言え「セキュアコーディングの第一原則」(IPAは2017年からプログラミング原則としている)入力データバリデーション・入力妥当性チェックの用語定義が間違っているのは致命的な間違いです。
このブログ最後に記載の通り、メールにて誤りを指摘していました。最初のJVNへのメールから3週間かかりましたが指摘した通りに修正されました。
標準的な入力バリデーション(入力の妥当性チェック)にはエスケープやフィルタリング、脆弱性を隠すという意味はありません。入力データが形式的に妥当であることを検証するのが入力データバリデーションです。これは70年代のFormal Verificationの頃からの定義です。
近年になって乱用/誤解/拡大解釈により間違った意味で使われている場合があるので注意が必要です。
もっと読むPharファイルは複数のPHPスクリプトをアーカイブ&パッケージ化して一つのファイルでアプリケーションとして実行する仕組みです。
PharファイルはPHPプログラムその物なのでこれを実行してしまうとPHPで実行できることは何でもできてしまいます。そもそもPharファイルはプログラムなので信頼できないPharファイルを実行したらやりたい放題なのに、なぜPharのデシリアライズがセキュリティ問題になるのか?解説します。
もっと読む