Pesquisar

Artigo
· Jun. 1 7min de leitura

InterSystems 製品のセキュリティの基本:ユーザとロール

これは InterSystems FAQ サイトの記事です。

InterSystems 製品では、ユーザが持つロールによって「InterSystems 製品内で何ができるのか」が決まります。

では、ロールには何が含まれているのでしょうか。

ロールには、複数の特権を含めることができます。特権とは、リソース(保護対象)に対する許可の設定を指しています。

本記事では、IRIS の開発者である山田さん(Yamada) を例に、以下の内容をご説明します。

1) ロールから付与される特権(=リソースに対する許可)について具体例を利用した確認方法

2) ロールを利用したセキュリティ設定について

《ご参考》

ビデオでの解説もあります。ラーニングパスの「InterSystems IRIS 管理の基本」の「4. セキュリティの構成と管理」をご参照ください。

ラーニングパスには、管理者ではないけれど管理概要も知っておきたい方向けの「開発者向け InterSystems IRIS の管理概要」もあります。ぜひご参照ください。

1) ロールから付与される特権(=リソースに対する許可)について具体例を利用した確認方法

山田さんは開発者であるため、VSCode から T1 ネームスペースにアクセスし開発をしています。また、管理ポータルのシステムエクスプローラーメニューについても、T1 ネームスペースに対して操作ができるようにロールが付与されています。

現在、山田さんに付与されているロールは以下の通りです。

  • %Developer ロール (開発者用ロール)
  • %DB_T1ロール

《付与されるリソースのイメージ(全リソースについて記載していません)》

このロールから具体的にどのような特権が提供されているか、管理ポータルを利用して山田さんのプロファイルを参照します。

管理ポータル > システム管理 > セキュリティ > ユーザ > Yamadaの行の右端にある「プロファイル」のリンクをクリック

 

プロファイルのリンクをクリックした後は以下の表示です。

※ 権限の表はまだ下に続いていますが、図例は省略しています。

 

特権は保護対象であるリソースに対する【許可(READ/WRITE/USE)】の組み合わせで、データベースに対しては R(READ)または W(WRITE) 、接続経路(ターミナルや Mirror など)、管理ポータルメニュー、ユーザのアプリケーションに対しては U(USE)許可を設定できます。

山田さんに付与されている %Developer ロールから提供されるリソースの 1つ %Development リソースに付与されている許可を確認します。

%Developement リソースはインストール時用意される事前定義リソースで、管理ポータルのシステムエクスプローラーメニューが使用するアプリケーションパス (/csp/sys/exp) や VSCode から IRIS に接続する際内部的に使用している /api/aterlier のパスやクラスリファレンスのパス /csp/documatic に対しての U(USE:利用)許可が設定されています。

 

次に、%DB_T1 ロールから付与されるデータベース用リソース:%DB_T1 の許可を確認すると、 RW(READ と WRITE)が設定されています。

※ データベース用リソースとは、セキュリティ設定を強化する際に個々のデータベースに対して設定する定義で通常 %DB_データベース名で作成します。未設定のデータベースは、%DB_%DEFAULT リソースに含まれます。データベース用リソースを作成するとリソースに対する READ/WRITE の許可がセットされたデータベース用ロール(%DB_データベース名)が自動的に作成されます。

 

リソースには全ユーザに対して許可を与える設定もありパブリックで許可している設定は、プロファイルの「パブリックリソースにより付与」の列に表示されます。

 

つまり、リソースは、データベースであったり、ターミナルや Web ゲートウェイのような接続経路であったり、管理ポータルメニューやアプリケーションのエンドポイントだったり、保護対象となる何かを指していることがわかります。

この「保護対象」に対してどの許可を持つかをロールにまとめて定義し、そのロールをユーザに付与することで保護対象のリソースに対してアクセスできる・できない、が決まります。

※ 「アセット」は、セキュリティ設定項目上登場しない用語ですが、InterSystems 製品の保護対象の総称として使用している用語です。

ここまでの流れで、InterSystems 製品に対してセキュリティ設定を行う場合に登場する、ロール、特権、リソース、許可 の用語の意味を確認できました。

2) ロールを利用したセキュリティ設定について

次は、ロールを利用したセキュリティ設定について、具体的な例でご説明します。

開発者の山田さんは主に、クラス定義の作成・編集を行っています。開発者の鈴木さんは主に、テーブル定義の作成、データ登録や参照確認などを担当しています。

二人とも開発者であるため、管理ポータルのシステムエクスプローラーやターミナル(IRISへのログイン)、VSCode からのアクセスに必要な %Developer ロールと、T1 ネームスペースでソースコードの読み書きや実行に必要な %DB_T1 ロールが必要です。

この後、開発者が増える予定もあるため、個々のユーザにこの 2 つのロールを付与するのではなく、開発者用ロール:AppDeveloper を作成し、%Developer と %DB_T1 ロールのメンバーとして AppDeveloper ロールを設定し、新開発者は AppDeveloper ロールメンバーとして割り当てるほうが管理しやすくなりそうです。

また、SQLでテーブル定義を作成する場合は、SQL管理権限の %CREATE_TABLE が最低限必要なのと、既存テーブルに対して参照・更新・削除を行うためには操作対象テーブルに対する権限の設定も必要です。
これら権限は、SQLを中心に操作する開発者のみ付与されていればよいので、SqlDeveloper ロールを作成し必要な権限を設定し、開発者である鈴木さんに付与します。

ロールのイメージは以下の通りです。

 

以下の流れで作成します。

[1] AppDeveloper ロールの作成

[2] SqlDeveloperロールの作成

[3] AppDeveloperロールに山田さん(Yamada)と鈴木さん(Suzuki)さんを設定

[4] SqlDeveloperロールに鈴木さん(Suzuki)さんを設定

[5] テスト

 

[1] AppDeveloper ロールの作成

AppDeveloper ロールの作成手順は以下の通りです。

管理ポータル > システム管理 > セキュリティ > ロール > 新規ロール作成ボタンクリック

ロール名を記入し、保存ボタンを押した後の設定は以下の通りです。

完成図

 

[2] SqlDeveloperロールの作成

次に、SQL 開発者(鈴木さん)に付与する SqlDeveloper ロールを作成します。(既存に Sampleスキーマがある想定です)

最初に、SQL管理権限の設定です。

 

続いて、テーブル権限の追加です。例では T1ネームスペースにある Sample スキーマのテーブルに対して全権限付与しています。

 

[3] AppDeveloperロールに山田さん(Yamada)と鈴木さん(Suzuki)さんを設定

AppDeveloper ロールの設定は、以下の通りです。

 

[4] SqlDeveloperロールに鈴木さん(Suzuki)さんを設定

続いて、SqlDeveloper ロールのメンバーに鈴木さん(Suzuki)を追加したときの図です。

 

[5] テスト

設定が正しく行えているかテストします。

山田さんで管理ポータルにログインしたときは、SQLメニューでSQLの実行が行えませんが、鈴木さんでログインしたときはSQLの実行が行えます。

鈴木さんの場合は以下の通りです。

ここでご紹介した用語や設定方法は、InterSystems 製品共通の内容です。

適切なロールをユーザに付与することで、管理ポータルやアプリケーションに対して、アクセス可否を決定できます。

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Jun. 1 5min de leitura

ロックテーブルの参照方法とその見方

これは InterSystems FAQ サイトの記事です。

ロックテーブルを参照する方法として、主に以下の3つの方法が挙げられます。

1. 管理ポータルで参照する方法
 ⇒ 管理ポータル:システムオペレーション > ロック > ロックを表示(または管理)

2. ^LOCKTAB ユーティリティ を使用する方法
 ⇒ %SYS> do ^LOCKTAB

3. プログラムで参照する方法
 ⇒ プログラム内でロック情報を取得する方法


こちらの記事では、ロックテーブルで参照できる情報について、以下の3つのケースに分けて、かかるロックとその意味をご説明します。

1.トランザクションで更新クエリ実行時、他のプロセスで更新・参照した状態
2.デッドロックとなった状態
3.テーブルロックがかかった状態


目視で一番わかり易いのは、1の 管理ポータルで参照する方法 になるので、こちらで説明したいと思います。

最初に、
1.トランザクションで更新クエリ実行時、他のプロセスで更新・参照をすると、どのようなロックがかかるのか見ていきます。

a. プロセスA(PID=10044)にてトランザクションで、Sample.Personテーブルの ID=1 を更新します。    ⇒ Exclusive_e->Delock ロック

[SQL]TL1:USER>>update Sample.Person(Name) values('bbb') where ID=1

b. プロセスB(PID=46952)にて、Sample.Personテーブルの ID=1 を更新します。     ⇒ WaitExclusiveExact ロック
 → ロックタイムアウト後(既定10秒)、[SQLCODE: <-110>:<ファイル中にロック競合が発生しました>] エラーが返ります。

[SQL]USER>>update Sample.Person(Name) values('ccc') where ID=1

c. プロセスC(PID=45680)にて、read commit モード で、Sample.Personテーブルの ID=1 を参照します。     ⇒ WaitSharedExact ロック
 → ロックタイムアウト後(既定10秒)、[SQLCODE: <-114>:<ひとつまたはそれ以上のマッチする行が別のユーザによりロックされています>] エラーが返ります。

[SQL]USER>>set transaction isolation level read committed
[SQL]USER>>select * from Sample.Person where ID=1


管理ポータルでロックテーブル情報を見てみます。青四角がそれそれでの持しているロックになります。
※複数の増分ロックがかかっているときは、「Exclusive/5」のように、ロック数も表示されます。1つのロックの時は表示されません。


次に、
2.デッドロックが発生しているとき、どのようなロックの状態になるのか見てみます。

1. プロセス A(PID:43468) で次のコマンドを発行します : lock +^MyGlobal(15)
2. プロセス B(PID:2198) で次のコマンドを発行します  : lock +^MyOtherGlobal(15)
3. プロセス A で次のコマンドを発行します : lock +^MyOtherGlobal(15)
   ⇒ この LOCK コマンドは返りません。このプロセスは、プロセス B がロックを解放するまでブロックされます。
4. プロセス B で次のコマンドを発行します : lock +^MyGlobal(15)
   ⇒ この LOCK コマンドも返りません。このプロセスは、プロセス A がロックを解放するまでブロックされます。

プロセスA、プロセスB、ともにロックの解放待ちで、応答が返らない状態(デッドロック)になりました。


管理ポータルでロックテーブル情報を見てみます。

プロセスA(PID:43468)
 ・^MyGlobal(15) に対する Exclusive(排他ロック)を保持
 ・^MyOtherGlobal(15) に対し、WaitExclusiveExactで同一ロックに対する排他ロックの待機(ロック解放待ち)

プロセスB(PID:2198)
 ・^MyOtherGlobal(15) に対する Exclusive(排他ロック)を保持
 ・^MyGlobal(15) に対し、WaitExclusiveExactで同一ロックに対する排他ロックの待機(ロック解放待ち)

お互いに、それぞれが保持しているロックの解放待ちで、デッドロック状態となっていることが分かります。
 

デッドロックを防止するには以下のような方法があります。

  • 常に timeout 引数を使用する。
  • 増分 LOCK コマンドを発行する際にその順序に関して厳格なプロトコルに従う。すべてのプロセスが、ロック名に関して同じ順序に従っている限り、デッドロックが発生することはありません。単純なプロトコルは、照合順序でロックを追加するものです。
  • 増分ロックではなく単純ロックを使用する (つまり、+ 演算子を使用しない)。前述のとおり、単純ロックでは、LOCK コマンドは最初に、プロセスによって以前から保持されていたすべてのロックを解放します (ただし、実際には単純ロックはあまり使用されません)。


最後に、
3.テーブルロックがかかった状態では、どのようなロックがかかるのか見ていきます。

今回は、Create Table で作成した、SQLUser.tab1 テーブルで実験してみます。
現在、ロック閾値 が 1000(デフォルト) なので、トランザクションでそれ以上の更新をしてみます。

1回目の Insert で、「Exclusive_e->Delock」のロックが1つかかっているのが分かります。

2回目の Insert で、「Exclusive_e->Delock」のロックが2つになったのが分かります。 

1001回目の Insert では、テーブルロック閾値(1000)を超えたために、「Exclusive/1001E->Delock」というテーブルロックにまとめられたことが分かります。

 

    今回は、管理ポータルで参照する方法をご紹介しましたが、^LOCKTABユーティリティ や、プログラムで取得する方法 でも、同様の情報を見ることが可能です。

    なお、正常に終了したプロセスは取得していたロックを全て解放します。


    enlightened【ご参考】
    InterSystems製品のロックの基本

    Discussão (0)0
    Entre ou crie uma conta para continuar
    Pergunta
    · Jun. 1

    Primary startup failed, failed to read header ..... during Failover

    I am attempting to failover my TEST environment to the Backup, and I keep getting an error stating that 

    06/01/25-18:47:54:516 (11864) 1 [Utility.Event] Primary startup failed, failed to read header of /archive/journal/MIRROR-IRISTEST-20250513.007 (file #63653)

    however, when I go to /archive/journal/, I am not finding any record of MIRROR-IRISTEST-20250513.007 (file #63653)

    to get out of this error message I have to restart what was the Primary and restart the Backup to get it back into a state that we can use it. 

    There is a Namespace/Database that is on the backup and not part of the mirror, which I need to get moved to being mirrored across all the instances of our TEST environment.

    Any idea why it is thinking that /archive/journal/MIRROR-IRISTEST-20250513.007 (file #63653) still exists, and it needs to read from it?
     

    1 Comment
    Discussão (1)1
    Entre ou crie uma conta para continuar
    Anúncio
    · Jun. 1

    Developer Community Recap, May 2025

    Hello and welcome to the May 2025 Developer Community Recap.
    General Stats
    142 new posts published in May:
     33 new articles
     47 new announcements
     60 new questions
     2 new discussions
    412 new members joined in May
    14,991 posts published all time
    16,408 members joined all time
    Top posts
    Top authors of the month
    Articles
    #InterSystems IRIS
    Ladies and Gentlemen, the amazing Iris-nator
    By Kurro Lopez
    Minify XML in IRIS
    By Enrico Parisi
    Reviews on Open Exchange - #51
    By Robert Cemper
    How to produce and consume RabbitMQ messages on IRIS
    By Yuri Marx
    How to remove special characters (Unicode Characters) from text
    By Padmaja Konduru
    IRIS iRacing
    By sween
    Long Running SQL Queries: a sample exploration
    By Ben Schlanger
    Creating a cross-regional DR Async with IKO
    By Sam Ferguson
    Building the UI by Prompting vs InterSystems IRIS Backend: Lovable, Spec First and REST API
    By Evgeny Shvarov
    An Overview of Database Degrade
    By Neil Shah
    Using %System.Monitor.LineByLine together with %SYS.MONLBL to analyze your code
    By Daniel Kutac
    A Dive into Debugging Embedded Python
    By Shuheng Liu
    A knockout of weight
    By Andre Larsen Barbosa
    codemonitor.MonLBL - Line-by-Line ObjectScript Code Monitoring
    By Lorenzo Scalese
    Creating a Document Database
    By Kate Lau
    Multilingual GenerativeAI Pattern Match WorkBench Utility
    By Alex Woodhead
    Integrate with Google Forms
    By Yuri Marx
    Use Mako Python template engine to generate dynamic content
    By Yuri Marx
    Making Sense of Blood Tests with FHIRInsight: Turning FHIR into Clarity
    By Henry Pereira
    How to manage in a CI/CD pipeline an InterSystems API Manager configuration ?
    By Sylvain Guilbaud
    hc-export-editor: Making Interface Changes to Exports Before Deploying to Prod
    By Eric Fortenberry
    Introducing LEAD North's CCD Data Profiling Tool
    By Landon Minor
     
    #InterSystems IRIS for Health
     
    #TrakCare
     
    #Other
     
    #Open Exchange
     
    Announcements
    #InterSystems IRIS
    [Video] Using Embedded Python in the BPL and DTL Editors
    By Adam Coppola
    [Video] Prompt the frontend UI for InterSystems IRIS with Lovable
    By Anastasia Dyubaylo
    Cambridge Developer Meetup - AI Coding Assistants & MCP [May 14 2025]
    By Liubov Zelenskaia
    [Video] Data Fabric in Practice: Lessons Learned
    By Anastasia Dyubaylo
    Do you have the InterSystems IRIS SQL Specialist certification? Beta testers needed for our upcoming InterSystems IRIS SQL Professional certification exam
    By Celeste Canzano
    InterSystems IRIS Development Professional Exam is now LIVE!
    By Celeste Canzano
    Developing with InterSystems Objects and SQL – In Person June 9-13, 2025 / Registration space available
    By Larry Finlayson
    GitHub Action IRIS Deployer
    By Cristiano Silva
    Do you have any openings for InterSystems developer Job
    By AYUSH Shetty
    InterSystems Platforms Update Q2-2025
    By Bob Kuszewski
    New Point Release for IRIS 2025.1.0: Critical Interoperability Fix
    By Daniel Palevski
    [Webinar] Unlocking the Power of InterSystems Data Fabric Studio
    By Anastasia Dyubaylo
    SQL DATA LENS Now FREE for Use with InterSystems IRIS Community Edition!
    By Andreas Schneider
    Hebrew Webinar: Discover the All-New UI in Version 2025.1 — and More!
    By Ronnie Hershkovitz
     
    #Developer Community Official
     
    #Open Exchange
     
    #InterSystems IRIS for Health
     
    #Summit
     
    #IRIS contest
     
    #HealthShare
     
    #Other
     
    #Learning Portal
     
    #InterSystems Ideas Portal
    InterSystems Ideas News #22
    By Irène Mykhailova
     
    #InterSystems Official
    IKO 3.8 Release
    By Bob Kuszewski
     
    Questions
    #InterSystems IRIS
    Embedded Python query
    By Touggourt
    Best Practice for Existing ODBC Connection When System Becomes IRIS for HealthShare
    By Fraser J. Hunter
    SQLCODE: -99 when executing dynamic SQL on specific properties
    By Martin Nielsen
    Rule Editor Login Credentials Issue in Community Edition
    By Juan Mota Sanchez
    Problem exporting %Library.DynamicObject to JSON with %JSON.Adaptor
    By Marcio Coelho
    Task Scheduler - Output to file
    By Scott Roth
    InterSystems HL7 Interface Specialist certificate test
    By Yuhong Snyder
    Troubleshooting REST Operation
    By Scott Roth
    How to prevent reentrancy inside same process ?
    By Norman W. Freeman
    Actual Use Cases for %Stream.DynamicBinary and %Stream.DynamicCharacter
    By Ashok Kumar T
    How can I call $System.OBJ.Load() from a linux shell script? (Or $System.OBJ.Import, instead)
    By AC Freitas
    How to delete table column with its data with SQL command. I need the exact syntax of the command
    By Dmitrij Vladimirov
    Using assign in a routing rule using XML
    By Ewan Whyte
    Embedded SQL result issues inside %ZLANGC routine
    By Ashok Kumar T
    Age Calculator in BPL
    By Saju Abraham
    JSON - is key defined?
    By Scott Roth
    Problem deploying to a namespace
    By Anthony Decorte
    Error Handling Server to Client Side - Best Practices
    By Michael Davidovich
    ERROR #5883: Item '%Test' is mapped from a database that you do not have write permission on
    By Jonathan Perry
    Outbound HL7 HTTP Messaging - Unsupported Media Type
    By Scott Roth
    Append a string in a update query
    By Jude Mukkadayil
    Task manager in async mirror behavior
    By Yaron Munz
    Take subroutines from the Deployed Mode Routine
    By Ashok Kumar T
    %JSON.Adaptor compilation issues under array-of-streams and computed property types
    By Geoffrey Lu
    REST API Issue
    By Anil Mathew
    BI Analytics default key:value pair in termlist
    By Dmitrij Vladimirov
    %Stream files do not get purged from the /stream/ folder on the system disk
    By Martin Nielsen
    Poor database write performance
    By Norman W. Freeman
    Users in write only
    By Pietro Montorfano
    How to override the port used on a SOAP operation
    By Ryan Hulslander
    Download
    By chris Janidas
    Subscript indirection behaves differently in if statement
    By Ashok Kumar T
    CSP WebApp - IIS
    By Patrik Spisak
    No whens matched and no otherwise defined
    By Avishek Singh
    SQL Query returns with OFFSET
    By Fabio Care
    How to programmatically create SQL Gateway Connection?
    By Jani Hurskainen
    How to use EnsLib.SQL.InboundAdapter in IRIS tables
    By Kurro Lopez
    What is the global ^Ens.AppData and is it secure kill it?
    By Yuri Marx
    JSON - Field extraction using Object Script
    By Scott Roth
    How to reset the Web Gateway management Password
    By Thembelani Mlalazi
    Prompt Engineering for ollama-ai-iris
    By Oliver Wilms
    How can I configure InterSystems ObjectScript Source Control with a client-side workspace in VS Code?
    By Ricardo Alves dos Santos
    Azure OpenAI %Embedding.Config
    By Henry Pereira
    Production Validator - Case Study
    By Satya Prasad Kalam
     
    #InterSystems IRIS for Health
     
    #Caché
     
    #TrakCare
     
    #Health Connect
     
    #HealthShare
     
    #Ensemble
     
    Discussions
    #InterSystems IRIS
     
    #Global Masters
     
    May, 2025Month at a GlanceInterSystems Developer Community
    Discussão (0)1
    Entre ou crie uma conta para continuar
    Artigo
    · Jun. 1 18min de leitura

    ¡POLICIA POLICIA! ¡¡Hay un intruso!! (Notificaciones Telegram y manejo URLs OAUTH2)

    Buenas a todos,

    en capítulos anteriores, vimos como "Proteger los datos: Se un mejor cerrajero", en el que explicábamos como proteger nuestros recursos aplicando un control extra al acceso mediante OAUTH2 que nos ofrece Intersystems. Y como no hay 2 sin 3, aquí tenemos un tercer articulo, en el cual vamos a explicar como "avisar a la policía" de que alguien malicioso está intentando acceder a nuestros datos.

    Al finalizar el mismo, comentábamos que si quisiéramos podríamos tener un mayor control de estos accesos incorrectos y esto nos lleva a este artículo, por lo que seguiremos el siguiente índice, en el cual podréis encontrar todos los apartados en formato tutorial, de forma que siguiendo paso a paso lograreis llegar al objetivo:

    1.- Introducción

       1.1.- De donde venimos

    2.- Configuración del "091" 

    2.1.- Arquitectura de las alertas

    2.2.- ¿Quién es quién?

           2.2.1.- Operación
           2.2.2.- Proceso

       2.3.- ¿Qué es un bot de telegram?  

           2.3.1.- Bot  
           2.3.2.- Grupos
           2.3.3.- Configuración de la alerta

    3.- Actualización de consulta de usuario

    3.1.- Usuario de nuestro token por Endpoints Relacionados con Autenticación (OAUTH)

    3.2.- Endpoints útiles para OAUTH

           3.3.1.- token
           3.3.2.- introspection
           3.3.3.- registration
           3.3.4.- revocation

     

    1.- Introducción

    1.1.- De donde venimos

    En el articulo anterior (Proteger los datos: Se un mejor cerrajero) explicábamos como conocer el usuario ("2.1.- ¿Cómo funciona la llave (Token)?") mediante el uso de JWT extrayendo el parámetro "aud" y en base a este valor validábamos por LookUp Table su permiso de acceso a unos recursos o no. Si un usuario no esta autorizado a acceder a determinados recursos, necesitamos saber de estos intentos maliciosos de acceso para poder actuar.

    En los siguientes pasos explicaremos la configuración de las alertas por mensajería push así como mejorar la obtención del usuario y mas funciones de las URLS de OAUTH2.

    Estas alertas por mensajería push las realizaremos por medio de Telegram, aplicación de mensajería instantánea que nos permite recibir mensajes de texto en tiempo real. Este es el gran punto a su favor para esta situación, pues en el mismo momento que ocurra un intento indebido de acceso a nuestros recursos, lo sabremos y podremos actuar lo antes posible para proteger nuestros datos. Al mismo tiempo, al utilizar una aplicación de este tipo, podremos recibir la notificación en cualquier lugar del mundo, pues, mientras tengamos conexión a internet, esta notificación nos va a llegar. 

    Con todo esto, ¡VAMOS AL LIO!

    2.- Configuración del "091" 

       2.1.- Arquitectura de las alertas



    Partimos de un esquema como el mostrado, donde queremos generar un aviso a nuestro dispositivo móvil en el momento en el que detectemos que hay algún problema, en este caso, un acceso indebido a nuestros recursos.

    Por lo tanto, teniendo ya montada nuestra integración, lo que vamos a hacer ahora es añadir un modulo de alertas para Telegram. Este modulo consistirá en 2 componentes principales:

    Nombre del Componente

    Descripción del Componente

    Operaciones.Notificaciones.Telegram

    Operación preconfigurada para realizar notificaciones urgentes vía Telegram desde el ESB.

    Proceso.Notificaciones.Telegram

    Proceso que orquestará los diferentes tipos de notificaciones REST vía Telegram.

     

    2.2.- ¿Quién es quién?

    2.2.1.- Operación
    Nuestra operación de envío de alertas a Telegram realizará notificaciones REST vía Telegram. Esta operación “simulara” ser un bot en la aplicación de Telegram y desde el ESB se controlará este bot, que emitirá las notificaciones a los grupos y/o personas según los acuerdos alcanzados para cada caso. Estas notificaciones serán inmediatas pudiendo aplicar un control temporal para no saturar los dispositivos móviles de las personas notificadas.

    Estas notificaciones podrán sustituir y/o complementar a las alertas ya vigentes (correo electrónico). Ya que su objetivo es que las personas responsables de cada aplicativo sean informadas lo antes posible de problemas ocurridos.

    2.2.2.- Proceso
    Nuestro proceso orquestará la configuración y parametrización de las notificaciones REST vía Telegram. Las diferentes casuísticas que consideremos realizarán llamadas a este proceso enviando la información solicitada para cada caso y este proceso preparará los mensajes personalizados para cada caso.

    Llegados a este punto, sabemos que vamos a utilizar una operación rest para notificar vía Telegram, pero nos queda explicar lo mas importante, ¿Qué es un bot de telegram? A continuación lo explicamos.

     

    2.3.- ¿Qué es un bot de telegram?

    Para la notificación instantánea de mensajería que se pretende implantar haremos uso de una de las principales funcionalidades de código abierto que nos da la API de Telegram como es la creación y administración de bots.

    2.3.1.- Bot

    Un bot es una funcionalidad de Telegram, la cual consiste en la creación de un perfil de usuario de Telegram que se controla por terceros gracias a unos parámetros de configuración definidos por la API. Esta funcionalidad simula ser un usuario de Telegram, y como todo usuario, puede enviar mensajería a través de la aplicación por medio de configuraciones del bot. En el ESB configuraremos este bot para que de forma automatizada envíe notificaciones a los diversos grupos que se hayan acordado.

    Para la creación de un bot que utilizaremos para enviar notificaciones vía Telegram, será necesario hacer uso de la funcionalidad ofrecida por el @botfather de Telegram.

    El @botfather es una funcionalidad de Telegram para controlar a otros bots y crearlos por cuenta propia y es una de las recomendaciones de los responsables de Telegram para crear de una forma más fácil tu propio bot. Esta funcionalidad dispone de una variedad amplia de comandos para configurar nuestro bot.

    Para empezar a crear nuestro bot, deberemos de seguir los siguientes pasos (7):

     
    Spoiler

    2.3.2.- Grupos
    Para realizar las notificaciones se hará mediante grupos privados de Telegram, en los cuales se incluirá en cada grupo a las personas acordadas. 

    Para crear un grupo deberemos abrir la aplicación de Telegram y seguir los siguientes pasos:

     
    Spoiler

    2.3.2.- Configuración de la alerta

    Ahora que ya tenemos nuestro bot y nuestro grupo de Telegram donde van a llegar las notificaciones, debemos orquestar en el ESB como enviarlas. 

    Os dejo por aquí un esqueleto de operación de envío de peticiones:

     
    Spoiler

    En la misma podéis observar que se necesita atacar a la URL con unos parámetros determinados:

    https://api.telegram.org/bot1234567890:[TOKEN]/sendMessage?chat_id=[CHATID]&text="_pRequest.mensaje

    En este punto, podemos ver que hay un valor que no disponemos, que es el CHAT ID. Este valor es muy fácil de obtener, pues con reenviar un mensaje desde nuestro nuevo grupo al @userinfobot de Telegram, este nos devolverá el ID del grupo como muestro a continuación:

     

    La producción nos debería quedar algo así:

    Una vez enviamos la petición REST desde el ESB, podemos ver la notificación en el Telegram.

    Esta operación nos vale para todo caso que queramos notificar, pues el Proceso anteriormente indicado, será el encargado de orquestar a que grupo llamar (CHAT ID) y que mensaje enviar (adaptado a cada caso), De forma que podamos tener N grupos y N mensajes diferenciados utilizando el mismo Bot.

    A continuación os dejo un breve video explicativo del proceso completo:

     

    Como podéis observar, siguiendo los pasos de esta guía, podréis notificar a quien queráis de cualquier cuestión que ocurra en el ESB de forma inmediata. ¡Así que espero que os sea de ayuda!

    No puedo terminar este articulo sin incluir una mejora del articulo anterior, y esta es la utilización de la consulta del usuario así como el uso de algunas de las URLs que nos ofrece el servidor OAUTH2 de Intersystems. Todo esto lo explicamos a continuación.

     

    3.- Actualización de consulta de usuario

    3.1.- Usuario de nuestro token por Endpoints Relacionados con Autenticación (OAUTH)

    A continuación os explico una forma mas sencilla y reutilizable de obtener este dato de forma que podamos aplicarlo para múltiples procesos.

    En el primer articulo ("Como controlar el acceso a tus recursos con OAuth2") en el que explicábamos como preparar el servidor OAUTH2 de Intersystems, indicábamos que la URL del servidor era:

         https://DNS/IP:57773/oauth2

    Una vez creamos el servidor, en su configuración podemos ver:

    Sistema > Gestión de seguridad > Cliente de OAuth 2.0 > Descripción del servidor  - (Configuración de seguridad)   

     
    Spoiler

    Como vemos, hay varias URLs que nos crea el servidor. Una de ellas es para consultar la información del usuario (userinfo) en OAuth 2.0, podemos utilizar la siguiente URL:

               https://DNS/IP:57773/oauth2/userinfo

    El procedimiento a seguir es enviar una solicitud GET al punto final UserInfo, incluyendo el token de acceso en el encabezado de la solicitud de autorización. El encabezado suele ser "Authorization: Bearer [token_de_acceso]". Para ello os muestro el paso a paso:

    Obtener el Token para el usuario "bezkfeZoA3mU2g1dmABlvgv9k1AKHN78JtIgXgcdQeQ":

     
    Spoiler

    Utilizando este Token hacia la URL de UserInfo obtenemos el usuario:

     
    Spoiler

    Como podéis ver, con un simple GET a esa URL y el token que ya disponemos, nos devuelve "sub" que es el "aud" que obteníamos por el JWT. De forma que podemos montarnos una operación REST en el ESB que realice esta operación y tendremos la respuesta inmediata.

    Os dejo por aquí una estructura de una operación REST para que podáis estructurar vuestras pruebas:

     
    Spoiler

     

    3.2.- Endpoints útiles para OAUTH

    La URL del UserInfo la podemos obtener llamando a la URL:

         https://DNS/IP:PUERTO/oauth2/.well-known/openid-configuration

    La cual nos entrega el siguiente JSON que os sonará:

     
    Spoiler

    En esta lista de URLs vemos algunas interesantes como son:

    "userinfo_endpoint" : "https://DNS/IP:PUERTO/oauth2/userinfo"
    "token_endpoint" : "https://DNS/IP:PUERTO:57776/oauth2/token"
    "introspection_endpoint" : "https://DNS/IP:PUERTO/oauth2/introspection"
    "registration_endpoint" : "https://DNS/IP:PUERTO/oauth2/register"
    "revocation_endpoint" : "https://DNS/IP:PUERTO/oauth2/revocation"

    2.3.1.- token

    La URL "userInfo" ya le hemos explicado en este articulo, por lo que a continuación vamos a explicar "token_endpoint"; pues es la que utilizamos en capítulos anteriores para obtener el token.

    Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/token" deberemos realizar un GET con los siguientes parámetros de configuración:

     
    Spoiler

    3.3.2.- introspection
    La siguiente URL que vamos a explicar es "introspection_endpoint". Que es la que nos permite validar un token en el servidor de autorización para verificar su estado y obtener más detalles sobre él (como sus permisos, emisor, usuario asociado, etc.). Este endpoint normalmente se utiliza en arquitecturas donde un recurso protegido requiere verificar la validez de un token antes de otorgar acceso.

    Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/introspection" deberemos realizar un POST con los siguientes parámetros de configuración:

     
    Spoiler

    3.3.3.- registration

    La siguiente URL que vamos a explicar es "registration_endpoint" . Este endpoint permite que las aplicaciones cliente dinámicamente se registren en el servidor de autorización sin necesidad de configurar manualmente las credenciales en el servidor.

    Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/register" deberemos realizar un POST con los siguientes parámetros de configuración:

     
    Spoiler

    3.3.4.- revocation

    La siguiente URL que vamos a explicar es "revocation_endpoint". Que es el endpoint definido en el estándar OAuth 2.0 que permite revocar tokens emitidos previamente por un servidor de autorización

    Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/revocation" deberemos realizar un POST con los siguientes parámetros de configuración:

     
    Spoiler

    Con esta revocación del token termina este articulo. Espero que les sea de utilidad y les sirva para ponerse al día en cuanto a aplicación de seguridad en nuestras plataformas, pues todo esto lo podemos gestionar desde nuestro portal de gestión de Intersystems.

    Finalmente, espero que se conviertan ¡en el mejor equipo de seguridad posible!

    Muchas gracias por el tiempo que han dedicado a esta lectura.
     

    4 Comments
    Discussão (4)3
    Entre ou crie uma conta para continuar