ピロローグ

主に技術ネタについて書いてみる

特定のURLのみBasic認証を無効にする

テスト環境や、特定のユーザのみにサイトを公開したいときにBasic認証等でアクセス制限を掛けるケースがあると思いますが、一部のURLのみBasic認証を無効にしたいとの要望がありましたのでその時の設定方を記録しておきます。

Satisfy Any

SetEnvIf Request_URI "^/hoge/*" ok_dir
SetEnvIf Request_URI "^/index.php" ok_dir

Order Deny,Allow
Deny from all
Allow from env=ok_dir

AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /pass/to/.htpasswd
require valid-user

リクエスURIとして環境変数を設定。環境変数にはBasic認証の無効としてURIのパスとLaravelのエントリポイントをセットする。

Azure CLIを使って仮想アプリケーションとディレクトリを変更する

チュートリアル:Azure で PHP と MySQL アプリを構築する | 仮想アプリケーション パスを設定する を参考に仮想ディレクトリを変更しようとしたらつまずいた。 どうやらURLが正しくないみたい。

az resource update --name yourproject --resource-group yourprojectrg --namespace Microsoft.Web --resource-type config --parent sites/<app_name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01
Operation failed with status: 'Not Found'. Details: 404 Client Error: Not Found for url: https://management.azure.com/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourcegroups/yourprojectrg/providers/Microsoft.Web/sites/yourproject/config/yourproject?api-version=2015-06-01

Resource Explorerから該当のリクエストURLを確認したところリソースIDの形式がマッチしてない模様。

https://management.azure.com/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/yourprojectrg/providers/Microsoft.Web/sites/yourproject/config/web?api-version=2018-02-01

力技ですが、az resource updateコマンドでidsオプションでリソースIDを指定することで対応した。 ※合わせてapi versionの日付も修正

subscription_id=$(az account show --query id)
az resource update --ids "/subscriptions/${subscription_id}/resourceGroups/yourprojectrg/providers/Microsoft.Web/sites/yourproject/config/web" --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2018-02-01

期待通りになっている。

f:id:pir0:20190131205611p:plain
仮想アプリケーションとディレクト

上記を使えば追加もできそう。

VNet Integrationを利用してWeb apps とAzure Databaseを接続してみる

現在Web apps - Azure Database間はAzureのデータセンターネットワークを通じ接続する仕様となっているかと思いますが、先日プレビューで公開された New App Service VNet Integration feature を利用してVNet、サービスエンドポイント経由で接続できるかやってみました。
イメージ的には以下の通りです。

f:id:pir0:20190129102947p:plain
イメージ

準備

まずは各リソースを用意します。

f:id:pir0:20190128125601p:plain
リソース一覧
Web apps(App Service)はWin版をS1で設定。Azure DatabaseはMySQL版を汎用プランで設定しました。

VNetはサブネットをWeb appsのみ用意します。 Azure Databaseとサービスエンドポイント経由で接続するため、サービスの設定をお忘れなく。

f:id:pir0:20190128152405p:plain
サブネット詳細

VNet統合設定

VNetの追加(プレビュー)からVNet, サブネットをそれぞれ選択し、設定します。

f:id:pir0:20190128131017p:plain
VNet統合

完了後はこちら。

f:id:pir0:20190128131209p:plain
VNet統合設定完了

Azure Database VNet追加

続いてAzure DatabaseのVNetルールに先程のサブネットを追加します。

f:id:pir0:20190128151012p:plain
VNetルール追加

ファイアウォール規則も追加してみました。

f:id:pir0:20190128151300p:plain
VNetルール追加後
SSLは簡略化のためオフにしてますが、要件に合わせて設定ください。  

接続確認

以下テストスクリプトを用意し、Webappsの公開ディレクトリ(wwwroot)直下に配置します。  

<?php

// データベース接続チェック
// 接続情報は予め仕込んだアプリケーション設定から取得しております。
$dbc = mysqli_connect(getenv('CUSTOMCONNSTR_db_host'), getenv('CUSTOMCONNSTR_db_user'), getenv('CUSTOMCONNSTR_db_password'), getenv('CUSTOMCONNSTR_db_name'));
//echo ($dbc);
if (!$dbc) {
die('db connection failed \n'.mysql_error());
}
echo('DB connect success!! <br>');

// userテーブルからユーザ名を取得する
$sql = "select user from user;";
if ($result = $dbc->query($sql)) {

while ($row = $result->fetch_assoc()) {
echo $row["user"]. "<br>";
}
// 結果セットを閉じる
$result->close();
}

if (mysql_close($dbc)){
echo 'disconnect success!! \n';
}
?>

  ブラウザでアクセスしてみます。

f:id:pir0:20190128151952p:plain
ブラウザ表示結果
ユーザ一覧が取得できてますね。

ちなみに外部からアクセスできないか確認してみます。

$ mysql -h vnetintegrationtest.mysql.database.azure.com -u vnetintegration@vnetintegrationtest -p
Enter password:
ERROR 9000 (HY000): Client with IP address 'x.x.x.x' is not allowed to connect to this MySQL server.

もちろんですが、できないですね。

2019/1/28時点でまだプレビュー段階ですが、GAが待ち遠しいです。 Webapps - Azure Database間をよりセキュアに接続したい要件などありましたら検討してみてはいかがでしょうか。