トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション
セキュリティ分科会 ボードリーダー 河端 善博
はじめに
ログインを作成する
ユーザーを作成する
sa アカウントを狙うワーム
おわりに

【はじめに】
SQL Serverには、 SQL Serverの利用者をあらわすものとして、「ログイン」と「ユーザー」があります。さらに、これらをグループ化するものとして、「サーバーロール」と「ロール」があります。ここでは、それぞれの考え方を整理していきます。
あわせて、セキュリティ上の注意点や、すでに発生したワームも見ていきましょう。

【ログインを作成する】
SQL Server には、利用者をあらわすものとして、次の二つがあります。

ログイン SQL Server へ接続する利用者を区別します。
ユーザー データベース毎に利用者を区別します。

ログインは、SQL Server へ接続するときに利用します。ログインには、Windows のユーザーやグループ、SQL Server 認証用のログインがあります。
ユーザーは、データベース毎のユーザーをあらわします。SQL Serverでは、データベース毎に利用出来るユーザーを設定し、各ユーザーには、それぞれ特定のログインを割り当てます。

では、 Enterprise Manager でのログイン管理画面を見ていきましょう

図: 1-1 WS000000.JPG

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 の内容を確認してみましょう。

図:1-2 WS0000001.JPG

図:1-2 WS0000002.JPG

図:1-2 WS0000003.JPG

Enterprise Managerで、BUILTIN\Administrators をダブルクリックすると、図のようにプロパティが表示されます。
それぞれの設定は次のようになります。

名前 ログイン名
認証 認証方式(Windows 認証, SQL Server認証)
既定値 接続時のデータベースと、言語
サーバーロール ログインに割り当てられている役割
データベースアクセス 許可されているデータベースと、そのデータベースの中での役割

サーバーロールは、役割を割り振る単位として利用できるものです。インストール時には、次のサーバーロールが作成されています。

図: 1-3 WS000004.JPG

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

図1-4 WS000005.JPG

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)...」を選択します。

図1-5 WS000006.JPG

新規ログイン用ダイアログが表示されます。まず、名前を指定します。
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 にてデータベースを選択し、その下の「ユーザー」を選択すると、図のようにユーザーの一覧が表示されます。

図1-6 WS000007.JPG

Transact-SQL を使って、ユーザーの一覧を表示するには、次のようにします。

  use [pubs]
  exec sp_helpuser


ユーザーには、次の特殊なユーザーがあります。

dbo データベース管理者
guest 匿名ユーザー

dbo は、データベースの管理者です。サーバーロール「sysadmins」に割り当てられているBUILTIN\Administratorsやsaは、自動的にdbo になります。
たとえば、新規にログインを作成し、sysadmins にログインを割り当てていると、すべてのデータベースに対して、dbo として動作することになります。
したがって、安易にサーバーロールsysadmins にログインを割り当てないようにする必要があります。

guest は、そのデータベースに対する匿名接続を許可します。guestをデータベースに登録すると、任意のログインがそのデータベースにアクセスできるようになります。
最初はデータベースに登録されていませんので、 よほどの理由がない限り、guestを追加しないでください。

では、ユーザーを追加してみましょう。
「ユーザー」のところで、右クリックしてボタンから「新規データベースユーザー(U)...」を選択すると、図のように新規ユーザー登録用ダイアログが表示されます。

図1-7 WS000008.jpg

設定項目は次のようになります。

ログイン名 ユーザーに関連するログイン名
ユーザー名 データベース内のユーザー名
データベースロール内の権限 ユーザーに割り当てるロール

ログイン名とユーザー名は、違う名前を指定することができます。
ユーザーは、必ずロール「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のグループをログインに割り当てることもできます。
どのように使い分けるのか、十分に検討して管理漏れのないシステム構築をしましょう。
    

★この連載に関する質問・意見交換は、下記の掲示板・MLをご利用ください★
セキュリティ分科会メーリングリスト pml-security@sqlpassj.org

「SQL Serverセキュリティのキ・ホ・ン」 目次
第1回 認証モード
第3回 権限の設定
第4回 暗号化設定
第5回 開発上の注意点


 
PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.