SAP ABAP REST: Login Data aus SM59 verwenden

Getting started ... Alles für einen gelungenen Start.
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von sap_koun (ForumUser / 29 / 24 / 0 ) »
Hi,
ich habe ein Z-Programm geschrieben, welches verschiedene URL-Endpoints aufruft (GET & POST-Requests) macht an ein externes System.

Username und Passwort war bisher im Klartext im Code gespeichert. Das ist unsicher, daher will ich nun einen anderen Weg gehen.

Diese Logindaten sind in der SM59 hinterlegt und mittels "create_by_destination" kann ich auch Host/Port/Präfix. hinterlegen.

Aber mir gelingt es nicht, die hinterlegten Logindaten zu nutzen.
Hat jemand eine Idee, wie man die Daten verwenden kann?
Gibt es weitere Möglichkeiten, es sicherer zu machen? (Mir fällt z.B. ein, dass man die Rechte auf der Seite des externen Systems für den User einschränken könnte, oder die Login-Seite komplett "disabled").


Hier der Code zum ausprobieren:

Code: Alles auswählen.

DATA: o_client          TYPE REF TO if_http_client,
      lv_http_status    TYPE i,
      lv_status_text    TYPE string,
      response_content  TYPE string,
      lv_uri            TYPE string.

TRY.

    " Create HTTP client based on destination
    CALL METHOD cl_http_client=>create_by_destination
      EXPORTING
        destination = 'TEST_DESTINATION'
      IMPORTING
        client      = o_client
      EXCEPTIONS
        argument_not_found = 1
        plugin_not_active  = 2
        internal_error     = 3
        others             = 4.

    IF sy-subrc <> 0.
      o_client->close( ).
      RETURN. " Exit if there's an error
    ENDIF.

    " Setting specific path or adding parameters to the URL
    lv_uri = '/this/could/be/your/endpoint'.
    o_client->propertytype_logon_popup = abap_false.
    o_client->request->set_header_field( name = '~request_uri' value = lv_uri ).

    " Make a GET request
    o_client->request->set_method( if_http_request=>co_request_method_get ).
    o_client->send( timeout = if_http_client=>co_timeout_default ).
    o_client->receive( ).

    " Get the HTTP status and response content
    o_client->response->get_status( IMPORTING
                                      code   = lv_http_status
                                      reason = lv_status_text ).

    response_content = o_client->response->get_cdata( ).

    " Displaying the response code and content for debugging
    WRITE: / 'HTTP Status:', lv_http_status.
    WRITE: / 'Response:', response_content.

CATCH cx_root INTO DATA(lx_error).
    " Handle exception
    WRITE: / lx_error->get_text( ).
ENDTRY. 

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von a-dead-trousers (Top Expert / 4383 / 222 / 1176 ) »
Das ist ja geanu die Sache, warum die SAP Passwörter im SecStore ablegt:
Damit eben nicht jeder darauf zugreifen kann.

Grundsätzlich sind nur bestimmte SAP Programme per Name erlaubt dort überhaupt Daten abzulegen. Deswegen lässt sich das auch nicht (so ohne weiteres) für Kundenimplementierungen nutzen. Die Daten selbst werden verschlüsselt abgelegt und zusätzlich noch mit eigenen Zugriffberechtigungen versehen. Da könnte z.B. ein Programm A einem anderen Prgramm B erlauben auf abgelegte Passwörter von A (lesend) zuzugreifen. Das passiert auch für einige Programme (z.B. Testreports SECSTORE01 und SECSTORE02 die sich gegenseitig berechtigen). Das heißt also, um Passwörter in Kundenprogrammen abfragen zu können, muss entweder das Programm, welches das Passwort abgelegt hat, eine derartige Funktion anbieten oder man "erschleicht" sich diese Möglichkeit 😱

Zumindest für die Logischen Ports von Webservices hätte ich eine "Umgehungslösung" anzubieten, die eine interne Schnittstelle "ausnutzt". Bei RFC Destination kann ich jetzt auf die schnelle leider nichts finden.

Dreh und Angelpunkt für RFC wären die Klasse CL_DEST_UTILITY_PWD und die Funktionsgruppe CRFC. Auch diese beiden sind so konfiguriert, dass sie sich gegenseitig berechtigen (siehe Methode CL_DEST_UTILITY_PWD=>INIT_ACL_TABLE). Leider finde den Aufruf von SECSTORE_READ_ITEM, der für das Auslesen benötigt wird, weder in CL_DEST_UTILITY_PWD noch in CRFC. Somit schaut es nicht so aus als ob man da was "ausnutzen" könnte.

IMHO bleibt dir nur die Möglichkeit das Passwort selbst zu verschlüsseln und dann in einer eigenen Tabelle abzulegen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von a-dead-trousers (Top Expert / 4383 / 222 / 1176 ) »
Ich hab mir die CL_HTTP_CLIENT mal genauer angeschaut:
In der Methode AUTHENTICATION wird der Fall für ein verschlüsselt abgelegtes Passwort ziemlich anschaulich durchexerziert. Sofern das in deinem Fall (ext. HTTP-Verbindung) nicht durchlaufen wird, solltest du dir dieses Coding zu nutze machen können.

Das Feld "sap-icf-authorization" im Header ist mit |{ Username }:/RFC/{ RFC_Destination }| zu versorgen und dann müsste es klappen.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
sap_koun

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von sap_koun (ForumUser / 29 / 24 / 0 ) »
Hi a-dead-trousers,

vielen Dank für deine Antwort. Mir ist es gelungen die in der SM59 hinterlegten Daten zu verwenden...

Ich werde deinen Vorschlag weiter inspizieren, ausprobieren und schauen was der SecStore von SAP so hergibt.

Danke.

Grüße

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von ewx (Top Expert / 4838 / 309 / 637 ) »
sap_koun hat geschrieben:
10.08.2023 16:40
Mir ist es gelungen die in der SM59 hinterlegten Daten zu verwenden...
Wie hast du das gemacht?

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von a-dead-trousers (Top Expert / 4383 / 222 / 1176 ) »
Ich vermute er verwendet "sap-icf-authorization".
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von IHe (Specialist / 150 / 35 / 49 ) »
Vielleicht ist das Thema auch zu kompliziert angegangen worden. Wenn ich zu einem Webservice eine RFC-Destination vom Typ G (HTTP-Verbindung zu externen Servern) anlege und dort User/Passwort hinterlege, dann muss der Webservice nur Basic Authentification unterstützen - das ist ja keine SAP-Erfindung, sondern HTTP-Standard. Wenn dem so ist muss überhaupt nichts extra programmiert werden und die Anmeldung funktioniert anhand der in der RFC-Destination hinterlegten Daten automatisch.

Folgende Benutzer bedankten sich beim Autor IHe für den Beitrag:
a-dead-trousers

Ingo Hoffmann

ECC|S/4HANA|BTP
dbh SAP Solutions

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von cb1000r (ForumUser / 3 / 1 / 0 ) »
a-dead-trousers hat geschrieben:
07.08.2023 18:54
...
Zumindest für die Logischen Ports von Webservices hätte ich eine "Umgehungslösung" anzubieten, die eine interne Schnittstelle "ausnutzt". Bei RFC Destination kann ich jetzt auf die schnelle leider nichts finden.
...
Hallo,
spannendes Thema. Suche auch gerade nach einer Möglichkeit, die Anmeldedaten aus dem logischen Port zu verwenden, da der SOAP Service eine Login-Operation zur Verfügung stellt.
Könntest du mal posten, wie deine Umgehungslösung aussieht?
Danke und viele Grüße

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von a-dead-trousers (Top Expert / 4383 / 222 / 1176 ) »
Hi.
Im Grunde mache ich mir nur den Umstand zu Nutze, dass die Proxy-Einstellungen im logischen Port nur dann verwendet werden, wenn man einen Host einträgt. Ohne eine Zieladresse bleiben die Felder für Benutzer und Passwort "ungenutzt". Also habe ich dort einfach meine Daten abgelegt und verwende dann folgendes Coding um sie wieder auszulesen

Code: Alles auswählen.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_SRT_LOGICAL_PORT=>SELECT
* +-------------------------------------------------------------------------------------------------+
* | [--->] ID_PROXYCLASS                  TYPE        SRT_LP_PROXYCLASS
* | [--->] ID_LP_NAME                     TYPE        SRT_LP_NAME(optional)
* | [--->] ID_PROPERTIES                  TYPE        ABAP_BOOL (default =ABAP_TRUE)
* | [--->] ID_OPERATIONS                  TYPE        ABAP_BOOL (default =ABAP_TRUE)
* | [<-()] RS_DATA                        TYPE        ZS_SRT_LOGICAL_PORT_DATA
* | [!CX!] CX_STATIC_CHECK
* | [!CX!] CX_DYNAMIC_CHECK
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD select.

    DATA:
      ld_proxyclass   TYPE srt_lp_proxyclass,
      lr_dt_query     TYPE REF TO if_srt_wsp_dt_config_query,
      lr_registry     TYPE REF TO if_srt_wsp_config_registry,
      lt_config       TYPE srt_wsp_config_lp_list,
      lr_config       TYPE REF TO if_srt_wsp_config_rt,
      lt_binding      TYPE srt_if_srt_wsp_subject_bndgs,
      lt_operation    TYPE srt_if_srt_wsp_subject_bndgops,
      lr_propertylist TYPE REF TO if_srt_wsp_property_list,
      lt_property     TYPE srt_if_srt_wsp_properties.

    FIELD-SYMBOLS:
      <ls_config>   TYPE srt_wsp_config_lp,
      <lr_property> TYPE REF TO if_srt_wsp_property.

    CLEAR rs_data.

    lr_dt_query = cl_srt_wsp_dt_config_data=>open_dt_query_if( ).
    lr_registry = cl_srt_wsp_factory=>create_registry( ).

    IF lr_dt_query->is_stcm( i_name = id_proxyclass ) EQ abap_true.
      ld_proxyclass  = lr_dt_query->get_source_proxy_for_stcm( i_stcm_name = id_proxyclass ).
      lt_config = lr_registry->list_stcm_client_cfgs_with_lps( i_source_proxy_name = ld_proxyclass
                                                               i_lp_name           = id_lp_name ).
    ELSE.
      lt_config = lr_registry->list_client_configs_with_lp( pi_proxy_class_name = id_proxyclass
                                                            pi_lp_name          = id_lp_name ).
    ENDIF.

    IF id_lp_name IS INITIAL.
      READ TABLE lt_config ASSIGNING <ls_config> WITH KEY is_default = abap_true.
    ELSE.
      READ TABLE lt_config ASSIGNING <ls_config> INDEX 1.
    ENDIF.
    IF sy-subrc EQ 0.
      lr_config = lr_registry->open_config_rt( name        = <ls_config>-config_name
                                               type        = tsrtp_c_conf_type_cl_rt
                                               dt_obj_name = id_proxyclass ).

      IF lr_config IS BOUND.
        lt_binding = lr_config->get_bindings( ).

        READ TABLE lt_binding ASSIGNING FIELD-SYMBOL(<lr_binding>) INDEX 1.
        IF sy-subrc EQ 0.
          IF id_properties EQ abap_true.
            lr_propertylist = <lr_binding>->get_selected_property_list( ).

            IF lr_propertylist IS NOT BOUND.
              lr_propertylist = <lr_binding>->create_property_list( ).
            ENDIF.

* get properties
            lt_property = lr_propertylist->get_properties( ).
            LOOP AT lt_property ASSIGNING <lr_property>.
              APPEND VALUE #( name  = <lr_property>->name
                              value = <lr_property>->value ) TO rs_data-properties.
            ENDLOOP.

            CLEAR lt_property.
            CLEAR lr_propertylist.
          ENDIF.

          IF id_operations EQ abap_true.
            lt_operation = <lr_binding>->get_operations( ).
            LOOP AT lt_operation ASSIGNING FIELD-SYMBOL(<lr_operation>).
              APPEND VALUE #( name = <lr_operation>->name ) TO rs_data-operations ASSIGNING FIELD-SYMBOL(<ls_operation>).

              lr_propertylist = <lr_operation>->get_selected_property_list( ).

              IF lr_propertylist IS NOT BOUND.
                lr_propertylist = <lr_operation>->create_property_list( ).
              ENDIF.

* get properties
              lt_property = lr_propertylist->get_properties( ).
              LOOP AT lt_property ASSIGNING <lr_property>.
                APPEND VALUE #( name  = <lr_property>->name
                                value = <lr_property>->value ) TO <ls_operation>-properties.
              ENDLOOP.

              CLEAR lt_property.
              CLEAR lr_propertylist.
            ENDLOOP.

            CLEAR lt_operation.
          ENDIF.
        ENDIF.

        CLEAR lt_binding.

        rs_data-description = lr_config->description.

        lr_config->terminate( ).
        CLEAR lr_config.
      ENDIF.
    ENDIF.

    CLEAR lt_config.
    CLEAR lr_registry.
    CLEAR lr_dt_query.

  ENDMETHOD.
Ursprünglich stammt das Coding aus CL_SRT_PUBLIC_LOGICAL_PORT=>CONSTRUCTOR, GET_PROPERTIES und GET_OPERATIONS. Dort wird aber die Rückgabe von Passwörtern verhindert, daher war ich gezwungen, das Coding zu kopieren.

Benutzer und Passwort stehen in den Properties tsrtp_f_bdg_proxy_user und tsrtp_f_bdg_proxy_passwd.

Code: Alles auswählen.

    READ TABLE ls_data-properties ASSIGNING <ls_property>
      WITH KEY name-name = tsrtp_f_bdg_proxy_user.
    IF sy-subrc EQ 0.
      ld_username = <ls_property>-value.
    ENDIF.

    READ TABLE ls_data-properties ASSIGNING <ls_property>
      WITH KEY name-name = tsrtp_f_bdg_proxy_passwd.
    IF sy-subrc EQ 0.
      ld_password = <ls_property>-value.
    ENDIF.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
cb1000r

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von cb1000r (ForumUser / 3 / 1 / 0 ) »
Hallo,
danke für das Coding. Habe es gerade mal bei uns probiert, allerdings funktioniert das nicht. Entweder mache ich was falsch oder SAP hat hier "nachgeschärft".
Du lässt also das Feld "Name des Proxy-Rechners" leer und hinterlegst trotzdem Benutzer und Kennwort, richtig?
LP config.png
Bei uns funktioniert das leider nicht. Bei der property "ProxyPassword" erhalte ich eine ID, die auf SRT_SECSTORE_LNK-SRT_ID zeigt. Die wiederum enthält die SEC_STORE_ID. Da komme ich allerdings nicht weiter, da sich der secstore (in Kundenprogrammen) nicht auslesen lässt.

Auf welchem Basis-Release seid ihr unterwegs?

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von a-dead-trousers (Top Expert / 4383 / 222 / 1176 ) »
Basis 7.50
Vermutlich hat die SAP hier eine "Schwachstelle" behoben. Wie schaut das Coding in CL_SRT_PUBLIC_LOGICAL_PORT=>GET_PROPERTIES bei dir aus?
Im Grund müsstest du dem Aufruf von CREATE_PROPERTY_LIST bzw. GET_SELECTED_PROPERTY_LIST nachgehen um zu prüfen ob sich diese Einschränkung auf verschlüsselte Properties in deinem Release tiefer verlagert hat. Irgendwo MUSS die SAP Basis die Passwörter aus dem SecStore lesen, sonst würde der Aufruf nicht funktionieren.
Die Klasse die für den SecStore-Zugriff aus dem SOAP Umfeld im Kernel berechtigt ist, lautet CL_SRT_WSP_SECSTORE (zumindest in 7.50). Vielleicht kommst du ja mittels Debugging von READ_STORE bzw. WRITE_STORE weiter.

lg ADT

EDIT:
Noch eine kleine Info am Rande. Beim Aufruf des Funktionsbausteins SECSTORE_INSERT_ITEM können im Parameter REPACLIST weitere Programme übergeben werden, die auf das spezifische Item zugreifen dürfen. Diese müssen aber von sich aus auch im Kernel des SecStore registriert sein. Somit kann man hier leider keine Kundenprogramme "einschleusen". Man kann damit aber sehr gut einsehen, von welchen anderen Stellen aus Programme auf die Daten zugreifen dürfen. Vielleicht hilft das ja weiter. Wobei ich aber befürchte, dass der Kernel IMMER zugreifen darf. Wenn die SAP die "Schwachstelle" also derart gelöst hat, dass sie keine Möglichkeit mehr vorsieht, dass ABAP Programm die Daten lesen können und die eigene Applikation (SOAMANAGER) keinen Lesezugriff mehr vorsieht wird meine Lösung in höheren Releases nicht (mehr) funktionieren. Einzige Hoffnung wäre, wenn beim "Kopieren" von Logischen Ports in deinem Release die Passwörter mitkopiert werden, dann muss es irgendwo einen Lesezugriff geben. Wenn nicht schaut es leider düster aus.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von cb1000r (ForumUser / 3 / 1 / 0 ) »
Hallo,
bin bisher nicht dazu gekommen, das nochmal zu prüfen. Bei deinem Coding kommt der Aufruf zum Lesen des Kennworts eigentlich aus der CL_SRT_WSP_CONFIG_RTC_ROOT=>CONVERT_CFG_TAB_2_CTX_TAB.

Hier mal ein Vergleich zwischen Release 7.52 und 7.57.
2024-07-09 08_11_37-Class Builder_ Klasse CL_SRT_WSP_CONFIG_RTC_ROOT anzeigen.png
- Punkt 1 macht das Debugging schwierig (ich wusste nicht einmal, dass es ein solches Statement gibt :)).
- Punkt 2 zeigt, dass der secstore->get_data( ) Aufruf im Release 7.57 die Daten nicht mehr in die Properties übernimmt, sondern es bleibt bei der SRT_SECSTORE_LNK-ID oder falls im secstore nichts gefunden wurde, wird auch diese Link-ID verworfen.

Es bleiben aber dennoch diverse Möglichkeiten, die Kennwörter (zumindest im Debugger) auszulesen. Ich befürchte, dass SAP hier perspektivisch immer weitere Lücken schließen wird bzw. im ABAP-Stack die Kennwörter "verschleiert" (in unserem Release z. Bsp. über die Klasse CL_A4C_CRYPT_UTIL).

Ob man das jemals so abgesichert bekommt, dass die Kennwörter für den Kunden gar nicht mehr lesbar sind, weiß ich nicht. Dennoch wird es komplizierter und ich kann nur hoffen, dass SAP im Umkehrschluss für den Kunden eine sinnvolle Möglichkeit zur Verfügung stellt, um Kennwörter halbwegs sicher abzulegen und programmatisch nutzbar zu machen.

Vor 15 Jahren haben wir sowas noch im Klartext in eine Z-Tabelle geschrieben. Mittlerweile gibt es bessere Möglichkeiten und man kann sie nicht (sinnvoll) nutzen. Das "schmerzt" vor dem Hintergrund der Digitalisierung und der immer stärkeren Vernetzung der Systeme schon ein wenig...

Re: SAP ABAP REST: Login Data aus SM59 verwenden

Beitrag von a-dead-trousers (Top Expert / 4383 / 222 / 1176 ) »
Bei mir schaut es genauso aus wie auf deinem Screenshot unter 7.52.
Ich finde die Befehlserweiterung spannend: "Kein Debuggen erlaubt".
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

3
Antw.
1663
Views
SAP ABAP Rest aufruf: http communication failure?
von sap_koun » 29.12.2022 01:03 • Verfasst in ABAP® für Anfänger
3
Antw.
3005
Views
multipart/form-data aus Abap versenden
von abap_magnet » 26.08.2009 17:08 • Verfasst in ABAP® für Anfänger
4
Antw.
2783
Views
Icons in ABAP hochladen und verwenden
von Zubasa » 03.06.2011 21:58 • Verfasst in ABAP® für Anfänger
5
Antw.
921
Views
IDOC Verbindung SM59
von L0w-RiDer » 18.05.2021 10:01 • Verfasst in ABAP® für Anfänger
5
Antw.
6657
Views
MiniSAP Trialversion ADOBE SFP ADS SM59 Connection
von Unit605 » 30.08.2013 18:29 • Verfasst in SAP - Allgemeines

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.