LINUX.ORG.RU

go, hide pass

 ,


0

2

Друзья, есть некий код на go, который нужен для эмейл уведомлений.

package main

import (
	"log"
	"os"
	"net/smtp"
)

func main() {
	send(os.Args[1] + "\n" + os.Args[2] + "\n" + os.Args[3])
}

func send(body string) {
	from := "from email"
	pass := "**********"
	to   := "to email"

	msg  :=  "From: " + from + "\n" +
		 "To: " + to + "\n" +
		 "Subject: Письмо с сайта\n\n" + body

	err  :=  smtp.SendMail("smtp.yandex.ru:25",
		 smtp.PlainAuth("", from, pass, "smtp.yandex.ru"),
		 from, []string{to}, []byte(msg))

	if err != nil {
		log.Printf("smtp error: %s", err)
		return
	}
}
После сборки (go build code.go) получаю бинарник. Задачу свою вроде как выполняет. Но тут натравил на этот бинарник strings и вижу там пароль от почты) Как посекьюрней сделать? Научите.

Хех, я то думал, что в компилируемых языках, в отличии от скриптов, с этим проще. Просто первый раз сталкиваюсь с такой байдой. Ладно, отбой, буду думать.

gnu_linux ()

А вообще - конфиг выносить пора. А то пересобирать приложение на изменение почты - на Golang быстро, конечно, но не нужно так делать.

Deleted ()
Ответ на: комментарий от gnu_linux

Попробуй хотя бы начать с переменных окружения (environment variables).

Так, к примеру, поступает Neo4j в своём клиенте для базы данных: https://neo4j.com/developer/kb/how-do-i-authenticate-with-cypher-shell-without-specifying-the-username-and-password-on-the-command-line/

Например, читаешь переменные окружения MYCOOLAPP_TARGET_EMAIL и MYCOOLAPP_TARGET_PASSWORD и работаешь с ними. Как передать их снаружи - сам разберешься, за тебя это никто делать не будет.

Deleted ()

В общем пока воспользовался msmtp с passwordeval через gpg. Но вопрос остаётся открытым. С переменными окружения пароли не спрятать толком. Хотелось бы всё таки понять как в бинарнике сделать пароль нечитаемым.

gnu_linux ()

ПлэйАух замени на СтартТЛС. А пароль бери из переменной окружения. Если сервер поддерживает ТЛС, то используй этот порт и ТЛС, вместо СтартТЛС.

 PASS=secret go run main.go
    pass := os.Getenv("PASS")
    if pass == "" {
        log.Fatal("no password given through PASS environment variable")
    }
anonymous ()

Проблема пароля, похоже, имеет ровно одно софтварёное решение:

[robot@management.server]$ decrypt <$service.secrets | ssh $server $yourprogram --read-password-from-stdin

Так у тебя остаётся ровно 1 место хранения секретов(+бэкапы), которое можно кое-как проконтроллировать. Уведя хост всё ещё можно добыть секрет, но нужно как-то убедить «менеджера» его отдать, что можно усложнить настолько, насколько хочется.

Остальные просто заменяют проблему секрета проблемой эквивалентного «секрета для онлайновой добычи секрета», с очень неочевидным выигрышем. Лучшие обеспечивают одноразовость первого, что не вредно, но тоже не очень ограничивает взломщика.

DonkeyHot ★★★★★ ()
Последнее исправление: DonkeyHot (всего исправлений: 1)

в сырцах паролей логинов быть не должно. все это нужно задавать через переменные окружения (простой вариант) или конфигурационные файлы (сложнее)

quester ★★ ()