■22/4/6 7:50AM
OAuth/OpenID/SAML/XSS/CSRF/JSOP/SSO/SSL
SAML SSOのログイン状態を保持する認証プロバイダー(IdP)を使い各アプリ(ServiceProvider)でSSOを実現する SSOの仕組みにはエージェント方式、リバースプロキシ方式、代理認証方式など ユーザはWebサービスにアクセス WebサービスからSSO認証プロバイダーサーバにSAML認証要求をPostする SSO認証プロバイダーサーバでSAML認証を解析、ユーザに認証を転送 ユーザはそれでWebサービスにログインする
SAMLはログイン時にユーザー情報をチェック、OAuthはユーザーの情報を登録OAuthはアプリケーションを連動させるAPIで有効なアクセストークンかを見る アクセストークンには「いつ」「どこで」「なんのために」作られたのか分からないOpenIDはIDトークンを使い「いつ」「どこで」「なんのために」作られたのか分かる
OAuth 2.0、OpenID Connect、SAMLを比較OAuth 2.0:新しいアプリケーションに登録して、新しい連絡先をFacebookや携帯電話の連絡先から自動的に取得することに同意した場合は、おそらくOAuth 2.0が使われています。この標準は、安全な委任アクセスを提供します。つまり、ユーザーが認証情報を共有しなくても、アプリケーションがユーザーに代わってアクションを起こしたり、サーバーからリソースにアクセスしたりすることができます。これは、アイデンティティプロバイダー(IdP)がユーザーの承認を得て、サードパーティのアプリケーションにトークンを発行できるようにすることで実現されます。
OpenID Connect:Googleを使ってYouTubeなどのアプリケーションにサインインしたり、Facebookを使ってオンラインショッピングのカートにログインしたりする場合に使用されるのが、この認証オプションです。OpenID Connectは、組織がユーザーを認証するために使用するオープンスタンダードです。IdPはこれを利用して、ユーザーがIdPにサインインした後、他のWebサイトやアプリにアクセスする際に、ログインしたりサインイン情報を共有したりする必要がないようにします。
SAML:SAML認証は、多くの場合に仕事環境で使用されます。たとえば、企業のイントラネットやIdPにログインした後、Salesforce、Box、Workdayなどの多数の追加サービスに、認証情報を再入力せずにアクセスできるようになります。SAMLは、IdPとサービスプロバイダーの間で認証・認可データを交換するためのXMLベースの標準で、ユーザーのアイデンティティとアクセス許可を検証し、サービスへのアクセスの許可/拒否を決定します。OAuth、OpenID Connect、SAMLの違いとは? | Okta
=========================
2016-01-03
■XSS対策、CSRF対策、脆弱性チェック
情報処理推進機構にチェックリスト有
https://www.ipa.go.jp/security/vuln/websecurity.htmlXSS対策
フォーム送信後の確認画面ではHTMLエスケープ等でサニタイズされた内容の結果を表示
DBへのクエリについてはプレースホルダやエスケープ等でSQLインジェクションを防ぐ
target="_blank"はXSSになるので危ない、rel="noopener noreferrer"を付ける
https://b.hatena.ne.jp/entry/s/webtan.impress.co.jp/e/2020/03/13/35510
https://laboradian.com/test-window-opener/
CSRF対策
前ページでhidden値を入れる
他
クッキーに具体的なものは入れない、CookieにHttpOnly属性、HTTPS通信ではsecure属性
エラーメッセージを表示しない
不要なファイルは削除
XMLの外部実態参照は禁止、サーバ上でコードが実行される
→libxml_disable_entity_loader(true)で止める、xmlをアップロードさせない/使用しない、JSON使う
PDFからHTTPリクエストが発行される
→PDFをアップロードさせない
------
//SQLインジェクション対策
\ " ' を\エスケープ
$sql = "UPDATE users SET name='.mysql_real_escape_string($name).'WHERE id='.mysql_real_escape_string ($id).'";
//クロスサイトスクリプティング対策
表示時には<>&"をメタ文字へ変換
echo htmlspecialchars($_GET['username'], ENT_QUOTES);
$ent = htmlentities($ent, ENT_QUOTES, "UTF-8"); //100個の文字を変換
//クロスサイトスクリプティング対策
別サイトからのポストを弾く
refferを送信しないリクエストもある(別サイトのリファラを弾き、nullもしくは適切ページからを許可する)
セッションIDで判断する
//DOS対策
2重ポスト
IPと日付で2重ポストを防ぐ(同IPのポストがx秒以内を弾く)
========
■JSONP
scriptタグを使用してクロスドメインなデータを取得する仕組みのことである。
HTMLのscriptタグ、JavaScript(関数)、JSONを組み合わせて実現される
GoogleAnalyticsのクッキーは1stパーティでサイト側がオーナでありGoogleがオーナーではない
サイト側のJSでクッキーが作成されるようなっている
クッキーが送信される相手はどこか?が重要でGoogleでなくサイト側に送信される
アクセス履歴は別途データをGoogleに送信しており、クッキーはセッション管理に使用される
■SSO
色々な方法がある、SAMLや、サイトにエージェントを組み込み+SSO認証サーバ等
ロジックを確認しないと詳しくは分からない
=========
■SSL【図解】よく分かるデジタル証明書(SSL証明書)の仕組み 〜https通信フロー,発行手順,CSR,自己署名(オレオレ)証明書,ルート証明書,中間証明書の必要性や扱いについて〜 | SEの道標 (nesuke.com)デジタル証明書の仕組み (infraexpert.com)
認証局とは | GMOグローバルサインカレッジ (globalsign.com)
サーバでRSA秘密鍵とCSRを生成し公開鍵を認証局(CA)登録CAはサーバに証明書(署名)を発行====クライアントが接続要求サーバが証明書(署名とRSA公開鍵を含む)を送るクライアントが証明書を検証(
どっち?
1)署名をルート証明書のチェーン(RSA公開鍵)で複合化しドメインを確認
該当のルート証明書(RSA公開鍵)がブラウザにないと該当CAに要求?
CRLやOCSPで失効について問合せができるようだがRSA公開鍵の要求は出来なさそう (ルート証明書はブラウザにある結局オレオレ証明書に違いない:厳密な審査の上で組込まれている)
2)クライアントが公開鍵をサーバに送りRSA秘密鍵で暗号化し送り返すとクライアントが複合化してRSA秘密鍵が正しい事を確認
)クライアントが共通鍵を生成し公開鍵で暗号化し送るサーバが秘密鍵で共通鍵を複合
以降共通鍵暗号で通信 ※ホンマか??
Comment (0)
■22/3/30 7:59PM
GCP runs off functions pubsub on scheduler
run:言語自由、リクエストタイム60分functions:リクエスト9分、関数をデプロイ
gke auto pilot mode:制限がなくなる
■RUNhttpリクエストでコンテナを呼び出すGoogle Cloud Run を使うまで - Qiita
■ハンズオン(run)
クイックスタート: ビルドとデプロイ | Cloud Run のドキュメント | Google Cloud
クイックスタート: Cloud Run に Python サービスをデプロイする | Cloud Run のドキュメント | Google Cloud
http responseを返すコードである必要があるみたいだ
pubsubのpush httpでキックしてもいいかもローカルやterminalなどで作成しcmdでレジストリに入れるが、~/unco で下記作成 Dockerfile .dockerignore main.py
コンテナイメージにパッケージ化しContainer Registry にアップロード gcloud auth application-default login
gcloud run deploy (対話型でデプロイまでできるが、SAはデフォルトになる)
gcloud builds submit --tag gcr.io/bangboo-run/unco (ビルドのみ、手動でコンソールでSAを指定しデプロイする)
コンソールでデプロイ(trigger/permission)-新ver更新のときTagを付けなおす?
設定allow all traficとrequire auth(IAM)、権限allAuthenticatedUsersにCloud Run Invokerでブラウザアクセス駄目 設定allow all traficとAllow unauthenticated invocations、権限allUsersにCloud Run Invokerではブラウザでも上手行く 設定allow all traficとrequire auth(IAM)、権限allAuthenticatedUsersにCloud Run Invokerのとき IAMが要るのでターミナルから curl https://unco-zp2aehj5rq-an.a.run.app/ ではIAM要求の場合は駄目 curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://unco-zp2aehj5rq-an.a.run.app/ で上手行く 設定allow internal trafic onlyとrequire auth(IAM)、権限allAuthenticatedUsersにCloud Run Invokerのとき IAMが要るのでターミナルから curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://unco-zp2aehj5rq-an.a.run.app/ でも駄目インターナルでIAMを使うにはどする?(vpcかvpc scかpubsubかEventarcだけ?terminalやschdulerは駄目? →IAMを使うようにすればallow all traficでいいのでは、allusersにinvokerを付与しなければいいし
→怖ければVMを立ててそこからキック)
runのデフォルトのSAは別のrunでも同じSA実行として使い回されるので、別途作成したものを指定したい デプロイをコンソールで実行するとサービスアカウントを指定できる(runのPermissonでそのSAにinvokerを付ける)ブラウザ+IAMをrunで使うにはIAP
global ip、ドメイン、DNS、証明書、設定allow all traficとrequire auth(IAM)、権限各メールidにinvokerLBはバックエンドにserverless network end groupを選べばいい
===
dockerfileに記載FROM google/cloud-sdk:latest
PythonモジュールでなくOS側にインストールする必要がありコンテナ化のDockerfileに記載できる
/// BANGBOO BLOG /// - k8s にDocker記載がある
python requirements.txtでは google-cloud-bigqueryはインスコできるがsdkは無理 main.pyに from google.cloud import bigquery Dockerfileでイメージでgoogle-cloud-sdkが入ればPythonのsubprocessでgcloud cmdが打てる Dockerのベースイメージを FROM google/cloud-sdk:latest にして RUN apt-get update && apt-get install -y \ python3-pip RUN pip install --no-chache-dir -r requirements.txt Cloud API client library for pythonを使うにはrequirements.txtに google-api-python-client
Dockerfileの動作はCloud buildのhistoryで見れるRUN which gcloudRUN echo $PATHRUN who
Cloud runのpython動作はloggingで見るPython 用 Cloud Logging の設定 | Google CloudGoogle Cloud Logging Python v3.0.0 スタートガイド | Google Cloud Blog
OSの実行ユーザとコンテナ内のユーザを合わせないとファイル読み込み等ができない permission deniedになる Cloud runのそれぞれのユーザが誰なのか分からない(上記でわかるが) Dockerfileに RUN chmod -R 777 /app と入れてしまう
===
Cloud Run のトリガーを作成する | Eventarc | Google Cloudrunとscheduler/pubsubの連携は eventarc triggerの設定が必要そう 設定したrunのサービスのトリガー項目に google.cloud.scheduler.v1.CloudScheduler.Run.Jobを設定(スケジューラなら)
色んなAPI有効が必要 クイックスタート: Pub/Sub メッセージを使用してイベントを受信する(Google Cloud CLI) | Eventarc
■Scheduler
get で https://run-service-name-.kuso.run.app 0 7 * * 1 毎週月曜の6時 Auth headerに add OIDC token runのサービスにinvokerを付けたSAを指定 5回リトライ/最大リトライ0sで制限なし/バックオフ最小180s最大1h/期間倍5回
http経由ならデフォルトのサービスアカウントにCloud service agentロールが必要
===■Run jobs
runはジョブならFlask不要Cloud Run Jobs を解説する by Kazuu Shinohara | google-cloud-jp (medium.com)クイックスタート: Cloud Run で Python ジョブをビルドして作成する | Cloud Run のドキュメント | Google Cloud
Procfile作成web: python3 main.py
pipしたいものは requirements.txtに書くgoogle-cloud-bigquery
main.py作成コードを書く from google.cloud import bigquery
gcloud auth application-default login run job実行とコンテナのプロジェクトを合わすなら gcloud config set project bangboo-runs 下記は通常不要なようだ
gcloud auth configure-docker
Buildpackを使用してコンテナをビルド Cloud buildデフォルトサービスアカウントにGCSバケット権限必要 123456@cloudbuild.gserviceaccount.comgcloud builds submit --pack image=gcr.io/bangboo-runs/run_data_to_bq bangboo-runsのコンテナレジストリにrun_data_to_bqができている
Cloud runでジョブを作成gcloud beta run jobs create job-run-data-to-bq \ --image gcr.io/bangboo-runs/run_data_to_bq \ --task 1 \ --set-env-vars SLEEP_MS=10000 \ --set-env-vars FAIL_RATE=0.5 \ --max-retries 0 \ --region asia-northeast1(gcloud beta run jobs create --helpで見るとenv-varのハンドルは何もないのでコードでエラースローする必要がありそう、そこでスリープとか使ってエラーを吐くと、リトライはしてくれそう。taskを複数にすると同時に何個も動く)
ローカルでテストdocker run --rm -e FAIL_RATE=0.9 -e SLEEP_MS=1000 gcr.io/bangboo-runs/run_data_to_bq
Cloud runでジョブを実行gcloud beta run jobs execute job-run-data-to-bq
============
■Flaskfrom flask import Flask #モジュール読み込みapp = Flask(__name__) #Webアプリ作成@app.route("/") #エンドポイント設定(ルーティング)def index():if __name__ == '__main__': #Webアプリ起動 app.run(debug=True)
============
■functions
コンソールでコード書いてもデプロイエラーになると入力分が消える糞
テキストで書いてコンソールにペーストしてやったfunctionsもhttpで初めに実行される関数はFlaskのflask.Requestオブジェクトを受取るrequirementsは必要?import文を本体に書いていれば良さそう
標準ライブラリ以外はrequirementでインスコでは? pprint.pprintでエラー、requirementの場合バージョンも必要そう一時ファイルは/tmpというDIRであるがメモリーに保持されるテストでJSONを書く場合はキッチリ書く(文字はダブルクォート等){"test" : "aaa"}functions invoker等のIAMはプロジェクトレベルではなく各functionsに対しての設定が必要そうfunctionsのデプロイ時にinternal trafic や allow all trafic等の変更ができる
functions で gcloud cmdが打てない、SDKがないから クライアントライブラリでは? > 非力そう、、cloud runならgcloud cmd打てるようだ
Cloud クライアント ライブラリ | Cloud APIs | Google Cloud
functionsはちょっとした加工程度しか無理?逆にgcloud cmdはダメだが、requirementでライブラリはpipインスコ自由では?
■pubsub
GCP - Pub/Sub サービス概要 - Qiitatopicという入れ物 メッセージがpublish投入される(コンソールでも作れるのでinternal traficのトリガーにできる) subscriptionでTopicのデータ取得状況を管理 subscriptionからsubscribeでメッセージの取得メッセージは重複する仕様 Topicにメッセージを入れると勝手に紐づけられたアプリが動く フィルターがあり条件を設定をできるがTopicを沢山作ればいいのでは サブスクのpullはメールボックスみたいな入るだけ functionsのpubsubで作った指定のTopicにメッセージが入れば動く サブスクのpushも送信メールボックスみたいで送る functionsのhttpで作ったエンドポイントに送られる
pullは謎に上手く行かなくなる?pushの方が安定かも でもトラフィックの種類でpullならinternal trafic OK pubsub pull -> functions:pull なら internal traficでもOK pubsub push -> functions:push は http なので internal traficダメ functionsのデプロイ時にinternal trafic や all等の変更もできる
Comment (0)
■22/2/26 2:52AM
GCP script
■gcloud cmd プロジェクト一覧
gcloud projects list --filter="bangboo OR fucu" --format=jsongcloud projects list --filter="bangboo OR fku" --format=json | grep -oP '(?<="name": ")[^"]*'
■pythonでgcloud cmd, 同期処理の方法(run)と非同期処理の方法(Popen)Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ | DevelopersIO (classmethod.jp)
--terminalでpython cmd.py python3.7どう?
import json
import subprocess
from subprocess import PIPEp = subprocess.Popen(cmd , shell=True, stdout=subprocess.PIPE)
out, err = p.communicate()
out = json.loads(out)
[Python2.7] subprocess の使い方まとめ - Qiita
python2.7やとちょい違うみたい、pipenvでバージョン管理したい?--terminalでpython cmd.pyimport subprocessfrom subprocess import callcmd = 'gcloud projects list --filter=bangboo --format=json'subprocess.call(cmd, shell=True)
--runでcurl、cmd結果をPIPEで受けたいがimport osimport subprocessfrom subprocess import callfrom flask import Flaskapp = Flask(__name__)@app.route("/")def hello_world(): name = os.environ.get("NAME", "World") cmd = 'gcloud projects list --filter=bangboo --format=json' output = ' will die' subprocess.call(cmd, shell=True) name = "Hello {}!".format(name) output = name + output return outputif __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
■pythonでbigqueryPython Client for Google BigQuery — google-cloud-bigquery documentation (googleapis.dev)BigQuery API Client Libraries | Google CloudGoogle クライアントライブラリ for Python で、BigQuery のデータセットやテーブルなどのメタ情報を取得してみた | DevelopersIO (classmethod.jp)
--bq.py python3 bq.py でteminal実施可能from google.cloud import bigqueryclient = bigquery.Client()QUERY = ( 'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` ' 'WHERE state = "TX" ' 'LIMIT 100')query_job = client.query(QUERY)rows = query_job.result()for row in rows: print(row.name)
Comment (0)
Navi: < 1 | 2 | 3 | 4 >
-Home
-Column [122]
-Europe [9]
-Gadget [73]
-Web [118]
-Bike [3]
@/// BANGBOO BLOG ///