<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>DBMS</title><link>http://blogs.wankuma.com/tyappi/category/1713.aspx</link><description>DBMS</description><managingEditor>ちゃっぴ (tyappi@wankuma.com)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>SQL Server で blocking されている resource を特定する方法</title><link>http://blogs.wankuma.com/tyappi/archive/2010/06/13/190116.aspx</link><pubDate>Sun, 13 Jun 2010 18:48:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/06/13/190116.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/190116.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/06/13/190116.aspx#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/190116.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/190116.aspx</trackback:ping><description>&lt;P&gt;DB を扱っている時、各 resource がどのように lock されているか、すなわち blocking の状況を把握することが重要です。SQL Server 2005 以降で blocking の状態を調査するには &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms190345.aspx"&gt;[master].[sys].[dm_tran_locks]&lt;/A&gt; を &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms189499.aspx"&gt;SELECT&lt;/A&gt; してやることで取得できます。&lt;/P&gt;
&lt;P&gt;まあ、実際には &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms190345.aspx"&gt;[master].[sys].[dm_tran_locks]&lt;/A&gt; だけでは必要な情報が足りない場合が多く、&lt;A href="http://msdn.microsoft.com/ja-jp/library/ms176013.aspx"&gt;[master].[sys].[dm_exec_sessions]&lt;/A&gt; や &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms181509.aspx"&gt;[master].[sys].[dm_exec_connections]&lt;/A&gt; と結合したりしますがこちらについては下記の Figure 3 Capturing locking stats を参考にしてください。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://technet.microsoft.com/ja-jp/magazine/2008.04.blocking.aspx"&gt;SQL Server のブロッキングを最小限に抑える&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/ja-jp/library/ms190345.aspx"&gt;[master].[sys].[dm_tran_locks]&lt;/A&gt; を &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms189499.aspx"&gt;SELECT&lt;/A&gt; してやることで取得できた lock 情報ですが、このままではわかりずらいのでまずは [resource_associated_entity_id] を object name に変換します。その変換 script が Figure 4 Learning more about blocked data です。環境によっては大文字小文字の統一や &lt;VAR&gt;@resource_associated_entity_id&lt;/VAR&gt; を bigint に修正してから実行する必要がありますのでご注意を。&lt;/P&gt;
&lt;P&gt;で table name が取れたらいよいよ lock されている resource を特定します。これには undocumented な %%lockres%% を利用します。&lt;/P&gt;&lt;PRE class=code&gt;&lt;CODE&gt;SELECT * FROM [table name] WHERE %%lockres%% = @resource_description&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;VAR&gt;@resource_description&lt;/VAR&gt; に &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms190345.aspx"&gt;[master].[sys].[dm_tran_locks]&lt;/A&gt; で取得した値を設定して上記 SQL を実行してください。Lock されている行が取得できます。&lt;/P&gt;
&lt;P&gt;%%lockres%% は非常に使えるので、ぜひ document に載せて欲しいなぁと思うのですが、過去にその feedback をされていた方がいました。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://connect.microsoft.com/SQLServer/feedback/details/458076/make-lockres-a-documented-feature"&gt;Make %%lockres%% a documented feature&lt;/A&gt; 
&lt;P&gt;結果は検証する時間が無いので行わないとのことです。残念です。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/190116.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>SQL Server で Kerberos 認証を有効にする</title><link>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188660.aspx</link><pubDate>Mon, 03 May 2010 19:22:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188660.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/188660.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2010/05/03/188660.aspx#Feedback</comments><slash:comments>59</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/188660.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/188660.aspx</trackback:ping><description>&lt;P&gt;SQL Server で &lt;A href="http://msdn.microsoft.com/ja-jp/library/ms144284.aspx"&gt;Windows 認証&lt;/A&gt;を利用する場合、認証に利用される protocol は &lt;A href="http://msdn.microsoft.com/en-us/library/aa378747.aspx"&gt;Kerberos&lt;/A&gt; と &lt;A href="http://msdn.microsoft.com/en-us/library/aa378749.aspx"&gt;NTLM&lt;/A&gt; から選択されます。いわゆる &lt;A href="http://msdn.microsoft.com/en-us/library/aa378748.aspx"&gt;Negotiate&lt;/A&gt; というやつです。&lt;/P&gt;
&lt;P&gt;既定の設定では &lt;A href="http://msdn.microsoft.com/en-us/library/aa378747.aspx"&gt;Kerberos&lt;/A&gt; が利用可能な状態なら &lt;A href="http://msdn.microsoft.com/en-us/library/aa378747.aspx"&gt;Kerberos&lt;/A&gt; が優先され、&lt;A href="http://msdn.microsoft.com/en-us/library/aa378747.aspx"&gt;Kerberos&lt;/A&gt; が利用できない場合に &lt;A href="http://msdn.microsoft.com/en-us/library/aa378749.aspx"&gt;NTLM&lt;/A&gt; が利用されます。&lt;/P&gt;
&lt;P&gt;現在の接続がどちらの protocol を利用しているか調査するには下記 query を実行します。&lt;/P&gt;&lt;PRE class=Code&gt;&lt;CODE&gt;SELECT [auth_scheme]
  FROM [master].[sys].[dm_exec_connections]
  WHERE [session_id] = @@SPID&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;[auth_scheme] は 'public' server role の member では選択できませんので上記は 'sysadmin' server role の member で実施してください。&lt;/P&gt;
&lt;P&gt;意外に NTLM になっていること多いんじゃないでしょうか？&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa378747.aspx"&gt;Kerberos&lt;/A&gt; が利用できない原因はいろいろ存在しますが、もっとも多いのが &lt;A href="http://msdn.microsoft.com/en-us/library/ms677949.aspx"&gt;SPN (Service Principal Name)&lt;/A&gt; が登録されていないという状況です。&lt;/P&gt;
&lt;P&gt;Remote から &lt;A href="http://msdn.microsoft.com/en-us/library/aa378747.aspx"&gt;Kerberos&lt;/A&gt; を利用して接続を行うためには &lt;A href="http://msdn.microsoft.com/en-us/library/ms677949.aspx"&gt;SPN&lt;/A&gt; の登録が必要です。SQL Server では service の起動時に &lt;A href="http://msdn.microsoft.com/en-us/library/ms677949.aspx"&gt;SPN&lt;/A&gt; を登録しに行きます。Service account に &lt;A href="http://msdn.microsoft.com/en-us/library/ms684272.aspx"&gt;Network Service account&lt;/A&gt; を利用している場合には、この自動登録で &lt;A href="http://msdn.microsoft.com/en-us/library/ms677949.aspx"&gt;SPN&lt;/A&gt; が登録されます。しかし、domain account を利用している場合には失敗します。&lt;/P&gt;
&lt;P&gt;というのは domain account の場合その domain account 自身の &lt;A href="http://msdn.microsoft.com/en-us/library/ms679785.aspx"&gt;Service-Principal-Name attribute&lt;/A&gt; への書き込みが既定で許可されていないからです。&lt;/P&gt;
&lt;P&gt;これを解消するためには SQL Server の service acount に指定した domain account の ACL で "Self" に対し "servicePrincipalName" への書き込みを許可します。Windows Server 2008 以降では「Active Directory ユーザーとコンピューター」からでも ACL の設定が可能ですが、"servicePrincipalName" は設定できません。そのため、作業は "ADSI エディター" から行ってください。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;「ファイル名を指定して実行」から "adsiedit.msc" 
&lt;LI&gt;「ADSI エディター」で SQL Server の service account を探し出し、[プロパティ] 
&lt;LI&gt;[セキュリティ] tab で &amp;lt;詳細設定&amp;gt; 
&lt;LI&gt;"SELF" (複数存在していてもどちらか一つで OK) を選択し、&amp;lt;編集&amp;gt; 
&lt;LI&gt;[適用先] に「このオブジェクトのみ」で「servicePrincipalName の書き込み」を付与&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;上記設定が完了したら、SQL Server を再起動します。その後、下記 command を実行して &lt;A href="http://msdn.microsoft.com/en-us/library/ms677949.aspx"&gt;SPN&lt;/A&gt; を確認します。&lt;/P&gt;
&lt;P&gt;&amp;gt;&lt;KBD&gt;setspn.exe -l &lt;VAR&gt;Domain&lt;/VAR&gt;\&lt;VAR&gt;Account&lt;/VAR&gt;&lt;/KBD&gt;&lt;/P&gt;
&lt;P&gt;&lt;VAR&gt;Domain&lt;/VAR&gt;, &lt;VAR&gt;Account&lt;/VAR&gt; には SQL Server の service acount を入力してください。結果に下記が含まれれば OK です。&lt;/P&gt;
&lt;P&gt;&lt;SAMP&gt;MSSQLSvc/&lt;VAR&gt;DbServerName&lt;/VAR&gt;.&lt;VAR&gt;FQDN&lt;/VAR&gt;:1433&lt;BR&gt;MSSQLSvc/&lt;VAR&gt;DbServerName&lt;/VAR&gt;&lt;/SAMP&gt;&lt;/P&gt;
&lt;P&gt;ここまで書きましたが、account の ACL を変更せずに &lt;A href="http://technet.microsoft.com/en-us/library/cc773257.aspx"&gt;setspn.exe&lt;/A&gt; を使って &lt;A href="http://msdn.microsoft.com/en-us/library/ms677949.aspx"&gt;SPN&lt;/A&gt; を直接登録してしまってももちろん構いません。&lt;/P&gt;
&lt;P&gt;これが完了したら、もう一度 query を投げて protocol を確認してみましょう。&lt;A href="http://msdn.microsoft.com/en-us/library/aa378747.aspx"&gt;Kerberos&lt;/A&gt; になっていない場合には、firewall 等他の原因です。&lt;/P&gt;
&lt;P&gt;なお、ここまでは SQL Server が Kerberos 認証を受け入れるための準備作業であり、Kerberos 委任を利用した multi-hop 許可の設定については説明していません。続きは次回。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/188660.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>SQL injection による Web page 改竄</title><link>http://blogs.wankuma.com/tyappi/archive/2009/01/31/167210.aspx</link><pubDate>Sat, 31 Jan 2009 23:04:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2009/01/31/167210.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/167210.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2009/01/31/167210.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/167210.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/167210.aspx</trackback:ping><description>&lt;P&gt;昨年はまさしく SQL injection 祭りな一年でしたね。が、SQL injection による Web page の改竄が特に目立っていましたね。&lt;/P&gt;
&lt;P&gt;とある情報によると特に 12 月の攻撃は一年通してもものすごい量に跳ね上がっていたとか。&lt;/P&gt;
&lt;P&gt;で、今回話題にするのは SQL injection による Web 改竄です。&lt;/P&gt;
&lt;P&gt;SQL injection の対策として第一に叫ばれるのは parametrized queries を利用しろ！ とか、問題のある入力文字列を無効化しろ! といった coding 面ですね。&lt;/P&gt;
&lt;P&gt;これは非常に正しい指摘です。SQL injection による問題は Web 改竄に限った話ではないので、絶対に必要なことですね。&lt;/P&gt;
&lt;P&gt;ですが、Web 改竄に限るとどうなるでしょう？&lt;/P&gt;
&lt;P&gt;Web 改竄で問題になるのは、本来管理者のみが変更を許可されるような Web page を変更されることです。掲示板や blog のような不特定多数が書き込みを許可されるものに対して悪意のある Web page への link を張ったからといっても問題になりませんね。&lt;/P&gt;
&lt;P&gt;実際改竄が行われた Web page を参照してみると、管理者のみ変更を許可されるべき Web page がほとんどです。これって、そもそもおかしくないですか？&lt;/P&gt;
&lt;P&gt;多くの DBMS では access control 機能を有しています。管理者のみ変更を許可する必要があるのであれば、DBMS 側の access control 機能で原則制御すべきでしょう。&lt;/P&gt;
&lt;P&gt;それすらできていないところが攻撃を受けて深刻な問題を起こしているのが現状です。ぶっちゃけ、ありえね～！&lt;/P&gt;
&lt;P&gt;このようなどうしようもない system を release したところは退場してもらうような制度が必要なんかじゃないかと思ったり。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/167210.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>DB への接続 user を共用する場合でも少しでも脅威を軽減できるように設計しよう</title><link>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137240.aspx</link><pubDate>Sun, 11 May 2008 21:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137240.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/137240.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137240.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/137240.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/137240.aspx</trackback:ping><description>&lt;p&gt;&lt;A href="http://blogs.wankuma.com/tyappi/archive/2008/05/11/137185.aspx"&gt;SQL injection を防ぐもうひとつの方法&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;A href="http://blogs.wankuma.com/tyappi/archive/2008/05/11/137191.aspx"&gt;DB への接続 user を共用した場合の client-server 構成での 問題点&lt;/a&gt;&lt;/p&gt; &lt;p&gt;上記で SQL injection の根本的原因は DBMS で access control を行っていないことだと述べました。&lt;/p&gt; &lt;p&gt;DB への接続 user を個人単位で割り当て DBMS の acess control で制御してやりたいが、要求される performance と resource のため、どうしても利用することが難しい。そんな場合もあると思います。でも、DB への接続 user を共用化した場合は DBMS の access control を全く利用できないんでしょうか？&lt;/p&gt; &lt;p&gt;違いますよね。DB への接続 user を共用化するといっても、user は一つしか使ってはいけないということはないでしょう。処理の内容によって user を使い分けることはできるはずです。&lt;/p&gt; &lt;p&gt;たとえば、SELECT と UPDATE する user を分ける。Logon に利用する user も分離する。重要な data を扱う user も分離する。そして、それぞれ必要な最小限の権限のみ割り当てれる。&lt;/p&gt; &lt;p&gt;こうゆうことをやれば多少なりとも驚異を軽減することにつながるでしょう。Performance に関しても高々数 user を追加したところでさして変わるとは思えませんし。&lt;/p&gt; &lt;p&gt;多層で防御すればするほど security level は向上します。Stored procedure なり、parameterized query なり、sanitizing なりで SQL injection 対策を行うとともに、このような方法も検討してみてはいかがでしょうか？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/137240.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>DB への接続 user を共用した場合の client-server 構成での 問題点</title><link>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137191.aspx</link><pubDate>Sun, 11 May 2008 04:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137191.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/137191.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137191.aspx#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/137191.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/137191.aspx</trackback:ping><description>&lt;P&gt;随分前の話ですが、SQL injection は Web application に限った話ではない。Client-server systemでも深刻な事態をもたらすといった意見が上がっていましたね。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.wankuma.com/tyappi/archive/2008/05/11/137185.aspx"&gt;SQL injection を防ぐもうひとつの方法&lt;/A&gt; で簡単に説明しましたが、 SQL injection が深刻な事態をもたらす根本的原因は、扱う data に十分な access control がなされていないことにあります。DB への接続 user を共用していれば、その user ですべての data を扱うことができるので、当然 SQL injection 攻撃を受けると大問題ですね。&lt;/P&gt;
&lt;P&gt;でも、client-server system では構成によりもっと問題がある場合があるんです。では、ちょっと client-server system について考えてみましょう。&lt;/P&gt;
&lt;P&gt;Client-server 構成は基本的に intranet で利用されているので network 構成はこんな感じが多いと思います。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerNetworkDiagramWithAP.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=148 alt=ClientServerNetworkDiagramWithAP src="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerNetworkDiagramWithAP_thumb.png" width=244 border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;もしくは、Application server もなく client から直接 DB 叩いているかもしれません。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerNetworkDiagramNonAP.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=86 alt=ClientServerNetworkDiagramNonAP src="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerNetworkDiagramNonAP_thumb.png" width=244 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;さて、今回は DB への接続 user を共用した場合の話です。DB に接続する場合の認証情報はどこに保存されているか考えてみましょう。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerDiagramWithAP.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=96 alt=ClientServerDiagramWithAP src="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerDiagramWithAP_thumb.png" width=244 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerDiagramNonAP.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=120 alt=ClientServerDiagramNonAP src="http://tyappi.wankuma.com/images/DBuserclientserver_40B3/ClientServerDiagramNonAP_thumb.png" width=244 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Application server を利用している場合には application server に、application server を利用していない場合には client に保存されていると思います。&lt;/P&gt;
&lt;P&gt;Application server を利用している場合では、Web application の場合と同様に application server に対する攻撃を封じてやるよう対策を行えばいいです。&lt;A href="http://blogs.wankuma.com/tyappi/archive/2007/09/09/94931.aspx"&gt;Web application を host する secure な network 構成&lt;/A&gt; で書いたような直接 DB server へ全く access できないような network 構成にして、cient 側には必要な service しか提供できないように firewall を構成する。もちろん application は全く脆弱性が存在しないように作成する必要があります。&lt;/P&gt;
&lt;P&gt;ところが、application server が無い状態ではどうなるでしょうか？&lt;/P&gt;
&lt;P&gt;認証情報は client に保存されます。こちらの場合、基本的に DB 接続用の認証情報が漏えいすると考えたほうがよいでしょう。Application に暗号化して埋め込んでもその暗号化 logic まで client に存在するため、一定の skill を持っている人であれば解析されます。&lt;/P&gt;
&lt;P&gt;このような構成は基本的に取るべきではないでしょう。どうしても application server を利用できない場合には、共通の user など用意せず DBMS 側の access control を利用すべきです。この構成では must といっても問題ないでしょう。&lt;/P&gt;
&lt;P&gt;なお、application server を利用しない場合でも、DB へ access する application を通常利用している OS account とは別のaccount で起動した process で扱うことにより一応保護することはできます。原理としては &lt;A href="http://blogs.wankuma.com/tyappi/archive/2007/04/26/73204.aspx"&gt;Windows Service にみる別の資格情報で process を起動する安全な方法&lt;/A&gt; な感じです。ただ、この方法をとったとしても application server を利用する場合ほどの security を確保することはできません。また、user&amp;nbsp;の account が "BUILTIN\Administrators" なんかに所属している場合には当然全く意味をなしません。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/137191.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>SQL injection を防ぐもうひとつの方法</title><link>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137185.aspx</link><pubDate>Sun, 11 May 2008 01:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137185.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/137185.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2008/05/11/137185.aspx#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/137185.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/137185.aspx</trackback:ping><description>&lt;p&gt;ちょいと前からですが、断続的に大規模な SQL injection 攻撃が続いています。 &lt;p&gt;よくある対策としては、stored procedure 利用しろ！とか、parameterized query 利用しろ！とか ad-hoc query 利用する場合は sanitizing しろ！とか。望ましい順番は stored procedure &amp;gt; parameterized query &amp;gt; ad-hoc query with sanitizing になるわけですが、stored procedure 以上により望ましい方法があります。 &lt;p&gt;SQL injection って何が問題なんでしょう？  &lt;p&gt;そう、本来は許可されるべきでない user が不正に data へ access できてしまうことが問題なんです。あれ？これってもろに access control の話ですよね？ 大抵の DBMS には当然 DBMS の access control 機能があります。そう、これを厳密に適用している状態であれば、SQL injection されたところで data に access する段階で確実にはじかれます。また、application 側で対策するよりも遥かに容易に制限を課すことができるのも利点ですね。 &lt;p&gt;でも、一般に DBMS の access control 機能ってそれほど利用されていないじゃないの？と思われる方も多いと思います。これはなぜでしょう？ &lt;p&gt;一つ目の要因として、DB に access する user を分けると resource 消費が増えるというのがあります。利用する DBMS によって異なりますが、connection pooling ができなくなるとか多くの場合 performance 面で不利になる点は否めないでしょう。これが一番の要因になっているようですね。 &lt;p&gt;二つ目は user 管理の問題です。DB に access する user を分けるわけですから、DB もしくは DB で利用する認証 server に user account を作成する必要があります。これを嫌っている人も多いみたいですね。でも、これ自動化するのはそんなに難しくないと思うんだけどなぁ。独自の認証利用している場合が多いと思いますが、その強度・管理面まで考えると正直逆転するんじゃないかと思います。 &lt;p&gt;まあ、そういうこともあって現状では DBMS の access control を利用していることが多いとは言えませんが、より確実な access control 以外にも DB への接続 user を分ける利点があります。 &lt;p&gt;それは、traceability の確保です。DB へ接続する user を共有している場合、当然ですが DB 側ではどの user が行った操作なのかわかりません。これでは監査できているとは言えませんよね。ちゃんとした監査を要求される system では、どの user (個人) が行った操作か？ というのが識別できないといけません。User を共有した場合、これを application 側で DB に書き込む処理を追加しなければなりません。これは正直負担が大きいです。では user を分離した場合ではどうなるでしょう？ DBMS 側の機能で要求される監査を実施できることが多いです。いちいちゴリゴリ coding する必要がないので楽になりますね。 &lt;p&gt;まあ、どの方法を選択するかは perfomance, security は当然として、開発費用、運用管理費用等まで考慮する必要があります。DB というととかく perfomance のみに目が行きがちですが、他の要因も検討対象に加え再評価してはいかがでしょうか。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/137185.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>SQL Server 各 edition の CPU 数制限</title><link>http://blogs.wankuma.com/tyappi/archive/2008/04/17/133676.aspx</link><pubDate>Thu, 17 Apr 2008 20:11:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2008/04/17/133676.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/133676.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2008/04/17/133676.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/133676.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/133676.aspx</trackback:ping><description>&lt;P&gt;SQL Server の processor license は誰もがご存知のように物理 CPU (石) 数で決定しますが、Standard Edition, Express Edition には support する CPU の数が制限されています。&lt;/P&gt;
&lt;P&gt;Support される processor 数はどうなるんでしょう？&lt;/P&gt;
&lt;P&gt;その回答は下記。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://technet.microsoft.com/ja-jp/magazine/cc162361.aspx"&gt;SQL に関する Q&amp;amp;A Best Practices Analyzer、マルチコア プロセッサなど&lt;/A&gt;&lt;/P&gt;
&lt;BLOCKQUOTE cite=http://technet.microsoft.com/ja-jp/magazine/cc162361.aspx&gt;
&lt;DIV class=clsQA id=qa5&gt;質問 &amp;#8211; ハイパースレッドやデュアルコア テクノロジだけでなく、さらに多くのコア (4 コア、8 コアなど) を搭載したプロセッサのリリースが始まっています。現在、SQL Server 2005 Standard Edition の展開を行うために、マルチコア プロセッサを搭載した新しいサーバーの購入を検討していますが、4 コアのプロセッサを使用する場合、実際に使用できるのは 1 基の物理 CPU のみになるのでしょうか (Standard Edition でサポートされるのは最高で 4 CPU のため)。&lt;/DIV&gt;
&lt;DIV class=clsQA id=qa6&gt;回答 &amp;#8211; ライセンスやエディションでの CPU のサポート数について、SQL Server ではプロセッサのコア数とは無関係に、物理ソケット (CPU) 数のみが考慮されます。したがって、たとえば SQL Server 2005 Standard Edition が最高で 4 CPU をサポートするという場合、CPU のコア数とは無関係に、4 つの物理 CPU ソケットをサポートすることになります (つまり、4 コアの物理 CPU が 4 基ある場合、展開した Standard Edition が使用できる論理 CPU 数は 16 になります)。また、コア (論理 CPU) 数は 16 でも、必要になるライセンス費用は 16 コア分ではなく、4 物理 CPU 分のみです。SQL Server およびマルチコアの詳細については、&lt;A href="http://www.microsoft.com/sql/howtobuy/multicore.mspx"&gt;microsoft.com/sql/howtobuy/multicore.mspx&lt;/A&gt; を参照してください。&lt;/DIV&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;ということで、license の count と全く同じが正解です。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/133676.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>NUMA</title><link>http://blogs.wankuma.com/tyappi/archive/2008/04/06/131891.aspx</link><pubDate>Sun, 06 Apr 2008 13:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2008/04/06/131891.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/131891.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2008/04/06/131891.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/131891.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/131891.aspx</trackback:ping><description>&lt;P&gt;最近ようやく Windows 系に復帰する感じです。&lt;/P&gt;
&lt;P&gt;で、ちと問題になっているのが dual core Itanium &amp;#215; 4 で構成された SQL server。&lt;/P&gt;
&lt;P&gt;数年前、&lt;A href="http://solution.unisys.co.jp/products/"&gt;ES7000&lt;/A&gt; とかは扱ったことあるんですが、現在は&amp;nbsp;&lt;A href="http://www.atmarkit.co.jp/icd/root/77/44603477.html"&gt;NUMA&lt;/A&gt;&amp;nbsp;というのがありこれが厄介な悪寒。&lt;/P&gt;
&lt;P&gt;勉強せねば。&lt;/P&gt;
&lt;P&gt;[追記]&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/ms178144.aspx"&gt;Non-Uniform Memory Access について&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/ms345345.aspx"&gt;NUMA シナリオ&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/ms180954.aspx"&gt;SQL Server 2005 での NUMA のサポート状況&lt;!----&gt;&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/ms345403.aspx"&gt;NUMA 環境下でのバッファ プールの拡張と縮小&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/ms345357.aspx"&gt;ソフト NUMA を使用するように SQL Server を構成する方法&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/ms345346.aspx"&gt;NUMA ノードに TCP/IP ポートをマッピングする方法&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.atmarkit.co.jp/fdb/rensai/drk08/drk08_1.html"&gt;進化するCPUをパワー全開で走らせるテクニック&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.atmarkit.co.jp/fdb/rensai/drk2_01/drk2_01_1.html"&gt;SQL Server 2005でガラッと変わった個所とは？&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;[/追記]&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/131891.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ちゃっぴ (tyappi@wankuma.com)</dc:creator><title>なんでも並列化することが高速化につながるわけではない</title><link>http://blogs.wankuma.com/tyappi/archive/2008/03/22/129133.aspx</link><pubDate>Sat, 22 Mar 2008 18:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/tyappi/archive/2008/03/22/129133.aspx</guid><wfw:comment>http://blogs.wankuma.com/tyappi/comments/129133.aspx</wfw:comment><comments>http://blogs.wankuma.com/tyappi/archive/2008/03/22/129133.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/tyappi/comments/commentRss/129133.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/tyappi/services/trackbacks/129133.aspx</trackback:ping><description>&lt;P&gt;ネタ元 &lt;A id=viewpost.ascx_TitleUrl href="/esten/archive/2008/03/22/129035.aspx"&gt;キングギドラvsやまたのおろち&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;こちらでは原因が並列化処理に限定されたわけではないですが、一般的な話として並列化を行うことによって高速化することも多いですけど、逆の場合もまた多いです。&lt;/P&gt;
&lt;P&gt;並列化して大幅な高速化が望めるのは下記に限定されると思っています。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;扱う対象の?resource も並列処理可能 
&lt;LI&gt;扱う resource 自体に余裕がある&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;たとえば、CPU が並列処理可能でも一つの resource を共有する場合、結局その resourece 空き待ちが発生するわけで、大して効果がないことも多いです。Physical memory のように random access に強いものならそれなりに効果がありますが、HDD のような sequential access と random access で明らかに処理速度が違うようなものを扱うときには注意が必要だと思っています。下手に並列化することによって、遅くなる可能性が非常に高いと思っています。&lt;/P&gt;
&lt;P&gt;小規模な場合には問題になること少ないですが、大規模な場合にはここら辺が問題になることが非常に多いです。&lt;/P&gt;
&lt;P&gt;なお、SQL server に関しては consulting service が行っている query tuning の講義が参考になりますね。予算に余裕があったら是非受講してみてください。&lt;/P&gt;
&lt;P&gt;Web ではこんなのがあるようですね。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/japan/technet/prodtechnol/sql/2005/tsprfprb.mspx"&gt;SQL Server 2005 でのパフォーマンス問題のトラブルシューティング&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.atmarkit.co.jp/fdb/index/index-db.html#tunesqls"&gt;SQL Server 2000 チューニング全工程&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.atmarkit.co.jp/fdb/index/index-db.html#drk"&gt;Dr. K's SQL Serverチューニング研修&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.atmarkit.co.jp/fdb/index/index-db.html#drk2"&gt;Dr. K's SQL Serverチューニング研修 Part II&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;あと、&lt;A href="http://www.sqlpassj.org/"&gt;PASSJ&lt;/A&gt;?の講義でここら辺やってくれたりしないんですかね？&lt;BR&gt;今度行ってみるか&lt;/P&gt;
&lt;P&gt;並列化で最大限の効果を挙げるためには扱う resource を含めた並列化が必要になるので、そこら辺を意識する必要があるでしょう。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/tyappi/aggbug/129133.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>