SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Windows 認証を使用した Contained Database

leave a comment

以前、Contained Databases を使用したログインを意識しないデータベースの移動 という内容の投稿を書きました。

今日、Tech Ed の What’s New in Security for Microsoft SQL Server Code-Named "Denali" を見ていたところ、[Windows authentication without Login] と記載されているスライドがありました。

Contained Database を使用した SQL Server 認証については調べたのですが、Windows 認証を使用した場合については調べていないな~と思い、良い機会でしたので検証してみました。

■Contained Databaseでログインを包含した場合の概要


まずは、Contained Database を使用したログインの概要を簡単にめてまとめてみたいと思います。

SQL Server には [ログイン] と [ユーザー] の二種類のセキュリティがあり、SQL Server への接続時には [ログイン] が使用されます。
このログインの情報は master データベースに格納されており、各ユーザーデータベースにはこのログインをユーザーとしてマッピングする形になります。
image

Contained Database を使用することで各ユーザーデータベースのユーザーを使用して認証を行うことができるようになり、master にログインを作成しなくてもユーザーの認証を行うことができるようになります。
image

ただし、認証の情報が各ユーザーデータベース内で完結してしまうため、複数のデータベースをまたいだクエリを実行するのは難しそうです。
# リンクサーバーを使えば何とかなりそうなのですが。

master のログイン情報を使用する場合、一つのログインを複数のデータベースのユーザーとしてマッピングすることができます。
image

Contained Database を使用した場合、各ユーザーデータベース内でユーザーの情報は完結しますので、同じユーザー名でユーザーを作成したとしてもそれは同姓同名の他人扱いとなり、セキュリティを共有することはできません。
image

 

■WIndows 認証を使用した Contained Database


それでは、本題の Windows authentication without Login についてまとめていきたいと思います。

Contained Database を有効にしているDB に新しいユーザーを作成する場合、ユーザーの種類は以下の選択をすることが可能です。
image

Windows 認証については、[Windows user] しか選択が無いのですが、Contained Database を有効にしている場合、この種類を使用することで Windows authentication without Login とすることができます。

今回は OS のローカルアカウントとして、[CDBUser] というユーザーを作成しています。
image

Contained Database を有効にした状態で、以下の設定でデータベース上にユーザーを作成します。
# ログイン名は空白としています。
image

Windows authentication without Login (ログインを作成しない、Windows 認証) の設定に関してはこれで完了のようです。
今回はローカルユーザーをログインとして設定はしていませんので、SQL Server のログインには [CDBUser] は存在していません。
image

この状態で、CDBUser で実行した SSMS で接続をしてみます。
# Contained Database の包含されたユーザーでの接続の場合は、必ずデータベースを明示的に指定する必要があります。
imageimage

ログインとして、Windows のユーザーを設定していない状態ですが、正常に SQL Server にログインすることができました。
image

Contained Database を使用した、ログインの包含は SQL Server 認証だけでなく、WIndows 認証でも有効なようですね。

 

■ローカルの Windows ユーザーを使用した Contained Database の問題点


ローカルの Windows ユーザーを使用した Contained Database のバックアップを他のサーバーにリストアした場合、ユーザー情報はバックアップ元のローカルユーザーとなりますので、バックアップ先で同じユーザー名の Windows ユーザーを作成したとしても SID が異なるため同姓同名の他人扱いとなります。
image

そのため、他のサーバーに移行することを考え、Windows ユーザーを Contained Database で使用する場合、ドメインユーザーでの使用を検討したほうが良さそうです。

image

この構成であれば、ユーザーの情報はドメインコントローラー上の情報を使用していますので、データベースを他のサーバーにリストアしても、同一の SID を使用しているため、データベースの移行を容易に行うことが可能です。

Windows 認証を使用した場合も、自分がログインしているデータベース以外にはアクセスができないという制限はかかるようです。
Windows 認証であれば、一つのユーザー (同一の SID のユーザー) で複数のデータベースにセキュリティ設定をかけることができるだろうと思い、設定をして、USE やデータベース名で修飾しようとしたクエリを実行しようとしたところ以下のエラーとなりました。
image

Contained Database の包含されたユーザーを使用する場合、SQL Azure と似たような動作となるイメージでいるといいのかもしれないですね。

Share

Written by Masayuki.Ozawa

10月 31st, 2011 at 11:12 pm

Posted in SQL Server

Tagged with , ,

Leave a Reply