Подключение с помощью проверки подлинности Microsoft Entra

Скачать драйвер PHP

Идентификатор Microsoft Entra — это центральная технология управления идентификаторами пользователей, которая работает в качестве альтернативы проверке подлинности SQL Server. Microsoft Entra ID позволяет подключаться к Базе данных SQL Azure, Управляемому экземпляру SQL Azure и Azure Synapse Analytics с использованием федеративных идентификаторов в Microsoft Entra ID с помощью имени пользователя и пароля, интегрированной проверки подлинности Windows или маркера доступа Microsoft Entra. Драйверы PHP для SQL Server предоставляют частичную поддержку этих функций.

Прежде чем использовать проверку подлинности Microsoft Entra, необходимо настроить проверку подлинности Microsoft Entra и управлять ими с помощью SQL Azure.

Чтобы использовать идентификатор Microsoft Entra, используйте ключевые слова Authentication или AccessToken (они являются взаимоисключающими), как показано в следующей таблице. Дополнительные технические сведения см. в статье об использовании идентификатора Microsoft Entra с драйвером ODBC.

Ключевое слово Значения Описание
AccessToken Не задано (по умолчанию). Режим проверки подлинности определяется другими ключевыми словами. Дополнительные сведения см. в статье Connection Options.
Байтовая строка Маркер доступа Microsoft Entra, извлеченный из ответа OAuth JSON. Строка подключения не должен содержать идентификатор пользователя, пароль или ключевое Authentication слово (требуется драйвер ODBC версии 17 или выше в Linux или macOS).
Аутентификация Не задано (по умолчанию). Режим проверки подлинности определяется другими ключевыми словами. Дополнительные сведения см. в статье Connection Options.
SqlPassword Выполните проверку подлинности напрямую для экземпляра SQL Server (который может быть экземпляром Azure) с использованием имени пользователя и пароля. Имя пользователя и пароль необходимо передать в строку подключения с использованием ключевых слов UID и PWD.
ActiveDirectoryPassword [НЕ РЕКОМЕНДУЕТСЯ] ActiveDirectoryPassword устарел. Дополнительные сведения см. в примере подключения с помощью SqlPassword и ActiveDirectoryPassword.
Пройдите проверку подлинности с помощью учетной записи Microsoft Entra, используя имя пользователя и пароль. Имя пользователя и пароль необходимо передать в строку подключения с использованием ключевых слов UID и PWD.
ActiveDirectoryMsi Проверка подлинности с использованием либо управляемого удостоверения Microsoft Entra, назначаемого системой, либо управляемого удостоверения Microsoft Entra, назначаемого пользователем (требуется драйвер ODBC версии 17.3.1.1 или выше). Общие сведения и руководства см. в статье "Что такое управляемые удостоверения для ресурсов Azure?".
ActiveDirectoryServicePrincipal Проверка подлинности с помощью объектов субъекта-службы (требуется ODBC Driver версии 17.7 или более поздней). Дополнительные сведения и примеры см. в статье Объекты приложений и субъектов-служб в Microsoft Entra ID.

Ключевое слово Authentication влияет на параметры безопасности подключения. Если оно задано в строке подключения, по умолчанию для ключевого слова Encrypt указано значение true, то есть клиент будет запрашивать шифрование. Кроме того, сертификат сервера будет проверяться независимо от параметра шифрования, если для параметра TrustServerCertificate установлено значение true (false по умолчанию). Эта функция отличается от старого, менее безопасного метода входа в систему, при котором сертификат сервера проверяется только в том случае, если шифрование запрашивается в строке подключения.

Ограничения

В Windows базовый драйвер ODBC поддерживает еще одно значение для ключевого слова Authentication — ActiveDirectoryIntegrated, но драйверы PHP не поддерживают это значение в любой платформе.

Пример: подключение с использованием SqlPassword и ActiveDirectoryPassword

Important

Параметр аутентификации ActiveDirectoryPassword (аутентификация по паролю Microsoft Entra ID) устарел в драйверах Microsoft SQL. Этот высокорисковый сценарий аутентификации несовместим с обязательной многофакторной аутентификацией Microsoft Entra (MFA) и может не работать в арендаторах, где требуется MFA. Запланируйте переход на другой метод аутентификации Microsoft Entra.

Microsoft Entra ID проверка подлинности паролей основана на предоставлении учетных данных владельца ресурса OAuth 2.0 ( ROPC), что позволяет приложению войти в систему, напрямую обрабатывая пароль.

Microsoft рекомендует не использовать поток ROPC, так как он несовместим с MFA. В большинстве случаев более безопасные альтернативные варианты доступны и рекомендуется. Этот поток требует высокой степени доверия к приложению и несет риски, которые не присутствуют в других потоках. Используйте этот поток только в том случае, если более безопасные потоки не являются жизнеспособными. Корпорация Майкрософт отойдет от этого потока проверки подлинности с высоким риском, чтобы защитить пользователей от вредоносных атак. Дополнительные сведения см. в статье "Планирование обязательной многофакторной проверки подлинности для Azure".

Когда пользователь присутствует при входе в систему, используйте аутентификацию ActiveDirectoryInteractive или ActiveDirectoryIntegrated, чтобы записи в журнале аудита относились к вошедшему пользователю и применялись политики условного доступа.

Для сценариев взаимодействия между службами без участия пользователя следуйте рекомендациям по использованию служебной учетной записи Microsoft Entra:

  • Если приложение работает в инфраструктуре Azure, используйте ActiveDirectoryMSI (или ActiveDirectoryManagedIdentity в некоторых драйверах). Управляемые удостоверения устраняют затраты на обслуживание и смену секретов и сертификатов.
  • Если управляемое удостоверение недоступно (например, приложение работает вне Azure), используйте ActiveDirectoryServicePrincipal. Если драйвер это поддерживает, предпочтительнее использовать клиентский сертификат вместо секрета клиента. При использовании сертификата закрытый ключ остается на клиенте, и только подписанное утверждение отправляется в Microsoft Entra для проверки подлинности клиента. Если ключ хранится в аппаратном модуле (например, TPM или HSM) или помечен как неэкспортируемый, его нельзя экспортировать в виде строки, как это можно сделать с секретом клиента.
  • Не используйте Microsoft Entra учетную запись пользователя в качестве учетной записи службы.
<?php
// First connect to a local SQL Server instance by setting Authentication to SqlPassword
$serverName = "myserver.mydomain";

$connectionInfo = array("UID"=>$myusername, "PWD"=>$mypassword, "Authentication"=>'SqlPassword');

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Authentication=SqlPassword.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=SqlPassword.\n";
    sqlsrv_close($conn);
}

// Now connect to an Azure SQL database by setting Authentication to ActiveDirectoryPassword
$azureServer = "myazureserver.database.windows.net";
$azureDatabase = "myazuredatabase";
$azureUsername = "myuid";
$azurePassword = "<password>";
$connectionInfo = array("Database"=>$azureDatabase,
                        "UID"=>$azureUsername,
                        "PWD"=>$azurePassword,
                        "Authentication"=>'ActiveDirectoryPassword');

$conn = sqlsrv_connect($azureServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Authentication=ActiveDirectoryPassword.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=ActiveDirectoryPassword.\n";
    sqlsrv_close($conn);
}

?>

Пример: подключение с использованием драйвера PDO_SQLSRV

<?php
// First connect to a local SQL Server instance by setting Authentication to SqlPassword
$serverName = "myserver.mydomain";

$connectionInfo = "Database = $databaseName; Authentication = SqlPassword;";

try {
    $conn = new PDO("sqlsrv:server = $serverName ; $connectionInfo", $myusername, $mypassword);
    echo "Connected successfully with Authentication=SqlPassword.\n";
    $conn = null;
} catch (PDOException $e) {
    echo "Could not connect with Authentication=SqlPassword.\n";
    print_r($e->getMessage());
    echo "\n";
}

// Now connect to an Azure SQL database by setting Authentication to ActiveDirectoryPassword
$azureServer = "myazureserver.database.windows.net";
$azureDatabase = "myazuredatabase";
$azureUsername = "myuid";
$azurePassword = "<password>";
$connectionInfo = "Database = $azureDatabase; Authentication = ActiveDirectoryPassword;";

try {
    $conn = new PDO("sqlsrv:server = $azureServer ; $connectionInfo", $azureUsername, $azurePassword);
    echo "Connected successfully with Authentication=ActiveDirectoryPassword.\n";
    unset($conn);
} catch (PDOException $e) {
    echo "Could not connect with Authentication=ActiveDirectoryPassword.\n";
    print_r($e->getMessage());
    echo "\n";
}
?>

Пример — подключение с помощью токена доступа Microsoft Entra

Драйвер SQLSRV

<?php
// Using an access token to connect: do not use UID or PWD connection options
// Assume $accToken is the valid byte string extracted from an OAuth JSON response
$connectionInfo = array("Database"=>$azureAdDatabase, "AccessToken"=>$accToken);
$conn = sqlsrv_connect($azureAdServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect with Azure AD Access Token.\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Azure AD Access Token.\n";
    sqlsrv_close($conn);
}
?>

Драйвер PDO_SQLSRV

<?php
try {
    // Using an access token to connect: do not pass in $uid or $pwd
    // Assume $accToken is the valid byte string extracted from an OAuth JSON response
    $connectionInfo = "Database = $azureAdDatabase; AccessToken = $accToken;";
    $conn = new PDO("sqlsrv:server = $azureAdServer; $connectionInfo");
    echo "Connected successfully with Azure AD Access Token\n";
    unset($conn);
} catch (PDOException $e) {
    echo "Could not connect with Azure AD Access Token.\n";
    print_r($e->getMessage());
    echo "\n";
}
?>

Пример: подключение с использованием управляемых удостоверений для ресурсов Azure

Использование управляемой идентичности, назначенной системой, с драйвером SQLSRV

При подключении с использованием управляемого удостоверения, назначаемого системой, не указывайте параметры UID или PWD.

<?php

$azureServer = 'myazureserver.database.windows.net';
$azureDatabase = 'myazuredatabase';
$connectionInfo = array('Database'=>$azureDatabase,
                        'Authentication'=>'ActiveDirectoryMsi');
$conn = sqlsrv_connect($azureServer, $connectionInfo);

if ($conn === false) {
    echo "Could not connect with Authentication=ActiveDirectoryMsi (system-assigned).\n";
    print_r(sqlsrv_errors());
} else {
    echo "Connected successfully with Authentication=ActiveDirectoryMsi (system-assigned).\n";
    
    $tsql = "SELECT @@Version AS SQL_VERSION";
    $stmt = sqlsrv_query($conn, $tsql);
    if ($stmt === false) {
        echo "Failed to run the simple query (system-assigned).\n";
        print_r(sqlsrv_errors());
    } else {
        while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            echo $row['SQL_VERSION'] . PHP_EOL;
        }

        sqlsrv_free_stmt($stmt);
    }
    
    sqlsrv_close($conn);
}
?>

Пример: подключение с помощью сервисного субъекта Microsoft Entra

Для проверки подлинности с помощью объекта субъекта-службы потребуется соответствующий идентификатор клиента приложения и секрет клиента.

Драйвер SQLSRV

<?php

$adServer = 'myazureserver.database.windows.net';
$adDatabase = 'myazuredatabase';
$adSPClientId = 'myAppClientId';
$adSPClientSecret = 'myClientSecret';

$conn = false;
$connectionInfo = array("Database"=>$adDatabase, 
                        "Authentication"=>"ActiveDirectoryServicePrincipal",
                        "UID"=>$adSPClientId,
                        "PWD"=>$adSPClientSecret);

$conn = sqlsrv_connect($adServer, $connectionInfo);
if ($conn === false) {
    echo "Could not connect using Azure AD Service Principal." . PHP_EOL;
    print_r(sqlsrv_errors());
}

sqlsrv_close($conn);

?>

Драйвер PDO_SQLSRV

<?php

$adServer = 'myazureserver.database.windows.net';
$adDatabase = 'myazuredatabase';
$adSPClientId = 'myAppClientId';
$adSPClientSecret = 'myClientSecret';

$conn = false;
try {
    $connectionInfo = "Database = $adDatabase; Authentication = ActiveDirectoryServicePrincipal;";
    $conn = new PDO("sqlsrv:server = $adServer; $connectionInfo", $adSPClientId, $adSPClientSecret);
} catch (PDOException $e) {
    echo "Could not connect using Azure AD Service Principal.\n";
    print_r($e->getMessage());
    echo PHP_EOL;
}

unset($conn);
?>

См. также

Использование идентификатора Microsoft Entra с драйвером ODBC

Что такое управляемые удостоверения для ресурсов Azure?