Commit c8ca2655 authored by Yakubov, Sergey's avatar Yakubov, Sergey
Browse files

Merge branch '5-create-run-as-user-tool' into 'main'

Resolve "create run as user tool"

Closes #5

See merge request !6
parents 90085df0 f63ca786
Loading
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -3,22 +3,28 @@ project(oidc-pam LANGUAGES C)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

find_package(PAM REQUIRED)
find_package(CURL REQUIRED)
find_package(OpenSSL REQUIRED)

include_directories (
   ${PAM_INCLUDE_DIR}
   ${PAM_INCLUDE_DIR}  ${OPENSSL_INCLUDE_DIR}
)

add_library(oidc-pam SHARED oidc-pam.c config.c cjwt/cJSON.c auth.c log.c cjwt/base64.c cjwt/cjwt.c cjwt/jws_evp_openssl.c cjwt/print.c cjwt/utils.c)
add_library(oidc-helpers STATIC config.c cjwt/cJSON.c auth.c log.c cjwt/base64.c cjwt/cjwt.c cjwt/jws_evp_openssl.c cjwt/print.c cjwt/utils.c)
target_link_libraries(oidc-helpers ${PAM_LIBRARIES} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES}  ${OPENSSL_CRYPTO_LIBRARY})


add_library(oidc-pam SHARED oidc-pam.c )
set_target_properties(oidc-pam PROPERTIES PREFIX "")

target_link_libraries(oidc-pam ${PAM_LIBRARIES} ${CURL_LIBRARIES} ssl crypto)
target_link_libraries(oidc-pam oidc-helpers)

install(TARGETS oidc-pam DESTINATION /usr/lib/security)


SET(CPACK_GENERATOR "DEB;RPM")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "ORNL")
SET(CPACK_RPM_PACKAGE_MAINTAINER "ORNL")
@@ -32,5 +38,12 @@ set(CPACK_RPM_PACKAGE_DEPENDS "curl")

INCLUDE(CPack)

add_executable(oidc-pam-main main.c config.c  cjwt/cJSON.c auth.c log.c cjwt/base64.c cjwt/cjwt.c cjwt/jws_evp_openssl.c cjwt/print.c cjwt/utils.c)
target_link_libraries(oidc-pam-main ${PAM_LIBRARIES} ${CURL_LIBRARIES} ssl crypto)
add_executable(oidc-pam-main main.c )
target_link_libraries(oidc-pam-main oidc-helpers)


add_executable(oidc-run-as-user run_as_user.c )
target_link_libraries(oidc-run-as-user oidc-helpers)
install(TARGETS oidc-run-as-user RUNTIME DESTINATION /usr/local/bin
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
        GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE SETUID)
+47 −0
Original line number Diff line number Diff line
#include "config.h"
#include <stdio.h>
#include <string.h>

#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>

#include "auth.h"

int main(int argc, char *argv[]) {
    if (argc != 4) {
        printf("usage: %s <config_file> <OIDC token> <command>\n", argv[0]);
        exit(1);
    }
    int res = parse_config(argv[1], &config);
    if (res != 0) {
        printf("cannot parse config file\n");
        exit(1);
    }

    oidc_token_content_t token_info;
    res = verify_token(argv[2], &token_info);
    cJSON_Delete(config.parsed_object);
    if (res != 0) {
        printf("cannot verify token\n");
        exit(1);
    }
    char *uname = malloc(sizeof(char) * 4);
    strncpy(uname, token_info.user, 3);
    uname[3] = 0;
    struct passwd *pwd = getpwnam(uname);
    if (pwd == NULL) {
        printf("Cannot find UID for name %s\n", uname);
        free(uname);
        exit(1);
    }
    free(token_info.user);
    free(uname);
    res = setuid(pwd->pw_uid);
    if (res != 0) {
        printf("cannot set uid\n");
        exit(1);
    }
    printf("Executing command \"%s\" as %s(%d)\n", argv[3], uname, pwd->pw_uid);
    return system(argv[3]);
}