Run container as unprivileged for enhanced security
On the Android side this requires no change with the current setup.
This commit is contained in:
parent
128cc2422d
commit
7a2cef31da
4 changed files with 47 additions and 6 deletions
|
|
@ -35,7 +35,8 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
namespace anbox {
|
namespace anbox {
|
||||||
namespace container {
|
namespace container {
|
||||||
LxcContainer::LxcContainer() : state_(State::inactive), container_(nullptr) {
|
LxcContainer::LxcContainer(const network::Credentials &creds)
|
||||||
|
: state_(State::inactive), container_(nullptr), creds_(creds) {
|
||||||
utils::ensure_paths({
|
utils::ensure_paths({
|
||||||
config::container_config_path(), config::log_path(),
|
config::container_config_path(), config::log_path(),
|
||||||
});
|
});
|
||||||
|
|
@ -49,6 +50,32 @@ LxcContainer::~LxcContainer() {
|
||||||
if (container_) lxc_container_put(container_);
|
if (container_) lxc_container_put(container_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LxcContainer::setup_id_maps() {
|
||||||
|
const auto base_id = 100000;
|
||||||
|
const auto max_id = 65536;
|
||||||
|
set_config_item("lxc.id_map",
|
||||||
|
utils::string_format("u 0 %d %d", base_id, creds_.uid() - 1));
|
||||||
|
set_config_item("lxc.id_map",
|
||||||
|
utils::string_format("g 0 %d %d", base_id, creds_.gid() - 1));
|
||||||
|
|
||||||
|
// We need to bind the user id for the one running the client side
|
||||||
|
// process as he is the owner of various socket files we bind mount
|
||||||
|
// into the container.
|
||||||
|
set_config_item("lxc.id_map",
|
||||||
|
utils::string_format("u %d %d 1", creds_.uid(), creds_.uid()));
|
||||||
|
set_config_item("lxc.id_map",
|
||||||
|
utils::string_format("g %d %d 1", creds_.gid(), creds_.gid()));
|
||||||
|
|
||||||
|
set_config_item("lxc.id_map",
|
||||||
|
utils::string_format("u %d %d %d", creds_.uid() + 1,
|
||||||
|
base_id + creds_.uid() + 1,
|
||||||
|
max_id - creds_.uid() - 1));
|
||||||
|
set_config_item("lxc.id_map",
|
||||||
|
utils::string_format("g %d %d %d", creds_.uid() + 1,
|
||||||
|
base_id + creds_.gid() + 1,
|
||||||
|
max_id - creds_.gid() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
void LxcContainer::start(const Configuration &configuration) {
|
void LxcContainer::start(const Configuration &configuration) {
|
||||||
if (getuid() != 0)
|
if (getuid() != 0)
|
||||||
BOOST_THROW_EXCEPTION(
|
BOOST_THROW_EXCEPTION(
|
||||||
|
|
@ -128,7 +155,20 @@ void LxcContainer::start(const Configuration &configuration) {
|
||||||
set_config_item("lxc.aa_profile", "unconfined");
|
set_config_item("lxc.aa_profile", "unconfined");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (const auto &bind_mount : configuration.bind_mounts) {
|
setup_id_maps();
|
||||||
|
|
||||||
|
auto bind_mounts = configuration.bind_mounts;
|
||||||
|
|
||||||
|
// Extra bind-mounts for user-namespace setup
|
||||||
|
bind_mounts.insert({"/dev/console", "dev/console"});
|
||||||
|
bind_mounts.insert({"/dev/full", "dev/full"});
|
||||||
|
bind_mounts.insert({"/dev/null", "dev/null"});
|
||||||
|
bind_mounts.insert({"/dev/random", "dev/random"});
|
||||||
|
bind_mounts.insert({"/dev/tty", "dev/tty"});
|
||||||
|
bind_mounts.insert({"/dev/urandom", "dev/urandom"});
|
||||||
|
bind_mounts.insert({"/dev/zero", "dev/zero"});
|
||||||
|
|
||||||
|
for (const auto &bind_mount : bind_mounts) {
|
||||||
std::string create_type = "file";
|
std::string create_type = "file";
|
||||||
|
|
||||||
if (fs::is_directory(bind_mount.first)) create_type = "dir";
|
if (fs::is_directory(bind_mount.first)) create_type = "dir";
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
#define ANBOX_CONTAINER_LXC_CONTAINER_H_
|
#define ANBOX_CONTAINER_LXC_CONTAINER_H_
|
||||||
|
|
||||||
#include "anbox/container/container.h"
|
#include "anbox/container/container.h"
|
||||||
|
#include "anbox/network/credentials.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
@ -28,7 +29,7 @@ namespace anbox {
|
||||||
namespace container {
|
namespace container {
|
||||||
class LxcContainer : public Container {
|
class LxcContainer : public Container {
|
||||||
public:
|
public:
|
||||||
LxcContainer();
|
LxcContainer(const network::Credentials &creds);
|
||||||
~LxcContainer();
|
~LxcContainer();
|
||||||
|
|
||||||
void start(const Configuration &configuration) override;
|
void start(const Configuration &configuration) override;
|
||||||
|
|
@ -37,9 +38,11 @@ class LxcContainer : public Container {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void set_config_item(const std::string &key, const std::string &value);
|
void set_config_item(const std::string &key, const std::string &value);
|
||||||
|
void setup_id_maps();
|
||||||
|
|
||||||
State state_;
|
State state_;
|
||||||
lxc_container *container_;
|
lxc_container *container_;
|
||||||
|
network::Credentials creds_;
|
||||||
};
|
};
|
||||||
} // namespace container
|
} // namespace container
|
||||||
} // namespace anbox
|
} // namespace anbox
|
||||||
|
|
|
||||||
|
|
@ -59,8 +59,6 @@ void ManagementApiSkeleton::start_container(
|
||||||
utils::string_format("Failed to start container: %s", err.what()));
|
utils::string_format("Failed to start container: %s", err.what()));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG("");
|
|
||||||
|
|
||||||
done->Run();
|
done->Run();
|
||||||
}
|
}
|
||||||
} // namespace container
|
} // namespace container
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ void Service::new_client(
|
||||||
auto pending_calls = std::make_shared<rpc::PendingCallCache>();
|
auto pending_calls = std::make_shared<rpc::PendingCallCache>();
|
||||||
auto rpc_channel = std::make_shared<rpc::Channel>(pending_calls, messenger);
|
auto rpc_channel = std::make_shared<rpc::Channel>(pending_calls, messenger);
|
||||||
auto server = std::make_shared<container::ManagementApiSkeleton>(
|
auto server = std::make_shared<container::ManagementApiSkeleton>(
|
||||||
pending_calls, std::make_shared<LxcContainer>());
|
pending_calls, std::make_shared<LxcContainer>(messenger->creds()));
|
||||||
auto processor = std::make_shared<container::ManagementApiMessageProcessor>(
|
auto processor = std::make_shared<container::ManagementApiMessageProcessor>(
|
||||||
messenger, pending_calls, server);
|
messenger, pending_calls, server);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue