第493話:共有パスワードの利用を管理する(Sheets API v4)

2016年7月25日
日常業務は「共有パスワード」だらけ。。。

ルータを置けば「管理者パスワード」を設定する。ネットプリントに申し込めば「法人アカウント」を登録する。スキャナを買っただけでも「ユーザ登録」が必要となる。幼い日から「絶対にパスワードは他人に教えてはなりません」と教わって大人になったのに、、、現実の大人の世界には「組織内で共有(共用)せざるをえないパスワード」が沢山あるじゃないか!! (そして会社のファイルサーバには、門外不出の秘密ファイルが。。。)

以下のワークフローは「共有パスワード」を管理する業務プロセスだ。

組織用の「パスワードマネージャ」と言っても良い。社員からのリクエストがあった際、その10分後にパスワードが自動開示される仕組みだ。誰が・いつ・どのパスワードを利用したか、すべて自動的に記録されるようになる。(加えて管理者側の「パスワード変更」も記録されるようになる)

[共有パスワード問合]

この業務プロセスを稼働させれば、申請権限のある社員であれば、いつでもパスワードを取得できるようになる。言ってみれば「非常にユルイ管理」だ。(加えてパスワードそのものも平文で保存されている)
  • 無線WiFiの「セキュリティキー」
  • Web サイトの「Basic 認証」
  • クラウド会計の「一時的な閲覧権限」
など『機密度』や『重要度』がある程度低く、かつ定期的に変更されるような共有パスワードの管理に向いているといえるだろう。機密性の高い共有パスワードの管理には利用できない。(そういうシステムなら「共有パスワード」を使うなという話もある)


ちなみに、暗号化しすぎることで、ユーザ自身が復号できなくなるリスクがあるなら、「平文での管理」も強ち非難される手法ではない。またこの例では、平文で管理する一方、「閲覧制限がかかっている Google Spreadsheet」(外部システム)に保存している点が秀逸だ。特に Google Apps Vault で、ファイルの閲覧履歴が全て管理されているなら非常に有効な手段といえる。

(もちろん、パスワードを「Aパート」と「Bパート」に分割して保存する、暗号化して保存する、など、更なる高度化も考えられる)

[共有パスワード問合:「1.PWリクエスト」画面]

▼PW保存用 Google Spreadsheet の準備
※ API経由でのみアクセスされる
  • 1. Google Spreadsheet 新規作成
  • 2. 共有設定にて閲覧権限者が居ない事を確認
  • 3. ファイルID(Spreadsheet ID)をメモ
  • 4a. シート名を『対象システム』の[選択肢ラベル]に
  • 4b. シートidを『対象システム』の[選択肢ID]に
  • 5. (選択肢の数に応じてシートを追加)

▼OAuth2.0 通信許可設定サンプル
== 1. Googlea Developers Console 側を設定する ==
  • アプリケーションの種類: ウェブアプリケーション
  • 認証情報: qapp
  • 承認済みのリダイレクト URI: https://s.questetra.net/oauth2callback
== 2. Questetra HTTP イベント側(クライアント)を設定する ==
  • Name: sheets-api-v4
  • Authorization Endpoint URL: https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force
  • Token Endpoint URL: https://accounts.google.com/o/oauth2/token
  • Scope: https://www.googleapis.com/auth/spreadsheets
  • Consumer Key:(Google Developers Console で取得)
  • Consumer Secret:(Google Developers Console で取得)

▼スクリプト工程『Get URL』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving == 
var mySystems = data.get("q_systems"); 
var spreadSheetId = data.get("q_spreadsheetid") + ""; 
var sheetId = mySystems.get(0).getValue() + ""; 
var sheetName = mySystems.get(0).getDisplay() + ""; 

//// == 演算 / Calculating == 
var myUrl = ""; 
myUrl = 'https://sheets.googleapis.com/v4/spreadsheets/'; 
myUrl += spreadSheetId; 
myUrl += 'values/'; 
myUrl += sheetName; 
myUrl += '!C1:D1'; 

//// == ワークフローデータへの代入 / Updating == 
retVal.put("11", myUrl ); 

▼Get PW via Google Sheets API v4
  • Method: GET
  • Access URL: #{data['●']}
  • Response: On
  • Connection: OAuth 2.0

== Response JSON sample ==
{
  "range": "wifi1!C1:D1",
  "majorDimension": "ROWS",
  "values": [
    [
      "example1@example.com",
      "qwerty"
    ]
  ]
}

▼スクリプト工程『レスポンス処理』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving == 
var myJson = data.get("13") + ""; // JSON text 

//// == 演算 / Calculating == 
var newIdPw = JSON.parse( myJson ); 

//// == ワークフローデータへの代入 / Updating == 
retVal.put("q_newid", newIdPw.values[0][0] ); 
retVal.put("q_newpw", newIdPw.values[0][1] ); 

▼スクリプト工程『リクエスト生成』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving == 
var newId = data.get("q_newid") + ""; 
var newPw = data.get("q_newpw") + ""; 
var mySystems = data.get("q_systems"); 
//var spreadSheetId = data.get("q_spreadsheetid") + ""; 
var sheetId = mySystems.get(0).getValue() - 0; 
//var sheetName = mySystems.get(0).getDisplay() + ""; 

//// == 演算 / Calculating == 
var dateTimeSerialNumber = Date.now() / 1000 / 60 / 60 / 24 + 70 * 365 + 19; 
// UNIX time to Excel-Lotus Serial Number 
// from December 31st 1899 (1900年うるう日問題) 
// Date.now() は、UTC の時刻を取得

var myObj = {};  
myObj.requests = []; // Array  

myObj.requests[0] = {};  
myObj.requests[0].appendCells = {};  
myObj.requests[0].appendCells.rows = []; // Array  
myObj.requests[0].appendCells.sheetId = sheetId;  
myObj.requests[0].appendCells.fields = "*";  
myObj.requests[0].appendCells.rows[0] = {};  
myObj.requests[0].appendCells.rows[0].values = []; // Array 

myObj.requests[0].appendCells.rows[0].values[0] 
  = {"userEnteredValue": {"numberValue" : dateTimeSerialNumber } }; 
myObj.requests[0].appendCells.rows[0].values[1] 
  = {"userEnteredFormat": {"numberFormat": { "type": "DATE_TIME" } },
     "userEnteredValue": {"numberValue": dateTimeSerialNumber }}; 
myObj.requests[0].appendCells.rows[0].values[2] 
  = {"userEnteredValue": {"stringValue": newId }}; 
myObj.requests[0].appendCells.rows[0].values[3] 
  = {"userEnteredValue": {"stringValue": newPw }}; 

myObj.requests[1] = {};  
myObj.requests[1].sortRange = {};  
myObj.requests[1].sortRange.range = { "sheetId": sheetId,"startRowIndex": 0,"endRowIndex": 3 }; 
myObj.requests[1].sortRange.sortSpecs = [{"dimensionIndex": 0,"sortOrder": "DESCENDING"}]; 

var myJsonText = JSON.stringify( myObj );  

//// == ワークフローデータへの代入 / Updating == 
retVal.put("12", myJsonText );  

▼Post PW via Google Sheets API v4
  • Method: POST (with Request Body)
  • Access URL: https://sheets.googleapis.com/v4/spreadsheets/#{data['●']}:batchUpdate
  • Connection: OAuth 2.0
  • Request Body: application/json

== Request JSON sample ==
{"requests": [
  {"appendCells": 
    {
      "sheetId": 0,
      "rows": [
        {"values": [
          {"userEnteredValue": {"numberValue": 43210.12345}},
          {"userEnteredFormat": {"numberFormat": { "type": "DATE_TIME" } },
            "userEnteredValue": {"numberValue": 43210.12345}},
          {"userEnteredValue": {"stringValue": "example@example.com"}},
          {"userEnteredValue": {"stringValue": "qwerty"}}
        ]}
      ],
      "fields": "*"
    }
  },
  {"sortRange": 
    {
      "range": {
        "sheetId": 0,
        "startRowIndex": 0,
        "endRowIndex": 3
      },
      "sortSpecs": [
        {
          "dimensionIndex": 0,
          "sortOrder": "DESCENDING"
        }
      ]
    }
  }
]}

<データ項目一覧画面>


[雛形ダウンロード (無料)]
<類似プロセス>
≪関連記事≫

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿