6.2 セキュリティ
6.2 セキュリティ
インターネットのセキュリティはクライアントにとってもサーバにとっても重要ですが,MSP(Mathematica Server Pages )は完全にサーバの技術なので,MSPに関連したクライアントのセキュリティ問題はありません.もちろんクライアントの側のセキュリティも重要ですが,Mathematica はクライアントの側のセキュリティに関する問題は特に引き起しません.問題なのはサーバのセキュリティなのです.
重要なまとめ セキュリティのセクションを全部読む時間がなかったり,分からない用語があるようなら,セキュリティに関する重要なポイント「決して
ToExpression
を使わない.安全な関数の
MSPToExpression
を常に使う」を覚えておいてください.
Mathematica のように一般的な計算システムをWebサイトの中で起動することは,サーバのセキュリティに大きな問題を起す危険性を含んでいます.Mathematica にはファイルを検証したり削除したりするコマンドや,任意のプロセスを開始するコマンドがあります.MSPツールにはたくさんのセキュリティ機能が組み込まれていますが,これは他のセキュリティ機能と連携して作動するようにできています.セキュリティ面が重要な場合は,ファイアウォール,信頼できるホスト,HTTPに特化したセキュリティ機能等を適切に使うことが大切です.
Mathematica サイトの主な危険性は,サーバのセキュリティを脅かすようなコマンドを誰かがMathematica に送ってくることです.このようなコマンドは入力変数の値としてサーバから送ることができます.「入力の解釈 」に関するセクションではシステムが入力を解釈する方法について説明しましたが,このセクションでは認証プロセスを説明します.システムは,
ReadList[ "/etc/passwd"]
あるいは
Run["telnetd -d"]
のような入力を受けることがあり得ます.Mathematica の無害なコマンドの引数として使われていても,攻撃してくる可能性もあります.
これらのどれかをhttp://localhost:8080/webMathematica/Examples/Expand.jsp のような例題の入力として使ってみてください.
Mathematica への入力の値がサーバから文字列で送られているので,これは成功しません.このような文字列は,Mathematica カーネルでは入力を解釈する安全な方法を提供するMSPBlock あるいはMSPToExpression のような特別なMSP関数を使って処理されなければなりません.また,Mathematica のコマンドToExpression にセキュリティ機能が組み込まれており,セキュリティシステムをバイパスする危険な呼出しを防ぎます.
6.2.1 MSP関数の認証
MSP関数のMSPBlock とMSPToExpression はwebMathematica のサイトに送られる入力を安全に使うために提供されています.これらは式を解析し,式の評価前に認証します.認証が終わると入力は計算に使われます.しかし,認証されないと,MSPException が投げられます.次の例をご覧ください.
Needs["MSP`"];
SetSecurity[]
$$e="ReadList[\"/etc/passwd\"]";
MSPToExpression[$$e]
Hold[Throw[{$$e, "ReadList[\"/etc/passwd\"]"}, MSPException["SecurityError"]]]
Catch文 を使わなかったので,受け取られなかったThrow に関するメッセージが出されます.ページの処理中にこのメッセージが出されると,MSPハンドラがこれを捕えます.この際,一般的には何らかの適切なテキストが挿入されます.ページの作者がこれらの例外を受け取って,何らかの特別なエラーメッセージを発することも可能です.
重要:セキュリティの警告
自分のページが攻撃を受けないようにしたければ,ページで計算するものを理解することが大切です.特に,他のファイルを開いたり閉じたりその他の操作を実行したりするようなコマンドは,Run やLinkOpen 等のプロセスを開始するコマンドと同様に十分に注意して扱うことが大切です.ToExpression を使う場合は以下のような注意も必要です.
認証のプロセス
認証プロセスは大変ストレートに行われます.これをカスタマイズすることでセキュリティの程度を調節することができます.この操作は以下のようになります.
まずMSPアプリケーションをロードし,次にセキュリティモデルをロックします.このセキュリティモデルはSetSecurity を呼び出した後では修正できません.SetSecurity はサーバがMathematica を初期化するときに呼び出されます.
Needs["MSP`"];
SetSecurity[]
これで,式を認証できるかどうかテストすることができます.まず,安全で無害な数式を検証してみましょう.
InsecureExprQ[ HoldComplete[ Sin[6]]]
False
ここに,攻撃として送られそうな,扱いにくい式があります.
InsecureExprQ[ HoldComplete[ Run[ "telnetd"]]]
True
妥当性の検証は,全シンボルをリストにして,そのリストを短くしていくことで実行されます.実行後も残っているシンボルがあれば,その式は安全ではありません.このプロセスは一連のシンボルとコンテキスト名のリストを次の手順で認証/否認する形で行われます.
AllowedContexts がリストの場合,このリストに含まれるコンテキストのシンボルを除く.
AllowedContexts がリストでなければ,DisallowedContexts の中に含まれないコンテキストのシンボルを除く.
AllowedSymbols がリストなら,このリストの中のシンボルを除く.
AllowedSymbols がリストでなければ,DisallowedSymbols の中にはないシンボルを除く.
シンボルが残らなければ,式は安全である.その他の場合,式は安全ではない.
このテストは限定的にも柔軟にも使えます.「allowed」のリストを使うと,限定的になり,セキュリティも高まります.「disallowed」のリストを使うと限定度は下がり,セキュリティも低くなります.どのようにバランスを取るかは個々のサイトによります.
サーバがスタートするとデフォルトのセキュリティモデルがインストールされます.これは以下のようなものです.
MSP`Utility`AllowedContexts
{"Global`"}
MSP`Utility`DisallowedContexts
MSP`Utility`DisallowedContexts
MSP`Utility`AllowedSymbols
HoldComplete[Plus, Times, Power, Sqrt, Log, Exp, HoldComplete, ∞, , , °, GoldenRatio, Catalan, EulerGamma, OutputForm, StandardForm, List, Sin, Cos, Tan, Sec, Csc, Cot, Sinh, Cosh, Tanh, Sech, Csch, Coth, ArcSin, ArcCos, ArcTan, ArcSec, ArcCsc, ArcCot, ArcSinh, ArcCosh, ArcTanh, ArcSech, ArcCsch, ArcCoth, True, False, Derivative, D, Dt, ⅈ, Greater, Less, GreaterEqual, LessEqual, Inequality, Equal, Re, Im, Abs, Sign, Conjugate, Arg, Round, Floor, Ceiling, Max, Min, Mod, Quotient, Not, And, Or, Xor, AiryAi, AiryAiPrime, AiryBi, AiryBiPrime, BesselJ, BesselK, BesselI, BesselY, Factorial, Binomial, Multinomial, Gamma, Beta, LogGamma, PolyGamma, LegendreP, SphericalHarmonicY, HermiteH, LaguerreL, Erf, Erfc, Erfi, InverseErf, InverseErfc, ClebschGordan, ThreeJSymbol, SixJSymbol, Zeta, FresnelS, FresnelC, CosIntegral, SinIntegral, ExpIntegralE, ExpIntegralEi, SinhIntegral, CoshIntegral, HypergeometricPFQ, Hypergeometric0F1, Hypergeometric1F1, Hypergeometric2F1, HypergeometricPFQRegularized, MeijerG, MSP`Security`Private`AppelF1, EllipticK, EllipticF, EllipticE, EllipticPi, JacobiZeta, EllipticNomeQ, EllipticLog, InverseEllipticNomeQ, JacobiAmplitude, EllipticExp, DiracDelta, UnitStep, DiscreteDelta, KroneckerDelta, Identity, Function, Slot, GrayLevel, Hue, RGBColor, CMYKColor, Automatic, None, All, Null]
MSP`Utility`DisallowedSymbols
MSP`Utility`DisallowedSymbols
このモデルでは,Global` コンテキストに含まれるシンボルすべてと,多くの特別なシンボルが認められます.これは高度のセキュリティを提供する,かなり限定的なモデルです.
6.2.2 自分のセキュリティモデルの設定
自分でMSP`Utility`AllowedContexts,MSP`Utility`DisallowedContexts,MSP`Utility`AllowedSymbols,MSP`Utility`DisallowedSymbolsを定義することができます.この定義は/WEB-INF/confディレクトリのファイルに置き,ファイルの名前は設定パラメータSecurityConfigurationFile で設定してください.例えば,設定情報がSecurityConfiguration.m とうい名前のファイルにある場合は,次のものをMSP.conf に加えてください.
SecurityConfigurationFile=SecurityConfiguration.m
以下はセキュリティ設定ファイルの例です.これはPlus ,Times ,Power の他にはGlobal` コンテキストのシンボルしか許可しません.これは特に制限の度合いの強いセキュリティシステムですが,場合によってはこのようなシステムが適しているかもしれません.
MSP`Utility`AllowedSymbols = HoldComplete[ Plus, Times, Power] MSP`Utility`AllowedContexts = {"Global`"}
「複数カーネルプール 」のセクションで説明してあるように,異なるURLのリクエストには異なる設定の詳細を使うことも可能です.これらの異なるプールには独自の設定ファイルがあり,従ってセキュリティシステムも独自に設定できるのです.
Mathematica カーネルが起動される度に,上記の4つのセキュリティパラメータがログシステムに送られます.
ご自分のセキュリティモデルをMathematica からテストすることができます.このためには,MSP Mathematica アプリケーションがMathematica のレイアウトにインストールされていなければなりません.これはwebMathematica の実行には必要ありません.Mathematica のインタラクティブなセッションでこの関数を使いたい場合にのみ必要なものです.これについては前 の説明をご覧ください.
Mathematica セッションから関数を実行します.まず,MSPアプリケーションをロードします.
<<MSP`
次にご自分のセキュリティ設定をファイルに収め,これをMathematica にロードします.例題では上記の設定情報を用い,ファイルをC:\Temp ディレクトリに置いています.
SetSecurity["C:\\Temp", "MySecurity.m"]
True
この入力が持っているのはGlobal` コンテキストにあるシンボルとPlus なので,セキュリティモデルを通過します.
MSPToExpression[ "x+y"]
x+y
しかし,次ぎ入力はセキュリティシステムが許可しないSin というシンボルも持っているので,セキュリティシステムは通過しません.
MSPToExpression[ "Sin[x]+y"]
Hold[Throw[{"Sin[x]+y", "Sin[x]+y"}, MSPException["SecurityError"]]]
適切なセキュリティシステムを決定したら,ご自分のセキュリティ設定ファイルをwebMathematica/WEB-INF/conf ディレクトリに置いて,MSP.conf のSecurityConfigurationFile パラメータを設定することができます.
6.2.3 ToExpressionの有効性
MSPスクリプトの開発者がセキュリティシステムを熟知しておらず,入力変数に対してToExpression を直接呼び出すことがあるかもしれません.そうすると,ToExpression はセキュリティシステムをバイパスし,潜在的な危険を引き起してしまいます.このような場合にもセキュリティが保たれるように,ToExpression は第1引数がリクエストと共に送られる入力のどれかと一致した場合に有効となるようになっています.このようにしてセキュリティシステムは次のようなMathletを認証します.
<% val = ToExpression[ $$num] %>
$$num の値がセキュリティテストをパスすると,ToExpression が予定通りに作用します.しかし,セキュリティテストを通らないとセキュリティの例外が投げられます.
このセキュリティテストはMathematica の変数MSP`Utility`CheckToExpression をFalse にすると作用しなくなります.また,MSP.conf に以下を加えてもテストはできません.
CheckToExpression=false
このセキュリティ機能を使いたくないサイトは多分ほとんどないでしょう.
もちろんToExpression ヘの文字列入力がリクエストと共に送られた入力から来てはいるが,何らかの方法で修正されているといったときは,ToExpression ヘの呼出しは認証を実行しません.このため,ToExpression は決して使わず,代りにMSPToExpression をお使いになることを強くお勧めします.
6.2.4 アクセス制限
システムをモニターしたりデバッグしたりするカーネルモニタのように,システムの中でアクセスを制限したい部分があるでしょう.その場合は,サイト管理の「ログ 」と「カーネルモニタ 」の項を参照してください.「ApacheとTomcat 」のセクションには,webMathematica をApache Webサーバから使ったときにこれがどのようになるかの説明があります.