ADD_SUBDIRECTORY(specs)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(plugins)
+ADD_SUBDIRECTORY(systemd)
BuildRequires: pkgconfig(openssl)
# vist BRs
BuildRequires: pkgconfig(dlog)
-BuildRequires: pkgconfig(klay)
BuildRequires: pkgconfig(sqlite3)
BuildRequires: pkgconfig(libtzplatform-config)
Requires: glog
Requires: boost-regex boost-system boost-thread boost-filesystem
Requires: procps-ng
Requires: libsystemd
-Requires: klay
%global osquery_version 4.0.0
-DDEFAULT_ADMIN_PATH=%{_bindir}/vist-cli \
-DDB_INSTALL_DIR:PATH=%{vist_db_dir} \
-DPLUGIN_INSTALL_DIR:PATH=%{vist_plugin_dir} \
- -DSCRIPT_INSTALL_DIR:PATH=%{vist_script_dir}
+ -DSCRIPT_INSTALL_DIR:PATH=%{vist_script_dir} \
+ -DSYSTEMD_UNIT_DIR:PATH=%{_unitdir}
make %{?jobs:-j%jobs}
cp data/script/*.sql %{buildroot}/%{vist_script_dir}
+%install_service sockets.target.wants %{name}.socket
+
%clean
rm -rf %{buildroot}
+%post
+rm -f %{vist_db_dir}/.%{name}.db*
+
+systemctl daemon-reload
+if [ $1 = 1 ]; then
+ systemctl start %{name}
+elif [ $1 = 2 ]; then
+ systemctl restart %{name}
+fi
+
+systemctl start %{name}
+
%files
%manifest %{name}.manifest
%license LICENSE-Apache-2.0
%license LICENSE-MIT
%{_bindir}/vist-cli
%{_bindir}/vistd
+%{_unitdir}/vist.service
+%{_unitdir}/vist.socket
+%{_unitdir}/sockets.target.wants/vist.socket
%{vist_script_dir}/*.sql
%dir %attr(-, %{user_name}, %{group_name}) %{vist_db_dir}
%dir %attr(-, %{user_name}, %{group_name}) %{vist_plugin_dir}
%description test
Provides internal testcases for ViST implementation.
+%post test
+systemctl stop %{name}.socket
+systemctl restart %{name}.service
+
%files test
%{_bindir}/osquery-test
%{_bindir}/vist-test
database(std::make_shared<database::Connection>(path))
{
database->exec("PRAGMA foreign_keys = ON;");
+ database->transactionBegin();
database->exec(getScript(SCRIPT_CREATE_SCHEMA));
+ database->transactionEnd();
sync();
}
void PolicyStorage::define(const std::string& policy, const PolicyValue& ivalue)
{
if (this->definitions.find(policy) != this->definitions.end()) {
- INFO(VIST) << "Policy is already defined: " << policy;
+ DEBUG(VIST) << "Policy is already defined: " << policy;
return;
}
stmt.bind(1, pd.name);
stmt.bind(2, pd.ivalue);
if (!stmt.exec())
- THROW(ErrCode::RuntimeError) << "Failed to define policy: " << pd.name;
+ THROW(ErrCode::RuntimeError) << stmt.getErrorMessage();
INFO(VIST) << "Policy defined >> name: " << pd.name << ", ivalue: " << pd.ivalue;
this->definitions.emplace(pd.name, std::move(pd));
stmt.bind(1, admin.name);
stmt.bind(2, admin.activated);
if (!stmt.exec())
- THROW(ErrCode::RuntimeError) << "Failed to enroll admin: " << name;
+ THROW(ErrCode::RuntimeError) << stmt.getErrorMessage();
this->admins.emplace(admin.name, std::move(admin));
database::Statement stmt(*database, query);
stmt.bind(1, name);
if (!stmt.exec())
- THROW(ErrCode::RuntimeError) << "Failed to disenroll admin: " << name;
+ THROW(ErrCode::RuntimeError) << stmt.getErrorMessage();
/// TODO: add TC
this->syncPolicyManaged();
if (this->admins.find(admin) == this->admins.end())
THROW(ErrCode::LogicError) << "Not exist admin: " << admin;
+ DEBUG(VIST) << "Activate admin: " << admin;
std::string query = adminTable.update(&Admin::activated)
.where(expr(&Admin::name) == admin);
database::Statement stmt(*this->database, query);
stmt.bind(1, static_cast<int>(state));
stmt.bind(2, admin);
if (!stmt.exec())
- THROW(ErrCode::RuntimeError) << "Failed to activate admin: " << admin;
+ THROW(ErrCode::RuntimeError) << stmt.getErrorMessage();
this->admins[admin].activated = state;
INFO(VIST) << "Admin[" << admin << "]'s activated value is set: " << state;
stmt.bind(2, admin);
stmt.bind(3, policy);
if (!stmt.exec())
- THROW(ErrCode::RuntimeError) << "Failed to update policy:" << policy;
+ THROW(ErrCode::RuntimeError) << stmt.getErrorMessage();
/// TODO: Fix to sync without db i/o
this->syncPolicyManaged();
#include "vistd.hpp"
-#include <vist/rmi/gateway.hpp>
-#include <vist/logger.hpp>
#include <vist/exception.hpp>
+#include <vist/logger.hpp>
+#include <vist/policy/policy-manager.hpp>
+#include <vist/rmi/gateway.hpp>
#include <osquery/registry_interface.h>
#include <osquery/sql.h>
void Vistd::start()
{
INFO(VIST) << "Vistd daemon starts.";
- rmi::Gateway gateway(SOCK_ADDR);
+ policy::PolicyManager::Instance();
+
+ rmi::Gateway gateway(SOCK_ADDR);
EXPOSE(gateway, this, &Vistd::query);
gateway.start();
}
--- /dev/null
+# Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+INSTALL(FILES vist.service vist.socket
+ DESTINATION ${SYSTEMD_UNIT_DIR})
--- /dev/null
+[Unit]
+Description=Virtual Security Table service
+
+[Service]
+User=security_fw
+Group=security_fw
+SmackProcessLabel=System
+ExecStart=/bin/vistd
+ExecReload=/bin/kill -HUP $MAINPID
+Restart=on-failure
--- /dev/null
+[Unit]
+Description=Virtual Security Table socket
+
+[Socket]
+ListenStream=/tmp/.vist
+SocketMode=0777
+SmackLabelIPIn=*
+SmackLabelIPOut=@
+
+[Install]
+WantedBy=sockets.target