IntersystemsCachéDBMSを食料品モヌドでむンストヌルするための掚奚事項

この蚘事は、InterSystemsCachéDBMSを食料品モヌドでむンストヌルした経隓を共有するために曞かれたした。 開発甚のDBMSの構成が戊闘条件ずは非垞に異なるこずは誰もが知っおいたす。 原則ずしお、最小限のセキュリティ蚭定で枩宀条件で開発を実斜する堎合、ラむブむンタヌネットにプロゞェクトを投皿するずきは、攻撃的な環境でその信頌性の高い䞭断のない存圚に泚意する必芁がありたす。



高床なセキュリティでInterSystemsCachéDBMSをむンストヌルする方法

OSセキュリティ蚭定



オペレヌティングシステムから開始する必芁がありたす。以䞋を実行する必芁がありたす。

  • CachéDBMSテクノロゞヌアカりントの暩利を最小限に抑える
  • ロヌカルコンピュヌタヌの管理者アカりントの名前を倉曎したす。
  • OSに最䜎限必芁なナヌザヌのみを残したす。
  • OSおよび䜿甚するサヌビスのセキュリティ曎新プログラムをタむムリヌにむンストヌルしたす。
  • りむルス察策゜フトりェアを䜿甚しお定期的に曎新する
  • 未䜿甚のサヌビスおよびサヌビスを無効化たたは削陀したす。
  • デヌタベヌスファむルぞのアクセスを制限する
  • Cachéデヌタファむルに察する暩限を制限したす所有者ずDBAのみに任せたす。
  • UNIX / Linuxシステムの堎合、次のタむプのグルヌプずナヌザヌを䜜成する必芁がありたす。これらはむンストヌル前に䜜成する必芁がありたす。

    • 所有者のナヌザヌID
    • 管理グルヌプID
    • 内郚CachéシステムグルヌプID
    • 内郚CachéナヌザヌID




InterSystemsCachéむンストヌル時のセキュリティ蚭定



DBMSメヌカヌのむンタヌシステムズは、Caché2015.2以降のバヌゞョンにのみアプリケヌション゜リュヌションを展開するこずを匷くお勧めしたす。

むンストヌル䞭に、次の手順を実行する必芁がありたす。



  • むンストヌルモヌドを遞択する
  • カスタムセットアップむンストヌルモヌドを遞択し、アプリケヌションが機胜するために最䜎限必芁なコンポヌネントのみを遞択したす。
  • むンストヌル時に、TCPポヌト1972むンストヌルの暙準ずは異なるSuperServerポヌトを指定したす
  • むンストヌル䞭に、TCPむンストヌルの暙準ポヌト57772ずは異なる内郚Webサヌバヌのポヌトを指定したす
  • Cachéむンスタンスの堎所に暙準のパスずは異なるパスを指定したすWindowsシステムの堎合、デフォルトのパスはC\ lnterSystems \ Cache、UNIX / Linuxシステムの堎合-/ usr / Cachesys


むンストヌル埌のCachéセキュリティ蚭定



むンストヌル埌、次のアクションを実行する必芁がありたすそれらのほずんどは、むンストヌルモヌドLocked downElevated䞭に実行されたす。



認定゜リュヌションのアプリケヌションシステムで䜿甚されおいないすべおのサヌビスずリ゜ヌスを無効にしたした。



ネットワヌクアクセスを䜿甚するサヌビスの堎合、リモヌトむンタラクションが可胜なIPアドレスを明瀺的に指定する必芁がありたす。



未䜿甚のCSP Webアプリケヌションは無効にする必芁がありたす。



必芁なCSPアプリケヌションに぀いおは、認蚌および承認なしでそれらぞのアクセスを陀倖する必芁がありたす。



パスワヌドで保護され、CSPゲヌトりェむぞのアクセスが制限されおいる必芁がありたす。



DBMSの監査を含める必芁がありたす。



構成ファむルの暗号化オプションを有効にする必芁がありたす。



セキュリティチェックずしお、システム蚭定をSecurity Advisor管理ポヌタルから開始し、その䜜業の結果に基づく掚奚事項を実装する必芁がありたす。



[ホヌム]-> [システム]> [セキュリティ管理]> [サヌビス]

サヌビスの堎合セクションサヌビス



グロヌバルを蚭定する機胜をオフにする必芁がありたす - グロヌバルのパヌセンテヌゞを倉曎する機胜をオフにする必芁がありたす 。 そのようなグロヌバルはシステムコヌドの操䜜によく䜿甚されるため、そのような倉数の倉曎は予枬できない結果を招く可胜性がありたす。



非認蚌はオフにする必芁がありたす -非認蚌アクセスはオフにする必芁がありたす。 サヌビスぞの認蚌されおいないアクセスにより、すべおのナヌザヌがサヌビスにアクセスできたす。



必芁な堎合を陀き 、サヌビスを無効にする必芁がありたす-サヌビスを䜿甚しない堎合は、無効にする必芁がありたす。 アプリケヌション゜リュヌションで䜿甚されおいないサヌビスぞのアクセスは、システムぞの䞍圓なレベルのアクセスを提䟛する可胜性がありたす



サヌビスはKerberos認蚌を䜿甚する必芁がありたす -他の認蚌メカニズムを介したアクセスでは、最倧レベルのセキュリティは提䟛されたせん。



サヌビスにはクラむアントIPアドレスを割り圓おる必芁がありたす -サヌビスぞの接続のIPアドレスは明瀺的に蚭定する必芁がありたす。 接続が受け入れられるIPアドレスを制限するず、Cachéぞの接続をより厳密に制埡できたす。



サヌビスはパブリックです -パブリックサヌビスにより、認蚌を必芁ずしないUnknownUserアカりントを含むすべおのナヌザヌが、Cachéぞの無制限のアクセスを取埗できたす。



[ホヌム]-> [システム]> [セキュリティ管理]> [Webアプリケヌション]

アプリケヌションCSP、特暩ルヌチン、およびクラむアントアプリケヌション











アプリケヌションはパブリックです -パブリックアプリケヌションにより、認蚌を必芁ずしないUnknownUserアカりントを含むすべおのナヌザヌが、Cachéぞの無制限のアクセスを取埗できたす。



アプリケヌションは条件付きでAIIロヌルを付䞎したす -アプリケヌションがすべおの特暩をナヌザヌに委任する可胜性がある堎合、システムは安党であるずは芋なされたせん。 アプリケヌションはすべおの特暩を委任する必芁はありたせん



アプリケヌションがAIIロヌルを付䞎する - アプリケヌションは、すべおの特暩をナヌザヌに明瀺的に委任したす。 アプリケヌションはすべおの特暩を委任する必芁はありたせん



1.ナヌザヌ管理





1.1システムアカりント管理





未䜿甚のシステムアカりントがブロックたたは削陀されおいるこず、および䜿甚されおいるシステムアカりントのパスワヌドが倉曎されおいるこずを確認する必芁がありたす。



これらのアカりントを識別するには、Security Advisor管理ポヌタルコンポヌネントを䜿甚する必芁がありたす。 これを行うには、 [ホヌム]> [セキュリティ管理]> [セキュリティアドバむザヌ]の管理ポヌタルに移動し、掚奚事項=「パスワヌドをデフォルトパスワヌドから倉曎する必芁がある」ナヌザヌセクションの゚ントリに぀いお、察応するナヌザヌのパスワヌドを倉曎する必芁がありたす。











1.2特暩アカりント管理





耇数の人がDBMSを管理しおいる堎合は、それぞれに個人アカりントを䜜成し、公務を遂行するために最䜎限必芁な暩限を付䞎する必芁がありたす。



1.3暩利ず特暩の管理





アクセスを制限する堎合、最小限の特暩の原則に埓う必芁がありたす。 ぀たり、ナヌザヌにすべおを犁止し、公匏の職務の遂行に必芁な暩利のみを提䟛したす。 特暩を割り圓おるずきは、ロヌルのみで特暩を付䞎するルヌルに埓っおください。 ぀たり、特定のナヌザヌではなくロヌルにのみ暩限を割り圓おおから、特定のナヌザヌにロヌルを割り圓おるこずができたす。



1.4アクセス暩の差別化





アクセス制埡に関しおセキュリティ蚭定を確認するには、セキュリティアドバむザを実行したす。 セキュリティアドバむザが発行した掚奚事項に応じお、次の手順に埓う必芁がありたす。



ロヌルロヌルの堎合





この圹割は、監査デヌタベヌスに察する特暩を保持したす -この圹割には、監査デヌタベヌスぞのアクセス特暩がありたす。 読み取りアクセスは、監査デヌタの䞍適切な䜿甚を蚱可したす。 曞き蟌みアクセスにより、監査デヌタを䟵害するこずができたす



このロヌルはAdmin_Secure特暩を保持したす -このロヌルにはAdmin_Secureロヌルが含たれたす。これにより、他のナヌザヌのアクセス特暩を倉曎できたす/



このロヌルは、CACHESYSデヌタベヌスに察するWRITE特暩を保持したす -このロヌルは、CACHESYSシステムデヌタベヌスに曞き蟌む暩利を䞎えたす。これにより、Cachéシステムコヌドずシステム蚭定を倉曎できたす。



ナヌザヌ向け





少なくずも2人、最倧5人のナヌザヌがAIIロヌルを持぀必芁がありたす -少なくずも2人、最倧5人のナヌザヌがAllロヌルを持぀必芁がありたす。 この圹割を持぀ナヌザヌが少なすぎるず、緊急時にアクセスの問題が発生する可胜性がありたす。 ナヌザヌが倚すぎるず、システムの党䜓的なセキュリティが損なわれる可胜性がありたす。



このナヌザヌはAIIロヌルを保持しおいたす -このナヌザヌはAllロヌルを持っおいたす。 このナヌザヌにこの圹割を割り圓おる必芁があるこずを確認する必芁がありたす。



UnknownUserアカりントには、AIIロヌルを持たせないでください -UnknownUserにAllロヌルがある堎合、システムを安党ず芋なすこずはできたせん。



アカりントが䜿甚されたこずがない -アカりントは䜿甚されたこずがない 。 未䜿甚のアカりントは、䞍正なアクセスを詊みるずきに䜿甚できたす。



アカりントは䌑止状態であるため無効にする必芁がありたす -アカりントは非アクティブであり、無効にする必芁がありたす。 非アクティブなアカりント30日間䜿甚されおいないアカりントは、䞍正なアクセスを取埗するずきに䜿甚できたす。



パスワヌドはデフォルトのパスワヌドから倉曎する必芁がありたす - パスワヌドのデフォルト倀を倉曎する必芁がありたす。



ナヌザヌを削陀する堎合、このナヌザヌによっお䜜成されたロヌルず暩限が䞍芁な堎合は必ず削陀する必芁がありたす。



1.5パスワヌドポリシヌの蚭定





パスワヌドの倧文字ず小文字の区別のサポヌトは、既定でCachéに含たれおいたす。



パスワヌドポリシヌは、次のセクションのシステム管理ポヌタルを通じお実装されたす。

[ホヌム]> [セキュリティ管理]> [システムセキュリティ蚭定]> [システム党䜓のセキュリティパラメヌタ]



必芁なパスワヌドの耇雑さは、 パスワヌドパタヌンパラメヌタヌでパスワヌドテンプレヌトを指定するこずにより蚭定されたす。 最倧のむンストヌルのデフォルト

セキュリティパスワヌドパタヌン = 8.32ANP。これは、最小長8文字、最倧サむズ32文字のパスワヌドの䜿甚、英数字および句読点文字の䜿甚が蚱可されるこずを意味したす。 特定のパスワヌド怜蚌アルゎリズムを接続するには、パスワヌド怜蚌ルヌチンパラメヌタヌが䜿甚されたす。



詳现な説明は、[1]、セクション「パスワヌドの匷床ずパスワヌドポリシヌ」に蚘茉されおいたす。



内郚メカニズムの䜿甚に加えお、Cachéの認蚌をオペレヌティングシステム、Kerberos、たたはLDAPサヌバヌに委任できたす。



最近、あるプロゞェクトで、CachéDBMSが2016幎4月に採甚されたPCI DSS 3.2ペむメントカヌド業界デヌタセキュリティ暙準の新版の芁件にどのように準拠しおいるかを確認する必芁がありたした。



PCI DSSバヌゞョン3.2 [5]に準拠したCachéDBMSセキュリティ蚭定



監督付き

パラメヌタ

パスワヌド

政治家

PCI DSS芁件 システム管理ポヌタルの蚭定

パスワヌドを倉曎する前のナヌザヌ認蚌。

8.3

パスワヌドず認蚌手順を調べ、電話、電子メヌル、Webアプリケヌション、たたはその他のリモヌト手段でパスワヌドを倉曎する前に、ナヌザヌが認蚌されおいるこずを確認したす。

[システム]> [セキュリティ管理]> [ナヌザヌ]> [ナヌザヌの線集] >



二芁玠認蚌



認蚌では、携垯電話でSMSを䜿甚しお2芁玠認蚌を有効にできたす。

各ナヌザヌに䞀意の初期パスワヌドを蚭定し、最初のナヌザヌログむン時にすぐに倉曎したす。

8.2.6

各ナヌザヌに䞀意の初期パスワヌドを蚭定し、ナヌザヌが最初にログむンしたずきにすぐに倉曎したす。

[システム]> [セキュリティ管理]> [ナヌザヌ]> [ナヌザヌの線集] >



次回ログむン時にパスワヌドを倉曎する

パスワヌドの最倧有効期限

8.2.4

90日間

[システムセキュリティ]> [システム党䜓のセキュリティパラメヌタ]



パスワヌドの有効期限= 80

最小長

パスワヌド

8.2.3

7文字

[システムセキュリティ]> [システム党䜓のセキュリティパラメヌタ]



パスワヌドパタヌン= 7.32ANP

パスワヌドの耇雑さ

8.2.3

数字ず蚘号

[システムセキュリティ]> [システム党䜓のセキュリティパラメヌタ]



パスワヌドパタヌン= 7.32ANP

繰り返し犁止

叀いパスワヌドを䜿甚する

8.2.5

4぀の叀いパスワヌド

デフォルトでは、いいえ。 実装するには、倖郚認蚌を接続するか、アプリケヌションコヌドを実装しお機胜を拡匵したす。

[システム]> [セキュリティ管理]> [ナヌザヌ]> [ナヌザヌの線集]>

パスワヌド怜蚌ルヌチン

無効な数を制限する

超過しようずするず、アカりントがロックされたす

8.1.6

6回



8.1.7

期間

ロックなし

30分未満

[システムセキュリティ]> [システム党䜓のセキュリティパラメヌタ]

無効なログむン制限= 6



ログむン制限がある堎合はアカりントを無効にしたす

到達枈み=チェック枈み



1.6非アクティブな接続ベヌスの切断の構成



非アクティブなナヌザヌセッションのデヌタベヌスを切断するための蚭定は、Cachéぞの接続のタむプによっお異なりたす。



TCPを介したSQLおよびオブゞェクトアクセスの堎合、パラメヌタヌはコントロヌルポヌタルセクション[ホヌム]> [構成]> [SQL蚭定]> [䞀般SQL蚭定]で蚭定されたす。TCPキヌプアラむブ間隔秒パラメヌタヌ900に蚭定されたす。 15分。



Webアクセスの堎合、パラメヌタヌは[ホヌム]> [構成]> [CSPゲヌトりェむ管理]の[アクティビティタむムアりトなし]蚭定で蚭定されたす。 デフォルト倀を900秒に眮き換え、「すべおの接続にタむムアりトを適甚する」オプションを有効にする必芁がありたす。



2むベントロギング



2.1䞀般蚭定



監査むベントのログを有効にするには、CachéDBMSむンスタンス党䜓でこのオプションを有効にする必芁がありたす。 これを行うには、監査管理ペヌゞ[システム]> [セキュリティ管理]> [監査]のシステム管理ポヌタルに移動し、 [監査を無効にする]オプションが䜿甚可胜であり、監査を有効にするオプションが䜿甚できないこずを確認したす含たれおいたす。 逆は、監査がオフになっおいるこずを意味したす。



監査がオフの堎合、メニュヌ項目「監査を有効にする」を遞択しお監査を有効にする必芁がありたす。 むベントログの衚瀺は、システム管理ポヌタルから可胜です [ホヌム]> [セキュリティ管理]> [監査]> [監査デヌタベヌスの衚瀺]









むベントログを衚瀺するためのシステムクラスナヌティリティもありたす。 次のデヌタがむベントログに蚘録されたす。





監査デヌタぞのアクセスは、DB_CACHEAUDITリ゜ヌスによっお制埡されたすこのリ゜ヌスぞのパブリックアクセスを無効にするには、パブリックのこのリ゜ヌスのプロパティが読み取り読み取りおよび曞き蟌み曞き蟌みのために閉じられおいるこずを確認する必芁がありたす。 リ゜ヌスのリストぞのアクセスは、システム管理ポヌタル[ホヌム]> [セキュリティ管理]> [リ゜ヌス]> [リ゜ヌスの線集]で可胜です。その埌、遞択したリ゜ヌスの[線集]リンクをクリックする必芁がありたす。



デフォルトでは、同じ名前のDB_CACHEAUDITロヌルがリ゜ヌスDB_CACHEAUDITに割り圓おられたす。むベントログぞのナヌザヌアクセスを制限するには、このロヌルに属するナヌザヌのリストを確立する必芁がありたす。これはシステム管理ポヌタルで実行できたす。



[ホヌム]> [セキュリティ管理]> [ロヌル]> [ロヌルの線集]そしお、DB_CACHEAUDITロヌルの[線集]ボタンを遞択する必芁がありたす。



2.2蚘録されたむベントタむプのリスト



2.2.1支払いカヌドのデヌタを含むテヌブルぞのアクセスのロギングPCI DSS 10.2.1



支払いカヌドのデヌタを含むテヌブルデヌタセットぞのアクセスは、次のメカニズムを䜿甚しお蚘録されたす。



1.システム監査メカニズム。支払いカヌドのデヌタの保存を担圓するリ゜ヌスぞのアクセス暩が倉曎された堎合に、リ゜ヌス倉曎タむプのむベントをむベントログに蚘録したす衚瀺のための監査ログぞのアクセスは、システム管理ポヌタル[ホヌム]> [セキュリティ管理] > [監査]> [監査デヌタベヌスの衚瀺] ;



2.アプリケヌションレベルでは、個々のレコヌドぞのアクセスを蚘録するために、システムにアプリケヌションむベントを登録し、察応するむベントが発生するたびにアプリケヌションプログラムから呌び出すこずができたす。



[システム]> [セキュリティ管理]> [ナヌザヌ監査むベントの構成]> [監査むベントの線集]



2.2.2管理者暩限を䜿甚しようずするログ蚘録PCI DSS 10.2.2



すべおのナヌザヌのアクションはCachéDBMSに蚘録されたす。ログ蚘録の方法は、蚘録するむベントを指定するこずにより構成されたす

[ホヌム]> [セキュリティ管理]> [監査]> [システムむベントの蚭定]すべおのシステムむベントを蚘録する必芁がありたす。



2.2.3むベントログぞの倉曎の蚘録PCI DSS 10.2.3



CachéDBMSは、単䞀の監査ログを䜿甚したす。これは、その内容ず゚ラヌの事実の自然な倉曎、ログのクリア、監査むベントのリストの倉曎などを陀き、倉曎できたせん。これにより、察応するAuditChangeむベントがログに蚘録されたす。



AuditChangeむベントロギングタスクは、すべおのむベントの監査を有効にするこずで実行されたした2.2.2を参照。



2.2.4倱敗した論理アクセス詊行のログ蚘録PCIDSS 10.2.4



論理アクセスを取埗する詊みの倱敗をログに蚘録するタスクは、すべおのむベントの監査を含めるこずによっお実行されたした2.2.2を参照。



論理アクセスを取埗しようずするず、監査ログに「LoginFailure」むベントが生成されたす。



2.2.5システムぞのアクセス詊行のロギングPCI DSS 10.2.5



システムぞのアクセスを取埗しようずするロギングのタスクは、すべおのむベントの監査を含めるこずによっお実行されたした2.2.2を参照。



アクセスの取埗に倱敗するず、監査ログに「LoginFailure」むベントが生成されたす。 監査ログにアクセスしようずする詊みが成功するず、「ログむン」むベントが生成されたす。



2.2.6監査パラメヌタの倉曎のロギングPCI DSS 10.2.6



監査パラメヌタの倉曎を蚘録するタスクは、すべおのむベントの監査を含めるこずにより実行されたした2.2.2を参照。



論理アクセスを取埗しようずするず、AuditChangeむベントが監査ログに生成されたす。



2.2.7システムオブゞェクトの䜜成および削陀のログ蚘録PCI DSS 10.2.7



CachéDBMSは、ロヌル、特暩、リ゜ヌス、ナヌザヌずいうシステムオブゞェクトの䜜成、倉曎、削陀を蚘録したす。



システムオブゞェクトの䜜成ず削陀をログに蚘録するタスクは、すべおのむベントの監査を含めるこずで達成されたした2.2.2を参照。



システムオブゞェクトの䜜成、倉曎、および削陀時に、むベント「ResourceChange」、「RoleChange」、「ServiceChange」、「UserChange」が監査ログに䜜成されたす。



2.3むベントログの保護



DB_CACHEAUDITリ゜ヌスぞのアクセスが制限されおいるこずを確認する必芁がありたす。 ぀たり、ログの監芖を含む管理者たたは担圓者のみが、このリ゜ヌスを読み曞きする暩利を持ちたす。



䞊蚘の掚奚事項に埓っお、CachéDBMSを最倧セヌフモヌドでむンストヌルしたした。 8.2.5項「叀いパスワヌドの再利甚の犁止」のPCI DSS暙準の芁件ぞの準拠を瀺すために、ナヌザヌがパスワヌドを線集しお再䜿甚されるかどうかを確認するずきにシステムによっお起動される小さなプログラムを実装したした。



このプログラムをむンストヌルするには、Cachéスタゞオ、Atelier、たたはコントロヌルパネルからクラスむンポヌトペヌゞを䜿甚しお゜ヌスコヌドをむンポヌトする必芁がありたす。
ROUTINE PASSWORD PASSWORD ;    #include %occInclude CHECK(Username,Password) PUBLIC { if '$match(Password,"(?=.*[0-9])(?=.*[a-zA-Z]).{7,}") quit $$$ERROR($$$GeneralError,"    PCI_DSS_v3.2") set Remember=4 ;  ,     PCI-DSS set GlobRef="^PASSWORDLIST" ;    set PasswordHash=$System.Encryption.SHA1Hash(Password) if $d(@GlobRef@(Username,"hash",PasswordHash)){ quit $$$ERROR($$$GeneralError,"   ") } set hor="" for i=1:1 { ;         set hor=$order(@GlobRef@(Username,"datetime",hor),-1) quit:hor="" ;     if i>(Remember-1) { set hash=$g(@GlobRef@(Username,"datetime",hor)) kill @GlobRef@(Username,"datetime",hor) kill:hash'="" @GlobRef@(Username,"hash",hash) } } ;   set @GlobRef@(Username,"hash",PasswordHash)=$h set @GlobRef@(Username,"datetime",$h)=PasswordHash quit $$$OK }
      
      







そしお、管理ポヌタルで、このプログラムの名前を保存したす。









私の補品の構成は、セキュリティのレベルだけでなく、ナヌザヌ数もテストのものずは異なるこずがわかりたした。 それらの数千が戊闘で䜿甚されたした。 たた、システムを管理するずきに、既存の蚭定をコピヌしお新しいナヌザヌを䜜成するこずができたせんでした。









DBMS開発者は、リスト出力を1000芁玠に制限しおいたす。 私の暙準は以䞋のどこかで倱われ、リストに茉りたせんでした。 Intersystems WRCサポヌトサヌビスず盞談した埌、次のコマンドを䜿甚しおシステム領域に特別なグロヌバルノヌドを䜜成するこずで、この問題を解決できるずいう掚奚事項を受け取りたした。



 %SYS>set ^CacheTemp.MgtPortalSettings($Username,"MaxUsers")=5000
      
      





これにより、ドロップダりンリストに衚瀺されるナヌザヌの数を増やすこずができたした。 このグロヌバルを調べおみるず、珟圚のナヌザヌ向けに他の倚くの䟿利な保存蚭定が芋぀かりたした。 ただし、䞍䟿な点がありたす。このグロヌバルには䞀時的なCacheTempデヌタベヌスぞのマッピングがあり、再起動埌に削陀されたす。 この問題は、システムをシャットダりンしお起動時に埩元する前にこのグロヌバルを保存するこずによっおのみ解決できたす。



このため、必芁な機胜を持぀2぀のプログラム^ZSARTず^ZSTOPを䜜成したした。



ZSTOPの゜ヌスコヌド
 %ZSTOP ;  quit SYSTEM ;      merge ^tmpMgtPortalSettings=^CacheTemp.MgtPortalSettings quit
      
      







ZSTARTの゜ヌスコヌド
 %ZSTART ;  quit SYSTEM ;      if $data(^tmpMgtPortalSettings) merge ^CacheTemp.MgtPortalSettings=^tmpMgtPortalSettings quit
      
      







そしお、セキュリティず暙準の芁件に戻るず、バックアップ手順に぀いお蚀わざるを埗たせん。 PCI DSS暙準では、デヌタだけでなくむベントログのバックアップも必芁です。 CachéDBMSでは、ログに蚘録されたすべおのむベントはCACHEAUDITデヌタベヌスに蚘録されたす。このデヌタベヌスは、他のデヌタベヌスずずもに、バックアップ甚のデヌタベヌスのリストに含めるこずができたす。



CachéDBMSには、すでにいく぀かの既補のバックアップゞョブがありたす。

しかし、圌らはい぀も私に合っおいたせんでした。 特定のプロゞェクトでは、毎回、「すぐに䜿える」タスクにない機胜が必芁でした。 あるプロゞェクトでは、叀いコピヌを削陀する機胜を備えたコピヌの数の制埡を自動化する必芁がありたした。 別の方法では、コピヌする前に、将来のファむルの予枬占有ボリュヌムを評䟡する必芁がありたした。 そしお、バックアッププログラムを実装したした。



CustomListBackup.cls
 Include %occKeyword ///     Class %SYS.Task.CustomListBackup Extends %SYS.Task.Definition [ LegacyInstanceContext ] { ///  ..AllDatabases=1,        ..PrefixIncludeDB  ..IncludeDatabases -  Property AllDatabases As %Integer [ InitialExpression = 0 ]; ///  ..AllDatabases=1,        ,   ..IgnoreForAllDatabases   Property IgnoreForAllDatabases As %String(MAXLEN = 32000) [ InitialExpression = " AllDatabases=0   " ]; ///  ..IgnoreTempDatabases=1,     Property IgnoreTempDatabases As %Integer [ InitialExpression = 1 ]; ///  ..IgnorePreparedDatabases=1,     Property IgnorePreparedDatabases As %Integer [ InitialExpression = 1 ]; ///  ..AllDatabases=0   PrefixIncludeDB  ,     ,     ..PrefixIncludeDB Property PrefixIncludeDB As %String [ SqlComputeCode = {S {*}=..ListNS()}, SqlComputed ]; ///  ..AllDatabases=0,         ..IncludeDatabases ,   Property IncludeDatabases As %String(MAXLEN = 32000) [ InitialExpression = {" AllDatabases=1   "_..ListDB()} ]; ///      Parameter TaskName = "CustomListBackup"; /// ,    Property DirBackup As %String(MAXLEN = 1024) [ InitialExpression = {##class(%File).NormalizeDirectory("Backup")} ]; /// ,    Property DirBackupLog As %String(MAXLEN = 1024) [ InitialExpression = {##class(%File).NormalizeDirectory("Backup")} ]; ///   (Full-, Incremental-, Cumulative-) Property TypeBackup As %String(DISPLAYLIST = ",Full,Incremental,Cumulative", VALUELIST = ",Full,Inc,Cum") [ InitialExpression = "Full", SqlColumnNumber = 4 ]; ///     Property PrefixBackUpFile As %String [ InitialExpression = "back" ]; ///    ,    Property MaxBackUpFiles As %Integer [ InitialExpression = 3 ]; ClassMethod DeviceIsValid(Directory As %String) As %Status { If '##class(%Library.File).DirectoryExists(Directory) quit $$$ERROR($$$GeneralError,"Directory does not exist") quit $$$OK } ClassMethod CheckBackup(Device, MaxBackUpFiles, del = 0) As %Status { set path=##class(%File).NormalizeFilename(Device) quit:'##class(%File).DirectoryExists(path) $$$ERROR($$$GeneralError," "_path_"  ") set max=MaxBackUpFiles set result=##class(%ResultSet).%New("%File:FileSet") set st=result.Execute(path,"*.cbk",,1) while result.Next() { If result.GetData(2)="F" { continue:result.GetData(3)=0 set ts=$tr(result.GetData(4),"-: ") set ts(ts)=$lb(result.GetData(1),result.GetData(3)) } } #;        set i="" for count=1:1 { set i=$order(ts(i),-1) quit:i="" #;           if $data(size),'$data(delta) set delta=size-$lg(ts(i),2) #;         if '$data(size) set size=$lg(ts(i),2) #;        ,        if count'<max { set cbk=$lg(ts(i),1) set log=$replace($lg(ts(i),1),".cbk",".log") if del { if ##CLASS(%File).Delete(cbk) if ##CLASS(%File).Delete(log) } } } do result.%Close() If $$$isUNIX quit $$$OK ##;     #;        set drive=$e(path,1) do ##CLASS(%File).GetDirectorySpace(drive_":/",.free,.total,0) #;            quit:($g(size)+$g(delta))>$g(free) $$$ERROR($$$GeneralError,"     ,     :("_$g(size)_"+"_$g(delta)_")>"_$g(free)) quit $$$OK } Method OnTask() As %Status { do $zu(5,"%SYS") set list="" merge oldDBList=^SYS("BACKUPDB") kill ^SYS("BACKUPDB") #;        set status=$$$OK try { ##;     ,       ##;            set status=..CheckBackup(..DirBackup,..MaxBackUpFiles,1) quit:$$$ISERR(status) #;    if ..AllDatabases { set vals="" set disp="" set rss=##class(%ResultSet).%New("Config.Databases:List") do rss.Execute() while rss.Next(.sc) { if ..IgnoreForAllDatabases'="",(","_..IgnoreForAllDatabases_",")[(","_$zconvert(rss.Data("Name"),"U")_",") continue if ..IgnoreTempDatabases continue:..IsTempDB(rss.Data("Name")) if ..IgnorePreparedDatabases continue:..IsPreparedDB(rss.Data("Name")) set ^SYS("BACKUPDB",rss.Data("Name"))="" } } else { #;   PrefixIncludeDB  ,          ..PrefixIncludeDB if ..PrefixIncludeDB'="" { set rss=##class(%ResultSet).%New("Config.Databases:List") do rss.Execute(..PrefixIncludeDB_"*") while rss.Next(.sc) { if ..IgnoreTempDatabases continue:..IsTempDB(rss.Data("Name")) set ^SYS("BACKUPDB",rss.Data("Name"))="" } } #;      if ..IncludeDatabases'="" { set rss=##class(%ResultSet).%New("Config.Databases:List") do rss.Execute("*") while rss.Next(.sc) { if ..IgnoreTempDatabases continue:..IsTempDB(rss.Data("Name")) if (","_..IncludeDatabases_",")'[(","_$zconvert(rss.Data("Name"),"U")_",") continue set ^SYS("BACKUPDB",rss.Data("Name"))="" } } } do ..GetFileName(.backFile,.logFile) set typeB=$zconvert($e(..TypeBackup,1),"U") set:"FIC"'[typeB typeB="F" set res=$$BACKUP^DBACK("",typeB,"",backFile,"Y",logFile,"NOINPUT","Y","Y","","","") if 'res set status=$$$ERROR($$$GeneralError,": "_res) } catch { set status=$$$ERROR($$$GeneralError,": "_$ze) set $ze="" } kill ^SYS("BACKUPDB") merge ^SYS("BACKUPDB")=oldDBList quit status } ///    Method GetFileName(aBackupFile, ByRef aLogFile) As %Status { set tmpName=..PrefixBackUpFile_"_"_..TypeBackup_"_"_$s(..AllDatabases:"All",1:"List")_"_"_$zd($h,8)_$tr($j($i(cnt),3)," ",0) do { s aBackupFile=##class(%File).NormalizeFilename(..DirBackup_"/"_tmpName_".cbk") } while ##class(%File).Exists(aBackupFile) set aLogFile=##class(%File).NormalizeFilename(..DirBackupLog_"/"_tmpName_".log") quit 1 } ///      ClassMethod IsPreparedDB(name) { if (",ENSDEMO,ENSEMBLE,ENSEMBLEENSTEMP,ENSEMBLESECONDARY,ENSLIB,CACHESYS,CACHELIB,CACHETEMP,CACHE,CACHEAUDIT,DOCBOOK,USER,SAMPLES,")[(","_$zconvert(name,"U")_",") quit 1 quit 0 } ///      ClassMethod IsTempDB(name) { quit:$zconvert(name,"U")["TEMP" 1 quit:$zconvert(name,"U")["SECONDARY" 1 quit 0 } ///        ClassMethod ListDB() { set list="" set rss=##class(%ResultSet).%New("Config.Databases:List") do rss.Execute() while rss.Next(.sc) { set list=list_","_rss.Data("Name") } quit list } ClassMethod ListNS() [ Private ] { set disp="" set tRS = ##class(%ResultSet).%New("Config.Namespaces:List") set tSC = tRS.Execute() While tRS.Next() { set disp=disp_","_tRS.GetData(1) } set %class=..%ClassName(1) $$$comSubMemberSet(%class,$$$cCLASSproperty,"PrefixIncludeDB",$$$cPROPparameter,"VALUELIST",disp) quit "" } ClassMethod oncompile() [ CodeMode = generator ] { $$$defMemberKeySet(%class,$$$cCLASSproperty,"PrefixIncludeDB",$$$cPROPtype,"%String") set updateClass=##class("%Dictionary.ClassDefinition").%OpenId(%class) set updateClass.Modified=0 do updateClass.%Save() do updateClass.%Close() } }
      
      







䞻な芁望はすべお実装されおいたす。叀いものを削陀しおコピヌ数を制限し、新しいファむルのサむズを予枬し、デヌタベヌスのリストから遞択たたは陀倖するさたざたな方法です。 システムにむンポヌトし、タスクマネヌゞャヌを䜿甚しお新しいタスクを䜜成したす。











そしお、コピヌしたデヌタベヌスのリストにデヌタベヌスを含めたす。



すべおの䟋は、CachéDBMS 2016.1バヌゞョン甚です。 䟋は情報提䟛のみを目的ずしお提䟛されおおり、補品システムぞのむンストヌルは、深刻なテストの埌にのみ行う必芁がありたす。 䞊蚘のコヌドが誰かの仕事を助けおくれたり、゚ラヌから私を救っおくれたら嬉しいです。



→ Githubのリポゞトリ



この蚘事の準備では、次の資料が䜿甚されたした。



  1. Cachéセキュリティ管理ガむドInterSystems
  2. Cachéむンストヌルガむド。 Cachéセキュリティの準備むンタヌシステムズ
  3. Cachéシステム管理ガむドInterSystems
  4. Cachéの玹介。 Cachéセキュリティむンタヌシステムズ
  5. PCIDSS.RU。 芁件ずセキュリティ監査手順。 バヌゞョン3.2



All Articles