■23/5/29 7:30PM
GCP hands-off 2
■プロジェクト削除時のサービスアカウントプロジェクト縺?30日臀??留される。その間サービスアカウント権限は生きており他プロジェクトでは動作する。しかし保留期間はプロジェクトを使用できずサービスアカウントを削除できず、個別に臀??つ臀??つ権限をはく奪するしかない。
サービスアカウントはプロジェクト削除前に、必要であれば臀??前に削除や無効化してお縺?ことも検險?する。
■連謳?
GoogleWorkspace -> GAS -> GCP Oauth + API -> GCP(Bigquery etc.)Python -> Gcloud sdk -> gcloud auth -> GCP(Bigquery etc.) <-> federation query/Connected sheet
Python(Oauth key) -> GCP認証情蝣?(Oauth Key) + API -> GoogleWorkspace
GCPのクレデンシャルページ縺?Oauth2.0 client IDと鍵が発鐔??でき、鍵でイケる
Pythonコードで鍵を指定すると藹??行時にログインを求められ、client IDとユー繧?IDを紐づけして藹??行することになる Authentication — gspread 5.7.2 documentation
Python でシンプル縺? OAuth 2 する (urllib + oauthlib) - Qiita
GCPのクレデンシャルページ縺?APIキーも発鐔??でき、これは可能性はあるPython -> local csv/tsvが基譛?
笳?Python(SA key) -> GCP認証情蝣?(SA Key) + API -> GoogleWorkspace
サービスアカウント縺?GWSにアクセスできないのでダ繝?
信頼しているドメインとのみ藹??部共有を許可する - Google Workspace 管理者 ヘルプ
サービ繧? アカウント(ドメイン名の末尾が「gserviceaccount.com」)を信頼しているドメインにすることはできません
OUで許可するとイケるはずだが、、
笳?Python 縺?Google docをイジるGoogle Docs APIを使って文章を作成してみる - より良いエンジニアを目指し縺? (hatenablog.com)Google Docs APIを使って、索藹??を作成する #Python - Qiitaスコープ情蝣? Google API 縺? OAuth 2.0 スコープ | Authorization | Google for Developers下記縺?URLの内容を検証すればよいPython のクイックスタート | Google Docs | Google for DevelopersGoogle Cloudコンソール縺?Oauth同諢?画面を設藹??Google Docs APIを有効化OAuth クライアントIDを作成シークレットJson ファイルができるの縺?DL(リネーム)コードにクレデンシャ繝?JSONファイル縺?Doc縺?URLに含まれるdocumentIDを記霑?→Python実行する縺?Docのデータが藹??れる(ローカルの場合は楽)
/// runのデプロイ時に設定を入れる方觸??につい縺?1)環藹??変数を(コンソー繝?/cmd/コンテナymiのどれか縺?)設藹??:env=os environ.get("ENV") で使う。ログに出やす縺?非推螂?2)シークレットマネージャ臀??存分を設藹??環藹??変数・??コードでやるのと同じ?3)ボリュームを使う:クレデンを入れ、トークンの臀??時保存ができる?Cloud Run縺?Secret Managerを使いたい #Python - Qiita
※サービスアカウント縺?GWSを扱うに縺?GWS縺?OUで藹??け入れる設藹??が必要な場合がある
■secret managerに臀??存してコードで呼び出して使う Secret Managerのシークレットアクセサー権限 シークレット バージョンにアクセ繧? | Secret Manager Documentation | Google Cloud (checksumをかけている)
from google.cloud import secretmanagerimport google.cloud.loggingimport loggingdef get_url(secret_key, project_num) logging.warning('####### secret_key' + str(secret_key) + '######') client = secretmanager.SecretManagerServiceClient() resource_name = "projects/()/secrets/()/versions/latest.format(project_num, secret_key) res = client.access_secret_version(resource_name) slack_url = res.payload.data.decode("utf-8") return slack_url
■API等でデータを藹??った時中身が分からない場合pramsが何か繧?からん時print(params)print(type(params))#<class 'proto.marshal.collections.maps.MapComposite'>#よ縺?繧?からんクラスでもdirで臀??持するAttributeが分かるattributes = dir(params)print(attributes)#そこに含まれるメソッドも確鐔??できるの縺?helpするhelp(params.get) #prams.get('query')すると含まれるSQLが分かりこれで進める等
■Protocol buffersAPIの鐔??り縺?Googleは自社で開発したProtocol buffersを使っていようだたとえば臀??記が返るname: "projects/98765"parent: "folders/12345"project_id: "aaaaaa-bbbb-market"state: "ACTIVE"display_name: "aaaaaa-bbbb-market"create_time{ seconds: 1601250933 nanos: 820000000}update_time{ seconds: 1632826231 nanos: 634000000}etag: "W/a06910d9093db111"labels{ key: "budget_group" value: "cccc"}
これ縺?print (type(response))すると臀??記であり<class "google.cloud. resourcemanager v3.types.projects.Project"> print (response.project_id) で簡単にデコードし値藹??得できることが分かる
APIからの値を藹??るときのコードfrom google.cloud import resourcemanager_v3client = resourcemanager_v3.ProjectsClient()request resourcemanager v3.ListProjectsRequest{ #組織の場合、現状は権限がGOP側で用諢?がな縺?無理だった #parent organizations/12345678. parent="folders/1122233344"}page_result = client.list_projects(request=request)for response in page result: print(type(response)) print (response.project_id)
エンコードする場合 https://blog.imind.jp/entry/2019/12/28/124728pip install googleapis-common-protos でインスコ・??sudo apt install protobuf-compiler でインス繧?
sudo apt-get install protobuf-compiler でインス繧? 窶?google觸??供のフォルダごと使用しようとして失敗した方觸?? 窶?googleapis/google/cloud/resourcemanager/v3/projects.proto at master · googleapis/googleapis · GitHub ※縺?protoファイルがあるが丸々必要なので臀??記縺?DL 窶?git clone https://github.com/googleapis/googleapis.git ※バスを合繧?せ縺?projects.protoを使うが失敗 ※たとえ縺? protoc python_out=. --proto_path=googleapis ./googleapis/google/cloud/resourcemanager/v3/projects.protoprojects.proto を下記の内容で臀??から作成することが必要だったsyntax proto3;
message Resource{ string name = 1; string parent = 2; string project_id = 3; string state = 4; string display_name = 5; map<string, string> create_time = 6; map<string, string> update_time = 7; string etag = 8; map<string, string> labels = 9;}そして臀??記を実行しコンパイ繝?protoc --python_out=. ./projects.protoprojects_pb2.pyが生成されるため、パッケージとして読みこ縺?protocol buffersを実行できるようになるimport projects_pb2.py※なおエラー縺? pip install U protobuf=3.20.0でダウングレードした
注諢?点としては、python縺?protocol buffer縺?Bigqueryの型合繧?せが必要 DateやTimestamp縺?UNIXエポックからの日数や秒数に藹??觸??する必要がある Noneをstr 'None'や、int -1や、bool False縺?Pythonで調整をするBigQuery Storage Write API を使用してデータを一括読み込み、ストリーミングする | Google Cloud
//UNIXエポックからの日謨?current_date = datetime.now()epoch = datetime(1970, 1, 1)record_date = (current_date - epoch).days
//UNIXエポックからの軆??謨?data_string = str(date_v)dt_obj = datetime.fromisoformat(date_string.replace("Z","+00:00"))epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)seconds_since_epoch = (dt_obj - epoch).tatal_seconds()microseconds_since_epoch = int(seconds_since_epoch * 1e6)date_v = microseconds_since_epoch
■BQ APIクォータ割り当て鐔??驕?(1000莉?insertしようとした)割り当てと臀??限 | BigQuery | Google Cloudテーブル藹??譖?1譌?1500件ま縺?テーブルメタデータ藹??更縺?10sあたり5回ま縺?テーブル藹??たりDMLの藹??行待ちキュー縺?20件ま縺?テーブル藹??たり10sあたり25縺?DMLま縺?→各insertでスリープを5秒入れた import time time.sleep(5)
↓
上限がテーブル単位のためテーブル名を分けると回避できるらしいGCP BigQuery 応用編 ~制限につい縺?~ - 自称フルスタックエンジニアのぶろぐ。 (hatenablog.com)
↓■BQ streaming insert->BQ storage read/write APIの臀??限縺?DMLと別で、閾値が大きい
streaming insert -> Bigquery storage write API を使うINFORMATION_SCHEMAを用いたBigQueryのストレージ無饅??遣い調譟? - ZOZO TECH BLOGBigQuery Storage Write API を使用してデータを一括読み込み、ストリーミングする | Google Cloud
Storage Write API を使用したデータ読み込みのバッチ処理 | BigQuery | Google Cloud
CreateWriteStream > AppendRows(ループ) > FinalizeWriteStream > BatchCommitWriteStreams
をstart/append/send/close(write commit)の関数化し返り値でつなげた形にしたが sendをした後 proto_rows = types.ProtoRows() を觸??け初期化する必要があった(offsetが倍々で藹??えたから)offsetで送信觸??の開始行の設定も必要(一連の処理で件数を記憶しており0固藹??で処理を書けないようだった)
■Python/Client libraryの値をBQに入れるにあたり仕様書で型を調べる。STRUCTやクラスは軆??解いて通常のカラム縺?BQに挿蜈?timestampやboolやint64はそのままの形縺?BQに挿蜈?BQ SQL:日臀??は値なしならNULLを入れる、数値やBool値はクォートで囲まないPython縺?SQLインサート文を作るとき改鐔??コードが含まれるものをセットする縺?Syntax errror:Unclosed string literalq = q.replace('//', '////') バックスラッシュをエスケープ、あるとイリーガルエスケープシーケンスとなる、raw文字列にしたい?
q = q.replace('/n', '//n') 改鐔??をエスケープq = q.replace("'", "\\'") SQLが途切れないようシングルクォートをエスケープq = q.replace('/n', ' ') 改鐔??を空白で置き觸??える
■変更の判譁?
変更で問題がでないか→PCにマウスと臀??けて問題が起こらないかという問題と相似、最終的に軆??験で判断するしか
■監査ログからSetIamのメソッドを藹??りBQ権限付荳?を検知するクエ繝?
WITH source AS(SELECT*FROM `project-logging.organization_audit_log_v2.cloudaudit_googleapis_com_activity_20*`WHERE_TABLE_SUFFIX = format_date('%y%m%d', current_date("Asia/Tokyo"))),project source AS(SELECTROW_NUMBER() OVER (ORDER BY timestamp) as id,*FROM sourceWHEREprotopayload_auditlog.methodName = 'SetlamPolicy'project_authorizationinfo AS(SELECTDISTINCTid,__ori.resource.type as type,__ori.resource.labels.project_id as project_id,__ori.resource.labels.dataset_id as dataset_id,protopayload_auditlog.methodName as method_nameprotopayload_auditlog.resourceName as resource_name,protopayload_auditlog.authenticationInfo.principal Email as email_manipulator,authorizationInfo.resource as request_resource,authorizationInfo.permission as request_permission,authorizationInfo.granted as request_granted,protopayload_auditlog.requestMetadata.callerlp as callerlp,protopayload_auditlog.requestMetadata.callerSuppliedUserAgent as callerSuppliedUserAgent,FROM project_source AS __ori). UNNEST (protopayload_auditlog.authorizationInfo) AS authorizationInfoproject_bindingdeltas AS(SELECTid,--array_binding Deltas_project as binding Deltas_project,array_binding Deltas_project.action as action_project,array_binding Deltas_project.member as member_project,array_binding Deltas_project.role as role_project,timestampFROM project_source AS_ori,UNNEST (protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas) AS array_binding Deltas_project),project_setiam AS(SELECT--*, except(id)type,project_id,dataset_id,method_name,resource_name,email_manipulator,request_resource,request_permission,request_granted,callerip,callerSuppliedUserAgent.action_project,member_project,role project.CAST(NULL AS STRING) AS metadataJson,CAST(NULL AS STRING) AS bindingDeltas_dataset,CASTINULLAS STRING AS action_dataset,CAST(NULL AS STRING) AS member_dataset,CAST(NULL AS STRING) AS role_dataset,CAST(NULL AS STRING) AS bindingDeltas_table,CAST(NULL AS STRING) AS action_table,CAST(NULL AS STRING) AS member_table,CAST(NULL AS STRING) AS role_table,timestampFROM project_authorizationinfoLEFT JOIN project_bindingdeltas ON project_authorizationinfo.id = project_bindingdeltas.idWHERE role_project LIKE 'roles/bigquery%),resource_source AS (SELECT__ori.resource.type as type,__ori.resource.labels.project_id as project id,__ori.resource.labels.dataset_id as dataset_id,protopayload_auditlog.methodName as method_name,protopayload_auditlog.resourceName as resource_name,protopayload_auditlog.authenticationInfo.principalEmail as email_manipulator,authorizationInfo.resource as request_resource,authorizationInfo.permission as request_permission,authorizationInfo.granted as request_granted,protopayload_auditlog.requestMetadata.callerlp as callerlp,protopayload_auditlog.requestMetadata.callerSuppliedUserAgent as callerSuppliedUserAgent,protopayload_auditiog.metadataJson,timestampFROM source AS __ori,UNNEST(protopayload_auditlog.authorizationInfo) AS authorizationInfo WHEREprotopayload_auditlog.methodName = 'google.iam.v1.IAMPolicy.SetlamPolicy' --AND timestamp= "2024-03-11 04:11:30.885258 UTC"),resource_id AS (SELECTROW_NUMBER() OVER (ORDER BY timestamp) as id,*FROM resource_source),resource_bq_dataset AS (SELECTid as id_dataset,json_extract(metadataJson, '$.datasetChange bindingDeltas') as bindingDeltas_dataset,json_extract(array_bindingDeltas_dataset, '$action') as action_dataset,json_extract(array_bindingDeltas_dataset, $.member') as member_dataset,json_extract(array_bindingDeltas_dataset, '$.role') as role_dataset,FROM resource_id,UNNEST(json query_array(metadataJson, '$.datasetChange.bindingDeltas')) AS array_bindingDeltas_dataset),resource_bq_table AS (SELECTid as id table,json_extract(metadataJson, '$.tableChange.bindingDeltas') as bindingDeltas_table,json extract(array_bindingDeltas_table, '$.action') as action table,json_extract(array_bindingDeltas_table. '$.member') as member table,json_extract(array_bindingDeltas_table, '$.role') as role_table,FROM resource_id,UNNEST(json query_array(metadataJson, '$.tableChange.bindingDeltas')) AS array_bindingDeltas_table),resource_setiam AS ( SELECT--*except(id, id_dataset, id_table)type,project_id,dataset_id,method_name,resource_name,email_manipulator,request_resource,request_permission,request_granted,callerlp,callerSuppliedUserAgent,CAST(NULL AS STRING) AS action_project,CAST(NULL AS STRING) AS member_project,CAST(NULL AS STRING) AS role_project,metadataJson,bindingDeltas_dataset,action_dataset,member_dataset,role_dataset,bindingDeltas_table,action_table,member_table,role_table,timestampFROM resource_idLEFT JOIN resource_bq_dataset ON resource_id.id = resource_bq_dataset.id_datasetLEFT JOIN resource_bq_table ON resource_id.id = resource_bq_table.id_table)SELECT * FROM project_setiamUNION ALLSELECT * FROM resource_setiam
■BQからCloudSQLにデータを入れる (GCSを経由する、コマンドやPythonがあるbq query --use_legacy_sql=false 'CREATE OR REPLACE TABLE `prj.ds._table` AS SELECT FROM `prj.ds.view`';bq extract -destination_format CSV 'prj.ds._table' gs://bucket/tbl.csvgcloud sql import csv インスタンス名 gs://bucket/tbl.csv --database=データベース名 --table=テーブル名
■ログの重複をな縺?す
import google.cloud.loggingimport logging
# クライアントの臀??成client = google.cloud.logging.Client()
# Cloud Logging 繝?ンドラを追加client.get_default_handler()client.setup_logging()
# 既藹??の繝?ンドラをすべて削髯?for handler in logging.root.handlers[:]: logging.root.removeHandler(handler)
# 新しい繝?ンドラを追加logging.basicConfig(level=logging.INFO)
# logging.basicConfig(level=logging.DEBUG) # DEBUG レベルからすべてのレベルを記骭?
# propagate を無効にして重複を防ぐlogger = logging.getLogger()logger.propagate = False
# 各ログレベルでテストlogging.debug('This is a DEBUG log')logging.info('This is an INFO log')logging.warning('This is a WARNING log')logging.error('This is an ERROR log')logging.critical('This is a CRITICAL log')
■何度かAPIコールを繰り返す
def safe_replace_text(document_id, old_text, new_text, max_attempts=3): for attempt in range(max_attempts): try: replace_text(document_id, old_text, new_text) break # 成功した場合はループを抜ける except Exception as e: print(f"Attempt {attempt + 1} failed: {e}") if attempt == max_attempts - 1: print("Reached maximum attempts.")
■Exponential Backoffで時間を指数軆??数的にゆら縺?ながら増やすリトラ繧?import timeimport randomdef exponential_backoff(max_retries=5, base_wait_time=1, max_wait_time=32): retries = 0 while retries < max_retries: try: # APIリクエストの送菫? response = send_request() if response.status_code == 200: return response # 成功時に軆??果を返す except Exception as e: wait_time = min(base_wait_time * (2 ** retries), max_wait_time) wait_time += random.uniform(0, 1) # ランダムなズレを追加(Jitter) print(f"Retrying in {wait_time} seconds...") time.sleep(wait_time) retries += 1 raise Exception("Max retries reached, request failed")
クォータの藹??加の臀??頼もできるが、基本的に臀??記の臀??限がある
1. Google Docs API の利用臀??限- ユーザーごと縺?1分あたりのリクエスト謨?:
- プロジェクトごと縺?1日あたりのリクエスト謨?:
- プロジェクトごと縺?1譌?100万リクエスト(デフォルト)
これらの制限を超えると、リクエストが拒否されるか、APIを利用できな縺?なることがあります。
2. Google Drive API の利用臀??限- ユーザーごと縺?100秒あたりのリクエスト謨?:
- プロジェクトごと縺?1日あたりのリクエスト謨?:
- ユーザーごとのデータ転送驥?の制限:
- 読み込み縺?750GB/譌?/ユーザ繝?
- 書き込みはユーザーごとの制限が異なるため、大驥?のデータ処理を行う場合は注諢?が必要
Comment (0)
■23/2/11 1:46AM
HSTS/CORS/CSPOAuth/OpenID/SAML/XSS/CSRF/JSOP/SSO/SSL/SVG/JWT/WebAssembly
2024-10-6
クレカ情報の觸??出があったタリーズオンラインストア縺?Webアーカイブから藹??因を特藹??した猛者が現れる→集まった有識者たちにより巧藹??な手口が譏?らか縺? - Togetter [トゥギャッタ繝?]
レスポンスヘッダー縺? Content-Security-Policy が適切に設定されていれば防げた可能性は饅??い。具臀??的に縺?笆? connect-src ディレクティブの設定スクリプトからの藹??部リソースへの通信先を制限して、マルウェアが悪諢?あるドメインにデータを送信するを防ぐ。例. Content-Security-Policy: connect-src 'self' https://api.trustedservice.com;笆? eval() の軆??豁?Content-Security-Policy はデフォルト縺? eval() の使用を禁止しているが、 'unsafe-eval' を指定することで許可できる。
slick.jsのライブラリに臀??込まれていたので、管理者がやったんじゃないの・??slickスライダー藹??装まとめ16選【サンプル臀??き】 - じゅんぺいブロ繧? (junpei-sugiyama.com)
2024-7-5
Webサービス公開前のチェックリスト (zenn.dev)
2023-02-11
フロントエンド開発のためのセキュリティ入門 - Speaker Deck
HTTP縺?HTTPSが混ざっているwebサイト縺?HSTS(http strict transport securityヘッダ)縺?HTTPS強制できる JS縺?fetch,xhr/iframe/canvas/WebStorage,IndexedDBでクロスオリジンは危髯? Access-Control-Allow-Originレスポンスヘッダ縺?CORS(cross origin resource sharing)許可を判藹??できる CSP(Content-Security-Policy)レスポンスヘッダある縺?metaタグで許可するJSを判藹??できる
SVG
SVG Repo - Free SVG Vectors and Icons
Vector Icons and Stickers - PNG, SVG, EPS, PSD and CSS (flaticon.com)
SVGはテキストファイルなので開いてタグとして使える
ChatGPT縺?SVGでお絵觸??きさせる|temoki / Tomoki Kobayashi (note.com)
タグで図が書ける
SVGファイルについ縺? (zenn.dev)
sizeを決め縺?viewBoxの座標を設藹??するのがやりやすい
JWT (JSON WEB TOKEN?)
JWTセキュリティ入門 - Speaker Deck
WebAssemblyとは・??〜実際縺?C言語をブラウザで動かす〜【2019蟷?6月版】 #JavaScript - Qiita
コンパイルしてバイナリをWebで藹??行する、速いJSみたいな、ゲームやエミュやCアプリ的な奴
=========================
2022-04-06
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
Oath: idpがトークンを発鐔??、Webサイト間でユーザを認識し3rdからでも個人情報を使えるようになるOpenID(OIDC): idp縺?JWT(トーク繝?)で鐔??証するOauth系縺?SSO、Oauthの拡張でログインが3rdからもできるようになるSAML: idpで各アプリやAD間をXMLメッセージにより認証管理しSSOを実軆?? OpenID縺?SAMLが同じような觸??閭? SAMLはユーザ固有の傾向で大企讌?SSOが多い、OpenIDはアプリ固有の傾向縺?Webサイトやモバイルアプリが多い SAMLよりOIDCの方が新し縺?SPAやスマホと親和性が高い SaaSとし縺?OpenID縺?Okta縺?idp、SAML縺?PingFederate縺?idpがメジャ繝?
=========================
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).'";
\ " ' を最菴?限、\エスケープNUL (ASCII 0) /n /r / ' " およ縺?CTRL+Zをエスケープしたい
//クロスサイトスクリプティング対策
表示時に縺?<>&"をメタ文字へ藹??觸??
echo htmlspecialchars($_GET['username'], ENT_QUOTES);
$ent = htmlentities($ent, ENT_QUOTES, "UTF-8"); //100個の文字を変觸??
//クロスサイトスクリプティング対策
別サイトからのポストを弾縺?
refferを送信しないリクエストもある(別サイトのリファラを弾き、nullもし縺?は適切ページからを許可する)
セッショ繝?IDで判断する
//DOS対軆??
2重ポスト
IPと日臀??縺?2重ポストを防ぐ(同IPのポストがx秒以内を弾く)
■サニタイズの方觸??DOCには生のテキスト、DB縺?HTMLにはエスケープ済みのものを入れる窶? 入力があれ縺?htmlエスケープしDBに入れる窶? html表示はそのま縺?htmlエスケープ状態で出力窶? Docへ縺?htmlエスケープを解除し表示窶? htmlフォーム内表示縺?htmlエスケープを解除し表示htmlエスケープhttps://weblan3.com/html/special-characterバッククォート以藹??は分かり易いで文字表鐔??でエスケープする、改鐔??はエスケープしない< < < 不等藹??(より蟆?さい)> > > 不等藹??(より大きい)& & & アンパサンド" " " 二重引用符' ' ' シングルクォート,アポストロフ繧?; ;: ; セミコロ繝?\ \ &bsol バックスラッシ繝?` ` バッククォート
========
■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/7/24 3:46AM
Docker
どこでビルドしてもデプロイしてもImmutableインフラ・??不変の・??なので藹??更したい場合縺?Dockerfileの方を変えるコンテナ縺?OS上縺?DockerEngine上に配置する(コンテナは鐔??数配置できる、Dockerfileさえあれば再現可・??
Dockerfileでな縺?てもDockerイメージでもいいが、Dockerは可搬性をもたらすのである なおVM縺?OSをもシミュレート
1驛?: はじめに・??実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
2驛?: Dockerfile の基軆??|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
3驛?: Docker Compose|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
Dockerのチュートリア繝? - とほほ縺?WWW入門 (tohoho-web.com)
Dockerコマンド - とほほ縺?WWW入門 (tohoho-web.com)
コンテナ設鐔??方針をまとめてみた - Qiita
社内縺?Dockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株藹??会遉?
Docker完全に理解した | IIJ Engineers Blog
ボリュームマウント=DockerEngine上にボリュームを作りコンテナにマウント(操作が面倒で仮使用や永軆??ファイル逕?)
バインドマウント=LinuxOS上のファイルやディレクトリをマウント(ファイル編集が多い場合)
dockerfile(イメージを作る)、docker compose(yamlで臀??括でコンテナ/nw/volを作る)
dockerfile: dockerイメージを作る→runでコンテナ(アプ繝?)になる
docker composer: コンテナを作る、NWやボリュームも作る→1台にまとめる
マニフェスト: k8sを作る→複数台になる
Dockerfileによるビルド - とほほ縺?WWW入門 (tohoho-web.com)
Docker Compose - とほほ縺?WWW入門 (tohoho-web.com)
■Dockerインス繧?
/// BANGBOO BLOG /// - GCP script ここの臀??の方に鐔??載あり
docker --versionwho 誰がログインしているかsudo gpasswd -a [ユーザ名] docker dockerグループへ追加?
■Docker Engine起動
sudo systemctl start docker これ要る?
■オプショ繝?
-i キーボードを繋ぐ
-t 特觸??キーを使用可能にする
-e 環藹??変数名=値・??複数鐔??載可能・??
--net=ネットワーク名
-v ${pwd}:/app 縺?OSローカル環藹??とコンテナ内のディレクトリを同期-p, -public 80:8000 ポートの軆??づけ-d, -detach バックグラウンド実行(デタッチ)-rm コンテナ実行後にコンテナを自動削除する(イメージは觸??る)
-dit とまとめられる
■操作コマンド
docker images リストdocker tag [イメー繧?ID] img_unco:latest 名前がつかない場合docker rmi [イメー繧?ID] 削髯?docker ps -a コンテナ一隕?
docker container ls コンテナのステータス確認docker rm [コンテナID] 削髯?
■起動
httpd3つを1つのイメージで建てられる(以前縺?docker runだった)docker container run --name コンテナ名001 -d -p 8081:80 イメージ名httpd
docker container run --name コンテナ名002 -d -p 8082:80 イメージ名httpddocker container run --name コンテナ名003 -d -p 8083:80 イメージ名httpd
■仮諠?NW
コンテナ間をつなぐ(ネットワークタグ名で軆??づける感じ)
1)ブリッジネットワーク・??デフォルト 同一縺? Docker Engine 上のコンテナ が互いに通信をする場合に利用する デフォルト: 全てのコンテナ間をリンクする操作が必要 コンテナ間の通信縺? IP アドレス縺? 笳?(コレ使う)ブリッジネットワークを定義し作成: 相臀??通信は同じネットワークを割り当てるだけ コンテナ間縺?DNS解決される ネットワークでコンテナは隔離され隔離度が上がる2)オーバーレイネットワー繧? 異なる Docker Engine 上のコンテナ が互いに通信をする場合に利逕?
docker network create ネットワーク名net001
↓
docker container run --name mysql001 -dit --net=net001 ~~~ イメージ名mysql
docker container run --name wordpress001 -dit --net=net001 -p 8085:80 -e WORDPRESS_DB_HOST=mysql001 ~~~ イメージ名wordpress
Docker仮諠?NW一隕?docker network ls仮諠?NWの確認docker network inspect net001
コンテナ間縺?service_nemeで通信し、コンテナ名ではないhttp://unco-sv:8000 で通信できる各コンテナで同番ポートを使っていても問題はないdocker info プロキシ軆??が確鐔??できる.docker/config.json でプロキシやプロキシを使繧?ないnoProxyを設藹??
■停豁?
docker stop コンテナ名
docker rm コンテナ名
docker network rm ネットワーク名
■コピー OS⇔コンテナ
docker cp コピー元 コピー先
例)docker cp /home/a.txt コンテナ名:/app/
■ボリュームのマウント
データをコンテナ内に置縺?とコンテナが消えるとデータも消えてしまう
永軆??化1)ボリュームマウント:DockerEngine上
永軆??化2)バインドマウント:OS上
永軆??化3)一時メモリマウント:(tmpfs)
■バインドマウント
docker volume create ボリューム名vol001
docker run --name コンテナ名httpd001 -d -p 8080:80 -v /home/a:/usr/local/apache/htdocs イメージ名httpd (OS側パ繧?:コンテナ側パス、コンテナ側のパスをどこにすべきか縺?Dockerイメージのドキュメントを見よ)
docker volume inspect vol001 (確鐔??できる)
docker volume rm vol001
ホストディレクトリ共有ともいう
コンテナ縺?rootで動作しているものが多縺?ホスト共有しているDir/Fileにコンテナから変更する縺?rootで藹??更しPermissionが変繧?るそのためホストディレクトリ共有は本番に向かない
■ボリュームマウント
ちょい面倒らしいのでバインドマウントでいいのでは・??
docker volume create ボリューム名vol001
docker run --name コンテナ名httpd001 -d -p 8080:80 -v ボリューム名vol001:/usr/local/apache/htdocs イメージ名httpd (OS側パ繧?:コンテナ側パス・??docker volume inspect vol001 (確鐔??できる)
docker volume rm vol001
Dockerボリューム共有ともいう
コンテナが削除されても譏?示的に觸??さない限り保持される永軆??化したいパスを指定してマウントできる(通常コンテナ内で臀??成されたデータは永続化しない)
■揮発的データを退驕?docker cp コンテナ名:ファイルパ繧? ホスト側退避パ繧? docker cp test-db-a:/opt/test.txt /tmp/config消えるファイルをホスト側に退避したいときのコマンド
■ボリュームマウントの確認やOS側にバックアップ
アプリコンテナとは別縺?shellコンテナを用諢?し縺?lsしたりtar.gz等する
Apacheコンテナ <-> vol001 <- Linuxコンテナ -> vol002バックアップ
マウントを2つ・??DockerEngine上のマウント、OS上のマウント)
tar.gzコピー縺?DockerEngine上の指定フォルダにコピーするが其れ縺?OS側にもマウントされている、最後のドットも要る
イメージは軽驥?Linux縺?busyboxを使逕?
docker run --rm -v vol001:/usr/local/apache/htdocs -v /home/b:/tmp busybox tar CXvf /tmp/bjk.tar.gz -C /usr/local/apache/htdocs .
■ロ繧?docker logs コンテナ名docker logs -f コンテナ名 追藹??確鐔??docker exec -t コンテナ名 /bin/bash ログファイル軆??はこれで入り確鐔??
■Appコンテナ(PHP)
docker container run \ --name app \ コンテナ縺?appと名付る --rm \ コンテナ停止時に自動削髯? --detach \ バックグラウド実行 --interactive \ 対話可能なセッション縺? --tty \ コンテナと縺?TTY接続しコマンド出力藹?? --mount type=bind,src=$(pwd)/src,dst=/src \ osにバインドマウント --publish 18000:8000 \ ポートマッピン繧?
--network docker-sample-network \ 仮諠?NWに割り当縺? docker-php:app \ Dockerイメージの名前とタ繧? php -S 0.0.0.0:8000 -t /src コンテナ内で藹??行するコマンド
※永続化バインドマウントos上ホストマシンのディレクトリをコンテナ内のディレクトリにバインドマウント。ホストマシンのカレントディレクトリ・??$(pwd))縺?"src"ディレクトリが、コンテナ内縺?"/src"ディレクトリにマウントされます
※ポートマッピン繧?-p, --publishがコンテナのポートをホストマシンに公開するオプショ繝?ホストマシン縺?18000ポートを通じてコンテナ縺?8000ポートにアクセスさせるブラウザからhttp://localhost:18000 縺?phpにアクセ繧?
※起動コマンドPHPのビルトインウェブサーバを起動し、IPアドレ繧? "0.0.0.0" およびポート "8000" でリクエストを藹??け付け、コンテンツを"/src"ディレクトリから觸??供します
■コンテナの詳細情報の確認
docker container inspect app
■DBコンテナ(MySQL)
docker container run \ --name db \ --rm \ --detach \ --platform linux/amd64 \ --env MYSQL_ROOT_PASSWORD=rootpassword \ --env MYSQL_USER=hoge \ --env MYSQL_PASSWORD=password \ --env MYSQL_DATABASE=event \ --mount type=volume,src=docker-db-volume,dst=/var/lib/mysql \ --mount type=bind,src=$(pwd)/docker/db/init.sql,dst=/docker-entrypoint-initdb.d/init.sql \ --network docker-sample-network \ --network-alias db \ docker-db:db
※仮諠?NWでのエイリアス名dbと名付ける
■コンテナの逍?通の確認$ docker container exec --interactive --tty app ping db -c 3appコンテナがdbに逍?通できるかping
■アプ繝?
/// BANGBOO BLOG /// - GCP script 下の方に鐔??載あり
■Dockerfile
ビルドしてイメージを作成
FROM イメージ名
COPY コピー元パ繧? コピー先パ繧?
RUN Linuxのコマンド
ENTRYPOINT イメージを実行するときのコマンド
CMD コンテナ起動時に藹??行する規定のコマンドを指定
例えばこのコマンドを実行するCMD縺? $ go run /echo/main.go ↓空白で分割し配列化しCMD化される CMD["go", "run", "/echo/main.go"]
ただCMDは臀??記のように藹??行中に臀??書き指定ができ echo yayの藹??行となる
docker container run $(docker image build -q .) echo yayONBUILD ビルドが完了したときに任諢?の命令を実行する
EXPOSE 通信を想藹??するポートをイメージの利用者に臀??える
VOLUME 永軆??データが保存される場所をイメージ利用者に臀??える
ENV 環藹??変数を定義するWORKDIR RUN/CMD/ENTRYPOINT/ADD/COPYの際の臀??業ディレクト繝?SHELL ビルド時のシェルを指定
LABEL 名前やバージョンや制臀??者情報軆??を設藹??
USER RUN/CMD/ENTRYPOINT実行するユーザやグループを設藹??ARG docker buildする際に指定できる引数を宣鐔??
STOPSIGNAL docker stopの際にコンテナで藹??行しているプログラムに対して送信するシグナルを変更する
HEALTHCHECK コンテナの死活確認をするヘルスチェックをカスタマイズする
Dockerセキュリティベストプラクティ繧? トップ20:究極ガイド
社内縺?Dockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株藹??会遉?
RUN adduser -D myuser && chown -R myuser /myapp
(-Dはデフォルト設藹??で追加している、-Rは指定dir以臀??を再帰的に所有権藹??更・??USER myuser
(以降縺?RUNやENTRYPOINT等縺?INSTRUCTIONを実行するユーザを指定)
FROM ubuntu:latestRUN mkdir /app# "appuser" という専用のグループとユーザーを作成(ログイン臀??要のシェル設定)RUN groupadd -r appgroup && useradd -r -s /usr/sbin/nologin -g appgroup appuserWORKDIR /appCOPY . /app# ユーザー権限を変更・??アプリケーションディレクトリの所有者を "appuser" に設定)RUN chown -R appuser:appgroup /app# 最蟆?特権ユーザーで藹??行USER appuser# アプリケーションの藹??行コマンドCMD ["node", "index.js"]
Dockerfileの臀??り方を考え直したらすご縺?効軆??が上がった。 (zenn.dev)
■ビルドでイメージを作成
Dockerfileや材料ファイルのあるフォルダパスを最後に指定、-tはタグでイメージ名
docker build -t img_httpd001 ./
ビルド後縺?docker runが必要docker container run -d --name cnt_httpd001 -v ${pwd}:/app img_httpd001:latest↓これが便蛻?docker container run -rm --name cnt_httpd001 -v ${pwd}:/app img_httpd001:latest
■commitでコンテナからイメージを作成コンテナ縺?execで幾つかインスコする操作をしてからイメージにする等ができる
docker commit httpd001 img_httpd001
■コンテナ/イメージ縺?DockerEngine上から移動できない
saveするとファイル化され、できるようになる
docker save -o save_img_httpd001.tar img_httpd001
ファイルからイメージとして藹??り込みたいとき縺?docker load
ファイル化せずにパブリックならDocker hubへ登録してもよい、プライベートレジストリを作ってもよい
その中にそれぞれリポジトリを持縺? > docker push レジスト繝?/リポジトリ名:バージョ繝?
■コンテナに命令する
2つの方觸??がある
1)docker exec → docker container execに藹??繧?った
起動中のコンテナ内でコマンドを実行するdocker container exec [option] <container> commandファイルを見るdocker container exec ubuntu1 cat ~/hello.txtコンテナに接続し縺?bashを使うdocker container exec --interactive --tty ubuntu1 bash
2)docker run に藹??数を付ける→ソフトウェ繧?(apache)が動いていない状態になり改め縺?docker startが必要
docker exec -it コンテナ名httpd001 /bin/bash
apt install mysql-server など対話でコンテナにインスコできる
exit 抜ける
■Docker composedocker runコマンドの集合体、コンテナ等作って觸??すだけ(k8sはコンテナ等を管理する)
以前縺?docker-composeコマンドで別ツールだったが今は統合済縺?
フォルダ縺?1つだけdocker-compose.yml
基本縺?docker runを実行せず縺?docker composeしたい
手順は、1)Docker run方觸??で臀??応の觸??險?>2)docker-compose.ymlの鐔??霑?>3)docker composeコマンドの藹??行
docker run~~に対するdocker-compose.yml縺?docker composeコマンド の対比
1)docker run --name cnt_wordpress001 -dit --net=net001 -v wordpress001vol2:/var/www/html -p 8080:80 -e WORDPRESS_DB_HOST=mysql001 -e WORDPRESS_DB_NAME=wpdb001 -e WORDPRESS_DB_USER=wpu001 -e WORDPRESS_DB_PASSWORD=my-secret-pw wordpress
↓2) docker-compose.ymlの鐔??霑?
version: "3"services: cnt_wordpress001: depends_on: - cnt_mysql001 image: wordpress networks: - net001 volumes: - wordpress001vol2:/var/www/html ports: - 8080:80 restart: always environment: WORDPRESS_DB_HOST=mysql001 WORDPRESS_DB_NAME=wpdb001 WORDPRESS_DB_USER=wpu001 WORDPRESS_DB_PASSWORD=my-secret-pw
cnt_mysql001: image: mysql:5.7 networks: - net001 volumes: - mysql001vol1:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD=my-root-pw MYSQL_DATABASE=wpdb001 MYSQL_USER=wpu001 MYSQL_PASSWORD=my-secret-pwnetworks: net001volumes: mysql001vol1: wordpress001vol2:
/// restartの設定値・??コンテナが停止した時にどうするか?)
no =何もしない
always =必ず再起動する
on-failure =プロセスが0以藹??のステータスで軆??了したときは再起動する
unless-stopped =停止していたときは再起動しないがそれ以藹??は再起動する
Bashで軆??了ステータスよる条件分岐 | Codebase Blog
窶?bashは前に藹??行されたコマンドの軆??了ステータスは「$?」で藹??得できるが慣軆??的にコマンドが正常終了した場合縺?0を返す
/// その臀??の藹??義項逶?command =起動時の鐔??定コマンドを上書きするentrypoint =起動時縺?ENTRYPOINTを上書きするenv_file =環藹??設藹??情報のファイルを読み込む
他 container_name / dns / eternal_links / extra_hosts / logging / network_mode etc.
3)docker compose コマンド
up=イメー繧?DL、コンテナ/nw/volの臀??成・起動
down=コンテナ縺?nwの停止と削除、volとイメージは觸??る
stop=削除せず停止の縺?
docker compose -f /home/a/docker-compose.yml up -d
docker compose up -d --scale unco001=3 (コンテナ名縺?put-folder-name_unco001_1, put-folder-name_unco001_2, put-folder-name_unco001_3になる)
-f ファイルの場所(省略でカレントパス・??
-d バックグラウンド実行
--build コンテナ開始前にビルド
--no-build イメージが見つからな縺?てもビルドしない
-t コンテナ停止のタイムアウト(デフ繧?10S)
--force-recreate 設藹??やイメージに藹??更が無縺?てもコンテナを再生成 --no-create コンテナが存在していれば再生成しない
--abort-on-container-exit コンテナが一つでも停止したら全てのコンテナを停豁? --remove-orphans 定義ファイルで藹??義されていないコンテナを削髯? --scale 同じコンテナを複数臀??る
docker compose -f /home/a/docker-compose.yml down --rmi {all | local} 破觸??後にイメージも削除、localの時縺?imageにカスタムタグが無いイメージのみを削髯?
-v volumesに鐔??載されているボリュームを削除、但しexternalの指定を除縺?
--remove-orphans 定義ファイルで藹??義されていないコンテナを削髯?
docker compose -f /home/a/docker-compose.yml stop コンテナを停豁?
■Docker composeはコンテナ名を勝手につける
docker-compose.yml内は臀??記の通り、DockerEngine上のコンテナ名は藹??繧?るがdocker-compose.yml内のコンテナ名は藹??繧?ず指定できるservices:
unco001~
unco002 depends_on:
- unco001
environment:
WORDPRESS_DB_HOST: unco001
↓
DockerEngine上のコンテナ名縺? put-folder-name_unco001_1 となる
DockerEngine上で操作したいとき縺? docker ps -a 等で藹??際の名前を確鐔??して操作する
■コンテナ デバッ繧?
3驛?: デバッグ繝?ウ繝?繧? ( 番藹??邱? )|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
====================
基本縺?Linuxの觸??能を使っているnamespaceで分離しファイル觸??造、ユーザ繝?ID、グループID、コマンド、ライブラリなど諸々をラップしコンテナ化し(単一縺?)プロセスとして動縺?↓
Dockerがやっている仕事は藹??ない
区切ってコンテナ
それら仮想ネットワークで軆??ぐ
ボリュームの永続化
Dockerfileでイメージからイメージを作成Docker compose縺?docker runを記霑?docker execでコンテナを操作etc.
Comment (0)
Navi: < 3 | 4 | 5 | 6 >
-Home
-Column [136]
-Europe [9]
-Gadget [79]
-Web [137]
-Bike [4]
@/// BANGBOO BLOG ///