Azure Synapse Analytics での SQL 認証
Azure Synapse Analytics には、リソースの使用を制御できる 2 つの SQL フォームファクターがあります。 この記事では、2 つのフォームファクターがユーザー認証を制御する方法について説明します。
Synapse SQL を承認するには、次の 2 種類の承認を使用できます。
- Microsoft Entra 承認
- SQL 承認
SQL 承認を使用すると、使い慣れた方法でレガシ アプリケーションを Synapse SQL に接続できます。 しかし、Microsoft Entra 認証を使用すると、SQL プールなどの Azure Synapse リソースへのアクセスを一元的に管理できます。 Azure Synapse Analytics では、ワークスペースの作成時とその後の両方で、SQL 認証などのローカル認証の無効化がサポートされています。 ローカル認証は無効化された場合、許可されているユーザーがいつでも有効にできます。 Microsoft Entra のみの認証の詳細については、Azure Synapse Analytics でのローカル認証の無効化に関する記事を参照してください。
管理者アカウント
管理者の機能を果たす管理者アカウントには、 2 つのアカウント (SQL 管理者ユーザーネームと Active Directory 管理者) があります。 SQL プールのこれらの管理者アカウントを識別するには、Azure portal を開き、Synapse ワークスペースの [プロパティ] タブに移動します。
SQL 管理ユーザー名
Azure Synapse Analytics を作成するときは、サーバー管理者のログインに名前を指定する必要があります。 このアカウントは SQL サーバーによって
master
データベースのログインとして作成されます。 このアカウントは、SQL Server 認証 (ユーザー名とパスワード) を使用して接続します。 これらのアカウントのうち、存在できるのは 1 つだけです。SQL Active Directory 管理者
1 つの Microsoft Entra アカウント (個人またはセキュリティ グループ アカウント) も、管理者として構成できます。 Microsoft Entra 管理者の構成は省略可能ですが、Microsoft Entra アカウントを使用して Synapse SQL に接続する場合は、Microsoft Entra 管理者を構成する必要があります。
- Microsoft Entra 管理者アカウントでは専用 SQL プールへのアクセスを制御する一方、Synapse RBAC ロールはサーバーレス プールへのアクセスを制御するために使用できます (Synapse 管理者や Synapse SQL 管理者ロールなど)。
SQL管理者ユーザー名と SQL Active Directory 管理者アカウントには、次の特性があります。
- サーバー上の任意の SQL Database に自動的に接続できる唯一のアカウントです (それ以外のアカウントでユーザー データベースに接続するには、そのデータベースの所有者であるか、そのユーザー データベースのユーザー アカウントを持っている必要があります)。
- これらのアカウントは、
dbo
ユーザーとしてユーザー データベースにアクセスし、ユーザー データベースに対するすべてのアクセス許可を持ちます (ユーザー データベースの所有者も、dbo
ユーザーとしてデータベースにアクセスします)。 master
データベースにdbo
ユーザーとしてアクセスしません。また、master
データベースでの制限されたアクセス許可があります。- 標準 SQL Server
sysadmin
固定サーバー ロールのメンバーではありません。このロールは SQL Database では使用できません。 - データベース、ログイン、
master
データベースのユーザー、およびサーバーレベルの IP ファイアウォール規則を作成、変更、削除できます。 dbmanager
ロールとloginmanager
ロールに対して、メンバーの追加と削除を実行できます。sys.sql_logins
システム テーブルを表示できます。
注意
ユーザーが Active Directory 管理者と Synapse 管理者として構成されており、その後、Active Directory 管理者ロールから削除された場合、ユーザーは Synapse の専用 SQL プールにアクセスできなくなります。 専用 SQL プールへのアクセスを回復するには、削除してから Synapse 管理者ロールに追加する必要があります。
サーバーレス SQL プールへのアクセス権を持つユーザーを管理するには、次の手順を使用します。
サーバーレス SQL プールに対するログインを作成するには、次の構文を使用します。
CREATE LOGIN Mary WITH PASSWORD = '<strong_password>';
-- or
CREATE LOGIN [Mary@domainname.net] FROM EXTERNAL PROVIDER;
ログインを作成したら、サーバーレス SQL プール エンドポイント内の個々のデータベースにユーザーを作成し、これらのユーザーに必要なアクセス許可を付与することができます。 ユーザーを作成するには、次の構文を使用できます。
CREATE USER Mary FROM LOGIN Mary;
-- or
CREATE USER Mary FROM LOGIN Mary@domainname.net;
-- or
CREATE USER [mike@contoso.com] FROM EXTERNAL PROVIDER;
ログインとユーザーを作成したら、通常の SQL Server 構文を使用して権限を付与できます。
管理者以外のユーザー
一般に、管理者以外のアカウントは、master
データベースにアクセスする必要はありません。 CREATE USER (Transact-SQL) ステートメントを使用して、データベース レベルの包含データベース ユーザーを作成してください。
このユーザーは、Microsoft Entra 認証の包含データベース ユーザー (Microsoft Entra 認証用の環境を構成した場合)、SQL Server 認証の包含データベース ユーザー、または SQL Server 認証ログインに基づく SQL Server 認証ユーザー (前の手順で作成したもの) にすることができます。
ユーザーを作成するには、データベースに接続し、次の例のようなステートメントを実行します。
CREATE USER Mary FROM LOGIN Mary;
CREATE USER [mike@contoso.com] FROM EXTERNAL PROVIDER;
最初、ユーザーを作成できるのは、データベースの管理者の 1 人か所有者だけです。 新しいユーザーの作成を他のユーザーに許可するには、次のようなステートメントを使用して、選択したユーザーに ALTER ANY USER
アクセス許可を付与します。
GRANT ALTER ANY USER TO Mary;
データベースのフル コントロールを他のユーザーに与えるには、そのユーザーを db_owner 固定データベース ロールのメンバーにします。
Azure SQL Database または Synapse Serverless で、ALTER ROLE
ステートメントを使用します。
ALTER ROLE db_owner ADD MEMBER Mary;
専用 SQL プールで、EXEC sp_addrolemember を使用します。
EXEC sp_addrolemember 'db_owner', 'Mary';
Note
サーバー ログインに基づくデータベース ユーザーを作成する 1 つの一般的な理由は、複数のデータベースへのアクセスを必要とするユーザーのためです。 包含データベース ユーザーは個別のエンティティであるため、各データベースは、それぞれが独自のユーザーとパスワードを保持します。 ユーザーは各データベースのパスワードをすべて記憶する必要があるため、オーバーヘッドが発生する可能性があり、多数のデータベースのパスワードを変更する必要が生じたときに対応できない可能性があります。
グループとロール
効率的なアクセス管理では、個々のユーザーではなく、グループとロールに割り当てられたアクセス許可を使用します。
Microsoft Entra 認証を使用する場合は、Microsoft Entra ユーザーを Microsoft Entra グループに配置します。 そのグループ用に包含データベース ユーザーを作成します。 1 人または複数のデータベース ユーザーをデータベース ロールに追加し、データベース ロールにアクセス許可を割り当てます。
SQL Server 認証を使用する場合は、データベースに包含データベース ユーザーを作成します。 1 人または複数のデータベース ユーザーをデータベース ロールに追加し、データベース ロールにアクセス許可を割り当てます。
データベース ロールは、db_owner、db_ddladmin、db_datawriter、db_datareader、db_denydatawriter、db_denydatareader などの組み込みロールを指定できます。 db_owner は、少数のユーザーのみに完全なアクセス許可を付与する際によく使用されます。 他の固定データベース ロールは、開発段階の単純なデータベースをすばやく取得するには便利ですが、運用段階のほとんどのデータベースには推奨されません。
たとえば、db_datareader 固定データベース ロールは、データベース内のすべてのテーブルへの読み取りアクセスを許可しますが、これは、通常、必要以上のことです。
それよりも、CREATE ROLE ステートメントを使用して独自のユーザー定義データベース ロールを作成し、各ロールに対してビジネスのニーズに応じて必要な最小限のアクセス許可を慎重に付与する方がはるかに適切です。 ユーザーが複数のロールのメンバーである場合は、それらのアクセス許可すべてが集約されます。
アクセス許可
SQL Database では、個別に許可または拒否できるアクセス許可が 100 個を超えています。 これらのアクセス許可の多くは、入れ子になっています。 たとえば、スキーマに対する UPDATE
アクセス許可には、そのスキーマ内の各テーブルに対する UPDATE
アクセス許可が含まれています。 ほとんどのアクセス許可システムと同様に、アクセス許可の拒否は許可をオーバーライドします。
入れ子になっている性質と、アクセス許可の数により、データベースを正しく保護するのに適切なアクセス許可システムを設計するには、慎重な調査を行う場合があります。
「権限 (データベース エンジン)」にあるアクセス許可の一覧から開始し、データベース エンジンのアクセス許可のポスター サイズ画像を確認してください。
注意点と制約
SQL Database のログインとユーザーの管理では、以下の点を考慮してください。
CREATE/ALTER/DROP DATABASE
ステートメントを実行する場合は、master
データベースに接続する必要があります。- サーバー管理者ログインに対応するデータベース ユーザーは、変更または削除できません。
- Microsoft Entra のみの認証が有効になっている場合、サーバー管理者は無効になります。
- サーバー管理者ログインの既定の言語は英語 (米国) です。
- 管理者 (サーバー管理者ログインまたは Microsoft Entra 管理者) と、
master
データベースの dbmanager データベース ロールのメンバーにのみ、CREATE DATABASE
とDROP DATABASE
ステートメントを実行するアクセス許可があります。 CREATE/ALTER/DROP LOGIN
ステートメントを実行するときは、master
データベースに接続している必要があります。 ただし、ログインの使用はお勧めできません。 代わりに、包含データベース ユーザーを使用してください。 詳細については、「包含データベース ユーザー - データベースの可搬性を確保する」を参照してください。- ユーザー データベースに接続するには、接続文字列にそのデータベースの名前を指定する必要があります。
- サーバーレベル プリンシパル ログインと、
master
データベースの loginmanager データベース ロールのメンバーにのみ、CREATE LOGIN
、ALTER LOGIN
、DROP LOGIN
ステートメントを実行する権限があります。 - ADO.NET アプリケーションで
CREATE/ALTER/DROP LOGIN
とCREATE/ALTER/DROP DATABASE
ステートメントを実行する場合、パラメーター化コマンドは使用できません。 詳細については、「 コマンドとパラメーター」をご覧ください。 CREATE USER
ステートメントをFOR/FROM LOGIN
オプションと共に実行する場合、これが Transact-SQL バッチ内の唯一のステートメントである必要があります。ALTER USER
ステートメントをWITH LOGIN
オプションと共に実行する場合、これが Transact-SQL バッチ内の唯一のステートメントである必要があります。- Microsoft Entra のみの認証が Azure Synapse ワークスペースに対して有効になっている場合、
CREATE/ALTER/DROP LOGIN
とCREATE/ALTER/DROP USER
ステートメントはサポートされません。 - ユーザーに対して
CREATE/ALTER/DROP
を実行するには、データベースに対するALTER ANY USER
権限が必要です。 - データベース ロールの所有者が、そのデータベース ロールに対して他のデータベース ユーザーの追加または削除を行おうとすると、「User or role 'Name' does not exist in this database.」というエラーが発生する場合があります。このエラーは、所有者からはユーザーが見えないために発生します。 この問題を解決するには、そのユーザーに対する
VIEW DEFINITION
権限をロールの所有者に許可します。
次のステップ
詳細については、「 包含データベース ユーザー - データベースの可搬性を確保する」を参照してください。