Dice game for two players (Nea)
Starting off, its not secure the way you are prompting for passwords and storing them. Instead, use the getpass module, and store the hash of the password. I'm not even certain that this way is 100% correct (I'm not a security guru), but its what the Python documentation shows for secure password hashing, and I imagine its better than plaintext.

from getpass import getpass
from hashlib import pbkdf2_hmac as pwhash

def login(users):
    username = input('please enter username: ')
    if not username in users:
        print("access denied")
        exit()

    password_hash = None
    while password_hash != users[username]:
        password_hash = pwhash("sha256", getpass().encode("ascii"), b"t4h20p8g24j", 100000)

    print("access granted")
    return username


Your roll function had a typo in it-  the third (optional) roll could only generate numbers [1, 5] inclusive. I also reordered the statements to remove an intermediate variable that didn't contribute anything.

def roll():
    die1 = random.randint(1, 7)
    die2 = random.randint(1, 7)
    points = die1 + die2
    points += 10 if (die1 + die2) % 2 == 0 else -5
    if die1 == die2:
        points += random.randint(1, 7)
    return points


I would replace your get_leaderboard body with a shorter and cleaner read call.

def get_leaderboard():
    with open('Leaderboard.txt', 'r+') as g:
        return g.read().split("\n")


And similarly for save_leaderboard

def save_leaderboard(leaderboard):
    with open('Leaderboard.txt', 'r+') as h:
        h.write("\n".join(leaderboard))


You should also try to avoid excessive use of tuples when you need to access the elements individually. Your code will be littered with thingy[0] and thingy[1] and nobody but you (if that) will know what the significance of 0 and 1 are. I revised update_leaderboard with these changes, but I'm still not quite satisfied with it.

def update_leaderboard(leaderboard, winner):
    winner_score, winner_name = winner
    for idx, item in enumerate(leaderboard):
        item_score, item_name = item.split(', ')
        if item.name == winner_name and int(item_score) &lt; int(winner_score):
            leaderboard[idx] = '{}, {}'.format(winner_score, winner_name)
    leaderboard.sort(reverse=True)
    #leaderboard.sort(reverse=True), key=lambda x:int(x.split(', ')[0]))


The data really shouldn't be cast back and forth from strings to lists/tuples so much. It would be best to just make a dictionary of name:score pairs, and write a tiny bit of formatting logic into your get_leaderboard and save_leaderboard functions. I wasn't going to change that much though. 

I also want to point out common mistake that could normally create a bug in sorting (in your case it does not because of the hard-coded ,, but still)-  you can't rely on str.sort to sort a list of strings by their numerical value. I left a comment showing how you would do this correctly if your delimiter evaluated as greater than "0".

Furthermore- you shouldn't really rely on changing leaderboard outside the function scope. I feel like this is partially why you chose to go with the (unnecessary) enumeration() logic. Instead, return the modified leaderboard and allow the caller to take it from there.

Anyways, the last major change I would make would be to move all your globals (and friends) inside your main() function.

def main():
    print("")
    print("welcome to the dice game")
    print("")

    with open('users.pickle', 'rb') as f:
        users = pickle.load(f)

    print(users)
    print("  ")

    user1 = login(users)
    user2 = login(users)
    ...