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 (всего исправлений: 1)

разложить буквы в разных местах разным способом и лениво конкатенировать единожды перед первой отправкой.

deep-purple ★★★★★
()

Научите

Дурака учить - только портить.

anonymous
()
Ответ на: комментарий от pathfinder

нет, давай будем последовательны и подождем другого треда.

deep-purple ★★★★★
()

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

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

а ты как хотел? кнопку «сделать хорошо»? с таким подходом не брался бы вовсе.

deep-purple ★★★★★
()

Переменная окружения или запрос пароля в интерактивном режиме. Всё зависит от того, как запускаешь приложение.

Deleted
()

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

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

не понял ничего) ибо не погромист.

gnu_linux
() автор топика
Ответ на: комментарий от 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
()

Используй какое-нибудь хранилище для паролей, Vault например. Сборку тела письма я бы передал используя https://golang.org/src/strings/builder.go, так не очень выглядит :)

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

Всё, други, спасиб. Что-то проясняется. Пошёл ковырять.

gnu_linux
() автор топика

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

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

Да никто не будет твой пароль из бинарника выковыривать - проще его по сети подслушать. Как от этого будешь защищаться?

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

Попробуй пакеры типа UPX попробовать, пока крайней мере 99% всех отрежете, а так да только ssl smtp и сторонние хранилище для пароля

pinachet ★★★★★
()

Раз уж тред уже скатился в петросянщину, предлагаю закодировать пароль в base64 и поксорить.

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

Конфиг ясен пень, выставляешь 400 и никто кроме нужного юзера, от которого скрипт и должен запускаться, его не прочитает и не модифицирует.

WitcherGeralt ★★
()

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

 PASS=secret go run main.go
    pass := os.Getenv("PASS")
    if pass == "" {
        log.Fatal("no password given through PASS environment variable")
    }
anonymous
()
Ответ на: комментарий от dnb

Йеэнвэ всё равно лучше, чем аргумент.

anonymous
()
Ответ на: комментарий от dnb

А пробел – да – нормальная тема.

anonymous
()

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

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

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

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

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

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

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

Переменная окружения

Вот я бы сейчас плюсанул, но такой функции все еще нет. Поэтому пришлось писать этот ненужный коммент.

Nervous ★★★★★
()
Ответ на: комментарий от dnb

Есть же, кейринги, ваулты всякие — нет, надо по старинке пароль в параметры пихать.

cocucka ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.