| 【はじめに】
SQL Serverには、 SQL Serverの利用者をあらわすものとして、「ログイン」と「ユーザー」があります。さらに、これらをグループ化するものとして、「サーバーロール」と「ロール」があります。ここでは、それぞれの考え方を整理していきます。
あわせて、セキュリティ上の注意点や、すでに発生したワームも見ていきましょう。
【ログインを作成する】
SQL Server には、利用者をあらわすものとして、次の二つがあります。
| ログイン |
SQL Server
へ接続する利用者を区別します。 |
| ユーザー |
データベース毎に利用者を区別します。 |
|
ログインは、SQL Server へ接続するときに利用します。ログインには、Windows のユーザーやグループ、SQL
Server 認証用のログインがあります。
ユーザーは、データベース毎のユーザーをあらわします。SQL Serverでは、データベース毎に利用出来るユーザーを設定し、各ユーザーには、それぞれ特定のログインを割り当てます。
では、 Enterprise Manager でのログイン管理画面を見ていきましょう

Transact-SQLでログインの一覧を得るには次のようにします。
sp_helplogins
ログインは、セキュリティグループの中に定義されており、インストール直後は、次の三つのログインが定義されています。
| BUILTIN\Administrators |
コンピュータ上の Administrators グループ
Windows 認証 |
| sa |
SQL Server 管理者。SQL Server 認証 |
| <コンピュータ名>\<サービス開始アカウント名> |
サービス開始アカウント
Windows 認証 |
|
BUILTIN\Administrators は、そのコンピュータのAdministrators グループです。BUILTINは、組み込みのものという意味です。sa
は、システム管理者です。System Administrator の略です。
<コンピュータ名>\<サービス開始アカウント名>は、SQL Serverのサービス開始アカウントとして指定したWindowsのアカウント名です。
これら三つのログインには、SQL Serverのあらゆる操作が可能な権限が割り当てられています。
つづいて、BUILTIN\Administrators の内容を確認してみましょう。
Enterprise Managerで、BUILTIN\Administrators をダブルクリックすると、図のようにプロパティが表示されます。
それぞれの設定は次のようになります。
| 名前 |
ログイン名 |
| 認証 |
認証方式(Windows 認証,
SQL Server認証) |
| 既定値 |
接続時のデータベースと、言語 |
| サーバーロール |
ログインに割り当てられている役割 |
| データベースアクセス |
許可されているデータベースと、そのデータベースの中での役割 |
|
サーバーロールは、役割を割り振る単位として利用できるものです。インストール時には、次のサーバーロールが作成されています。

それぞれのサーバーロールによって権限が割り当てられています。
sysadmin
(System Administrators) は、すべての権限が割り当てられています。 BUILTIN\Administrators,
sa, <コンピュータ名>\<サービス開始アカウント名>は、sysadmins
に割り当てられています。
たとえば、データベース作成の権限やログイン作成の権限などは、BUILTIN\Administrators
やsa に直接割り当てられているのではなく、sysadmins に割り当てられていることになります。

Transact-SQL でサーバーロールの一覧を得るには次のようにします。
sp_helpsrvrole
sysadmins に割り当てられているログインの一覧を得るには次のようにします。
sp_helpsrvrolemember 'sysadmins'
さて、ここで注意点があります。クエリーアナライザから、次のクエリーを実行してみましょう
sp_helplogins
すると次のような結果が表示されます。
| LoginName |
SID |
DefDBName |
DefLangName |
AUser |
ARemote |
BUILTIN\
Administrators |
0x01020000000000
0520000000200200
00 |
master |
日本語 |
NO |
no |
LEOPARD\
SQL Server |
0x01050000000000
0515000000267672
1B9B0BF38042237
9ABFD030000 |
master |
日本語 |
NO |
no |
| sa |
0x01 |
master |
日本語 |
yes |
no |
|
ここで注目してほしいのは、「SID(セキュリティ識別番号)」です。 SQL Serverの内部では、ログインをログイン名ではなく、SID
で管理しています。
このため、ログイン名が同じでも、SID が異なれば別のログインとみなされます。
特に、あるSQL Serverで作成したデータベースをコピーして、別のSQL
Serverにアタッチした場合に、問題となります。 SIDは、ログインの種類がWindows
認証か、SQL Server認証かで変わります。
| Windows認証の場合 |
Windowsが割り当てたSID |
| SQL Server 認証の場合 |
SQL Serverがログイン作成時に割り当てたSID
作成時にSIDを指定することができる |
|
Windows認証の場合は、Windowsのユーザーやグループ作成時に、Windowsが割り当てたSIDになります。Windows上でユーザー名を変更しても、SIDは同じままになります。
逆に、Windows上でユーザーを削除して、再度同じ名前でユーザーを作成した場合は、SIDは違う値になります。
SQL Server認証の場合は、ログイン作成時、自動的にSIDが割り振られます。Transact-SQL
を使うと、特定のSIDを指定してログインを作成することもできます。
では、いよいよログインを作成してみましょう。
Enterprise Manger では、ログインのところで右クリックをして「新規ログイン(L)...」を選択します。

新規ログイン用ダイアログが表示されます。まず、名前を指定します。
Windows 認証の場合は、<ドメイン名>\<名前>
または、<コンピュータ名>\<名前>という形で指定します。名前入力欄の右にある「...」ボタンをクリックすると、Windows
のユーザーの一覧の中から選択することができます。名前には、ユーザーだけでなく、グループを指定することができます。
Windows 認証では、「セキュリティアクセス」の欄にて、「アクセス許可」「アクセス拒否」を選択することができます。
通常は、「アクセス許可」を選択します。
「アクセス拒否」を選択すると、特定のユーザーまたは、グループからのアクセスを拒否することができます。
SQL Server 認証の場合は、任意の名前を指定します。あわせてパスワードも指定します。
名前、パスワードとも、任意の文字を 128文字まで指定することができます。パスワードは少なくとも、10文字以上指定されることをお勧めします。
Transact-SQLを利用してログインを追加する場合は次のようになります。
| Windows
認証ログインの追加 |
sp_grantlogin
(アクセス許可) sp_denylogin
(アクセス拒否) |
| SQL Server
認証ログインの追加 |
sp_addlogin |
|
Windows 認証ログインは、アクセス許可する場合と、拒否する場合とで別のコマンドを利用します。
アクセス許可する場合: sp_grantlogin N'MyDomain\UserA'
アクセス拒否する場合: sp_denylogin N'MyDomain\UserA'
SQL Server 認証のログインは、次のように作成します。
sp_addlogin N'UserA', N'Password'
SID を指定してログインを作成する場合は、次のようにします。
sp_addlogin @loginname=N'UserA',
@passwd=N'pwd', @sid= 0x0123
新規作成したログインの既定のデータベースを指定するには、次のようにします。
sp_defaultdb N'MyDomain\UserA', N'Pubs'
新規作成したログインの既定の言語を指定するには次のようにします。
sp_defaultlanguage N' MyDomain\UserA',
N'日本語'
システムの既定値に設定する場合は、sp_defaultlanguage
N'UserA' とします。
ログインを特定のサーバーロールに割り当てるには、次のようにします。
sp_addsrvrolemember N'MyDomain\UserA,
'sysadmin'
以上で、ログインが作成できました。
ただし、この状態では、ログインはデータベースに対してアクセス権がありません。
このため、SQL Server に接続してもエラーになります。
ログインが利用できるようにするためには、つづいてユーザーを作成する必要があります。
【ユーザーを作成する】
つづいて、データベース毎にユーザーを作成します。
Enterprise Manager にてデータベースを選択し、その下の「ユーザー」を選択すると、図のようにユーザーの一覧が表示されます。
Transact-SQL を使って、ユーザーの一覧を表示するには、次のようにします。
use [pubs]
exec sp_helpuser
ユーザーには、次の特殊なユーザーがあります。
| dbo |
データベース管理者 |
| guest |
匿名ユーザー |
|
dbo は、データベースの管理者です。サーバーロール「sysadmins」に割り当てられているBUILTIN\Administratorsやsaは、自動的にdbo
になります。
たとえば、新規にログインを作成し、sysadmins にログインを割り当てていると、すべてのデータベースに対して、dbo
として動作することになります。
したがって、安易にサーバーロールsysadmins にログインを割り当てないようにする必要があります。
guest は、そのデータベースに対する匿名接続を許可します。guestをデータベースに登録すると、任意のログインがそのデータベースにアクセスできるようになります。
最初はデータベースに登録されていませんので、 よほどの理由がない限り、guestを追加しないでください。
では、ユーザーを追加してみましょう。
「ユーザー」のところで、右クリックしてボタンから「新規データベースユーザー(U)...」を選択すると、図のように新規ユーザー登録用ダイアログが表示されます。
設定項目は次のようになります。
| ログイン名 |
ユーザーに関連するログイン名 |
| ユーザー名 |
データベース内のユーザー名 |
| データベースロール内の権限 |
ユーザーに割り当てるロール |
|
ログイン名とユーザー名は、違う名前を指定することができます。
ユーザーは、必ずロール「public」に属します。
Transact-SQL からユーザーを追加するには、次のようにします。
sp_grantdbaccess N'MyDomain\UserA',
'UserA'
ユーザーをロールに割り当てるには、次のようにします。
sp_addrolemember N'db_owner', N'UserA'
以上で、ユーザーが登録できました。
ログインとユーザーの両方の登録が完了してはじめて、ログインは利用できるようになります。
【sa
アカウントを狙うワーム】
2002年5月にSQL Serverに感染するワームが発生しました。
ワーム名は、「SQLSPIDA」です。
別名にJS_SQLSPIDA.B, BAT_SQLSPIDA.B. Digispid.B.Worm, JS_SQLSpida.B,Hacktool.IPStealer,
JS.Spida.B, SQLSnake, SQLSpida, MS SQL Wormがあります。
詳しくは、マイクロソフトのサイトを参照してください。
< SQL Serverを標的とした SQLSPIDA ワームに関する情報
>
http://www.microsoft.com/japan/technet/security/virus/sqlspida.asp
公開日:2002/5/22
このワームは、SQL Serverにログイン「sa」パスワード「なし」で接続し、感染します。
sa にパスワードをつけない人なんて、いるはずがない ! と思われがちですが、実際にワームは感染をしつづけました。
原因としては、いくつも考えられます。まず、SQL Serverインストール時にsaにパスワードをつけなくても、インストール出来ていたこと。Windows認証でセットアップしたあと、混合認証に変更した人が、saのパスワードを付け忘れたことなどです。
特に、SQL Server認証のログインのパスワードが、パスワードなしでも許可されてしまうことに問題があります。最初は気をつけていても、開発中やテスト中にパスワードなしでアカウントをつくって、そのままになっているケースもあります。
そこで、パスワードなしのログインがあるかどうかを調べる方法を紹介します。
SELECT
name, password
FROM
master..syslogins
WHERE
password IS null
and isntuser = 0
and isntgroup =0
このTransact-SQL を実行すると、パスワードなしのログインの一覧を表示します。
master..syslogins は、ログインを管理するシステムテーブルです。このテーブルのパスワードがnull の行を選択しています。isntuser
= 0 と isntgroup = 0 は、Windows認証のログインを省いています。
手軽に検査できますので、ぜひ納品時やシステム保守の時に、検査することをお勧めします。インターネット上には、パスワードのあらゆる可能性を順番にテストするツールもあります。市販されているものもあります。出来る限りWindows認証のログインを利用すること、SQL
Server認証を利用する場合は、最低10文字以上のパスワードを設定することをお勧めします。
【おわりに】
SQL Server には、ログイン、ユーザー、サーバーロール、ロールという考え方があります。Windowsのグループをログインに割り当てることもできます。
どのように使い分けるのか、十分に検討して管理漏れのないシステム構築をしましょう。
|