Documentation 6. より高度なトピック![]() |
![]() ![]() |
インターネットのセキュリティはクライアントにとってもサーバにとっても重要ですが,webMathematica は完全にサーバの技術なので,webMathematica JSPに関連したクライアントのセキュリティ問題はありません.もちろんクライアントの側のセキュリティも重要ですが,Mathematica はクライアントの側のセキュリティに関する問題は特に引き起しません.問題なのはサーバのセキュリティなのです.
重要なまとめ
セキュリティのセクションを全部読む時間がなかったり,分からない用語があるようなら,セキュリティに関する重要なポイント「決して
ToExpression
を使わない.安全な関数の
MSPToExpression
を常に使う」を覚えておいてください.
Mathematica のように一般的な計算システムをWebサイトの中で起動することは,サーバのセキュリティに大きな問題を起す危険性を含んでいます.Mathematica にはファイルを検証したり削除したりするコマンドや,任意のプロセスを開始するコマンドがあります.webMathematica ツールにはたくさんのセキュリティ機能が組み込まれていますが,これは他のセキュリティ機能と連携して作動するようにできています.セキュリティ面が重要な場合は,ファイアウォール,信頼できるホスト,HTTPに特化したセキュリティ機能等を適切に使うことが大切です.
Mathematica サイトの主な危険性は,サーバのセキュリティを脅かすようなコマンドを誰かがMathematica に送ってくることです.このようなコマンドは入力変数の値としてサーバから送ることができます.「入力変数の解釈」に関するセクションではシステムが入力を解釈する方法について説明しましたが,このセクションでは認証プロセスを説明します.システムは,
ReadList[ "/etc/passwd"]
あるいは
Run["telnetd -d"]
のような入力を受けることがあり得ます.Mathematica の無害なコマンドの引数として使われていても,攻撃してくる可能性もあります.
これらのどれかをhttp://localhost:8080/webMathematica/Examples/Expand.jspのような例題の入力として使ってみてください.
Mathematica への入力の値がサーバから文字列で送られているので,これは成功しません.このような文字列は,Mathematicaカーネルでは入力を解釈する安全な方法を提供するMSPBlockあるいはMSPToExpressionのような特別なMSP関数を使って処理されなければなりません.また,Mathematica のコマンドToExpressionにセキュリティ機能が組み込まれており,セキュリティシステムをバイパスする危険な呼出しを防ぎます.
MSP関数のMSPBlockとMSPToExpressionはwebMathematicaのサイトに送られる入力を安全に使うために提供されています.これらは式を解析し,式の評価前に認証します.認証が終わると入力は計算に使われます.しかし,認証されないと,MSPExceptionが投げられます.次の例をご覧ください.
Needs["MSP`"]
SetSecurity[];
$$e="ReadList[\"/etc/passwd\"]";
MSPToExpression[$$e]
Hold[Throw[{$$e, "ReadList[\"/etc/passwd\"]"}, MSPException["SecurityError"]]]
Catch文を使わなかったので,受け取られなかったThrowに関するメッセージが出されます.ページの処理中にこのメッセージが出されると,デフォルトハンドラがこれを捕えます.この際,一般的には何らかの適切なテキストが挿入されます.ページの作者がこれらの例外を受け取って,何らかの特別なエラーメッセージを発することも可能です.
自分のページが攻撃を受けないようにしたければ,ページで計算するものを理解することが大切です.特に,他のファイルを開いたり閉じたりその他の操作を実行したりするようなコマンドは,RunやLinkOpen等のプロセスを開始するコマンドと同様に十分に注意して扱うことが大切です.ToExpressionを使う場合は以下のような注意も必要です.
認証プロセスは大変ストレートに行われます.これをカスタマイズすることでセキュリティの程度を調節することができます.この操作は以下のようになります.
まずMSPMathematica アプリケーションをロードし,次にセキュリティモデルをロックします.このセキュリティモデルは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, Union, Intersection, Complement, 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, AppellF1, 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, O, C]
MSP`Utility`DisallowedSymbols
MSP`Utility`DisallowedSymbols
このモデルでは,Global`コンテキストに含まれるシンボルすべてと,多くの特別なシンボルが認められます.これは高度のセキュリティを提供する,かなり限定的なモデルです.
自分で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アプリケーションをロードします.
Needs["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パラメータを設定することができます.
MSPスクリプトの開発者がセキュリティシステムを熟知しておらず,入力変数に対してToExpressionを直接呼び出すことがあるかもしれません.そうすると,ToExpressionはセキュリティシステムをバイパスし,潜在的な危険を引き起してしまいます.このような場合にもセキュリティが保たれるように,ToExpressionは第1引数がリクエストと共に送られる入力のどれかと一致した場合に有効となるようになっています.このようにしてセキュリティシステムは次のような計算を認証します.
<msp:evaluate>
val = ToExpression[ $$num]
</msp:evaluate>
$$numの値がセキュリティテストをパスすると,ToExpressionが予定通りに作用します.しかし,セキュリティテストを通らないとセキュリティの例外が投げられます.
このセキュリティテストはMathematica の変数MSP`Utility`CheckToExpressionをFalseにすると作用しなくなります.また,MSP.confに以下を加えてもテストはできません.
CheckToExpression=false
このセキュリティ機能を使いたくないサイトは多分ほとんどないでしょう.
もちろんToExpressionヘの文字列入力がリクエストと共に送られた入力から来てはいるが,何らかの方法で修正されているといったときは,ToExpressionヘの呼出しは認証を実行しません.このため,ToExpressionは決して使わず,代りにMSPToExpressionをお使いになることを強くお勧めします.
システムをモニターしたりデバッグしたりするカーネルモニタのように,システムの中でアクセスを制限したい部分があるでしょう.その場合は,「ログ」と「カーネルモニタ」の項を参照してください.「ApacheとTomcat」のセクションには,webMathematica をApache Webサーバから使ったときにこれがどのようになるかの説明があります.
![]() ![]() |